{"id":15401198,"url":"https://github.com/rochacbruno/ansible-test","last_synced_at":"2025-10-16T20:31:56.073Z","repository":{"id":80831830,"uuid":"411033600","full_name":"rochacbruno/ansible-test","owner":"rochacbruno","description":"ansible.test.case is a testing framework and test runner within ansible tasks, it talks to API using openapispec, to Selenium using pageObjects and CLI using pexpect.","archived":false,"fork":false,"pushed_at":"2022-01-24T18:35:46.000Z","size":773,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-01-28T17:04:29.298Z","etag":null,"topics":["ansible","junit","pytest","test-automation","testing","testing-tools"],"latest_commit_sha":null,"homepage":"","language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rochacbruno.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2021-09-27T20:29:14.000Z","updated_at":"2021-10-01T15:58:41.000Z","dependencies_parsed_at":null,"dependency_job_id":"1953f05e-b3e3-44ca-9227-5fc8093087cb","html_url":"https://github.com/rochacbruno/ansible-test","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rochacbruno%2Fansible-test","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rochacbruno%2Fansible-test/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rochacbruno%2Fansible-test/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rochacbruno%2Fansible-test/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rochacbruno","download_url":"https://codeload.github.com/rochacbruno/ansible-test/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":236745692,"owners_count":19198059,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ansible","junit","pytest","test-automation","testing","testing-tools"],"created_at":"2024-10-01T15:56:48.064Z","updated_at":"2025-10-16T20:31:50.562Z","avatar_url":"https://github.com/rochacbruno.png","language":"HTML","funding_links":[],"categories":[],"sub_categories":[],"readme":"**WARNING** This is a Work in Progress\n\n# ansible-test\nansible.test.case is a testing framework and test runner within ansible tasks, it **WILL** taslk to API using openapispec, to Selenium using pageObjects and CLI using pexpect.\n\n## Declarative test cases\n\n```YAML\n# This is a standard ansible-playbook named test-case.yaml\n---\n- name: Test Case for Users\n  ansible.test.case:\n    using: namespace.project\n    actions:\n      - user.read:\n          title: Start initial objects\n          via: api\n          inputs:\n            name: admin\n          export:\n            admin_user: result.data\n            user_exists: result.status_code != 404   \n      - user.create:\n          skipif: user_exists\n          title: Ensure user can be created via API\n          via: api\n          inputs:\n            name: admin\n            password: \"{{ generate_password('str', 8, 'strong') }}\"\n          expect:\n            - result.status == ok\n          export: admin_user\n      - user.read:\n          title: Ensure the created user can is available via api, cli and ui\n          via: [api, cli, ui]\n          inputs:\n            name: admin_user.name\n          expect:\n            - result.status == ok\n            - result.data.name == admin_user.name\n            - result.api.status_code == 200\n            - result.cli.rc == 0\n            - result.ui.has_element('#username')\n            - result.ui.element_value('#username') == admin_user.name\n``` \nExecute the test suite.\n\n```bash\n$ ansible-playbook --connection=local test-case.yaml\n# or\n$ ansible-playbook -i my.ci.host, test-case.yaml\n```\n\nOutputs:\n\n```plain\nPLAY [Functional tests for project] *********************\n\nTASK [Gathering Facts] **********************************\nok: [localhost]\n\nTASK [Test Create User] *********************************\nok: [localhost] =\u003e \n    user.read: status=ok, api.status_code=404 [PASSED]\n    user.create: status=ok, api.status_code=200 [PASSED]\n    user.read: status=ok, api.status_code=200, cli.rc=0, ui.state=loaded [PASSED]\n\nTASK [Junit Report] *************************************\nok: [localhost] =\u003e (file=junit/test-case-result.xml)\n\nTASK [Uploading junit report] ***************************\nok: [localhost] =\u003e (to=metrics.host, status=ok)\n\nTASK [Saving Selenium Screenshots] ***********************\nok: [localhost] =\u003e (to=/screenshots/build-1234, status=ok)\n\n```\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eClick here to compare the same test scenario written in Python\u003c/summary\u003e\n\n\n\u003e Considering the same level of abstractions.\n\n```py\n\"\"\"Test Case for Users\"\"\"\nimport pytest\nfrom namespace.project import api\nfrom namespace.project import cli\nfrom namespace.project import ui\nfrom namespace.project.generators import generate_password\n\n\ndef pytest_configure():\n    \"\"\"Start initial objects\"\"\"\n    result = api.user.read(name=\"admin\")\n    pytest.my_global_context = {\n      \"user_exists\": result.status_code != 404,\n      \"admin_user\": result.data\n    }\n\n\n@pytest.mark.skipif(pytest.my_global_context[\"user_exists\"])\ndef test_create_user_via_api():\n    \"\"\"Ensure user can be created via API\"\"\"\n    response = api.user.create(\n        name=\"admin\", \n        password=generate_password('str', 8, 'strong')\n    )\n    assert response.status_code == 200\n    pytest.my_global_context[\"admin_user\"] = response.data\n    \n    \n@pytest.mark.parameterize(\"via\", [api, cli, ui])\ndef test_user_read(via):\n    \"\"\"Ensure the created user can is available via api, cli and ui\"\"\"\n    admin_user = pytest.my_global_context[\"admin_user\"]\n    response = via.user.read(name=admin_user.name)\n    assert response.status == \"ok\"\n    assert response.data.name == admin_user.name\n    if via == api:\n        assert response.status_code == 200\n    if via == cli:\n        assert response.rc == 0\n    if via == ui:\n        assert response.ui.has_element(\"#username\")\n        assert response.ui.element_value(\"#username\") == admin_user.name\n```\n\n\n[Python](https://gist.github.com/rochacbruno/47f7b50df3345e570986941516b9bc77)\n\n\u003c/details\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frochacbruno%2Fansible-test","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frochacbruno%2Fansible-test","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frochacbruno%2Fansible-test/lists"}