Appiumfw 🚀
A lightweight, POM structured test automation framework for Python + Appium, including:
📦 Project scaffolding with afw init
⟳ Test suite, test case, feature, and step generation using Jinja2 templating
▶️ Runner for executing feature (.feature), YAML suite, or .py test case files
🌐 REST API server (afw serve) to list and schedule test suites
🔗 API client module (appiumfw.api_client) for programmatic integration
⚙️ Typer-powered CLI for all commands
🛡️ Hooks/listener system, dotenv support, jinja templating
🔧 Features
afw setup — setup all mobile dependencies: node js, appium, uiAutomatior2
afw init — bootstrap a complete appiumfw project scaffold
afw create-testsuite — generate boilerplate YAML test suite & .py for its test suite hook
afw create-testsuite-collection — generate boilerplate YAML test suite collection
afw create-testcase — generate a .py test case stub
afw create-listener — generate a test listener
afw create-feature — generate a .feature file
afw implement-feature — autogenerate step definitions from your .feature
afw run — run one of .feature, .yml, or .py test scripts
afw serve [--port ] — expose a REST API to list, run, and schedule test suites
✅ Installation
pip install appiumfw
Or locally:
git clone https://github.com/badrusalam11/appiumfw.git cd appiumfw pip install -e .
🚀 Quick Start
-
Setup mobile project afw setup
-
Scaffold a new project
afw init myproject cd myproject
- Create testsuite/feature/case
afw create-testsuite login afw create-feature login afw implement-feature login
-
Add test logic in testcases/, steps/, etc.
-
Run tests
afw run features/login.feature # via behave afw run testsuites/login.yml # via runner
after that, choose the mobile device, or set it directly in deviceName at settings/appium.properties
🌐 API Testing Example
You can use the same ApiClient to test any public free REST API, for example JSONPlaceholder:
from appiumfw.api_client import ApiClient
initialize client for JSONPlaceholder
client = ApiClient( base_url="https://jsonplaceholder.typicode.com", default_headers={"Accept": "application/json"} )
GET a list of posts
response = client.get("/posts") assert response.status_code == 200 posts = response.json() assert isinstance(posts, list) print(f"Retrieved {len(posts)} posts")
GET a single post
response = client.get("/posts/1") assert response.status_code == 200 post = response.json() assert post.get("id") == 1 print(f"Post title: {post.get('title')}")
POST a new post (will return a mock id)
new_post = { "title": "foo", "body": "bar", "userId": 1 } response = client.post("/posts", json=new_post) assert response.status_code == 201 created = response.json() assert created.get("id") is not None print(f"Created post ID: {created.get('id')}")
🛠️ Configuration
Use a .env in your project root to customize:
APP_PORT=5006 SERVER_URL=http://localhost:5006
💡 Why use appiumfw?
🧠 Inspired by Katalon, but for Python developers
🌟 Supports feature files + step generation + scheduling
🚀 Design for both CLI use and API integration
🧹 Expandable via listeners/hooks, Config, MobileFactory, etc.
🤝 Contributing
PRs are welcome! Please ensure:
Code is well-documented and follows PEP8
Templates & CLI updated accordingly
README.md and tests updated
Use Black, Flake8, isort (recommended)
📜 License
MIT — see LICENSE for details.
📨 Contact
Built & maintained by Muhamad Badru Salam — QA Automation Engineer (SDET)
Github: badrusalam11
LinkedIn: Muhamad Badru Salam
Metadata
Release files for appiumfw 0.1.4
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| appiumfw-0.1.4.tar.gz | 33.6 kB | Without provenance | Details for appiumfw-0.1.4.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| appiumfw-0.1.4-py3-none-any.whl | Python 3 | none | any | Details for appiumfw-0.1.4-py3-none-any.whl |
Total release size: 73.4 kB
Release files / appiumfw-0.1.4.tar.gz
| Download URL | appiumfw-0.1.4.tar.gz |
|---|---|
| Size | 33.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
8992a434e199e0ff038f7be56b713303e19597f6df22d6c2b5a21f52ff37dbcf
|
|
BLAKE2b-256 checksum How to use checksums |
062744f64ed394ee270514995c9523f29bda31a83ecb0d37f1290cc44c21ae39
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.1
|
Release files / appiumfw-0.1.4-py3-none-any.whl
| Download URL | appiumfw-0.1.4-py3-none-any.whl |
|---|---|
| Size | 39.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
246b4450a22301fa3d1c24c872347b4f0814192f2d225bfc3c99d8d30391050d
|
|
BLAKE2b-256 checksum How to use checksums |
8f37e68f42efdcc3646f35585491957dd67725dacb0610c9afb3e716273c5261
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.1
|
Security for appiumfw 0.1.4
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.