<img src="https://user-images.githubusercontent.com/5740731/119056107-085c6900-b9c2-11eb-9699-f54ef4945623.png" width="350px">
[![Codecov](https://codecov.io/gh/darrenburns/ward/branch/master/graph/badge.svg)](https://codecov.io/gh/darrenburns/ward)
[![Documentation Status](https://readthedocs.org/projects/ward/badge/?version=latest)](https://ward.readthedocs.io/en/latest/?badge=latest)
[![PyPI version](https://badge.fury.io/py/ward.svg)](https://badge.fury.io/py/ward)
<hr>
_Ward_ is a Python testing framework with a focus on productivity and readability. It gives you the tools you need to write **well-documented** and **scalable** tests.
<img alt="Ward typical test output example" src="https://user-images.githubusercontent.com/5740731/118399779-a795ff00-b656-11eb-8fca-4ceb03151f3e.png">
## Features
See the full set of features in the [**documentation**](https://ward.readthedocs.io).
**Descriptive test names:** describe what your tests do using strings, not function names.
```python
@test("simple addition") # you can use markdown in these descriptions!
def _():
assert 1 + 2 == 3 # you can use plain assert statements!
```
**Modular test dependencies:** manage test setup/teardown code using fixtures that rely on Python's import system, not
name matching.
```python
@fixture
def user():
return User(name="darren")
@test("the user is called darren")
def _(u=user):
assert u.name == "darren"
```
**Support for asyncio**: define your tests and fixtures with `async def` and call asynchronous code within them.
```python
@fixture
async def user():
u = await create_user()
return await u.login()
@test("the logged in user has a last session date")
async def _(user=user):
last_session = await get_last_session_date(user.id)
assert is_recent(last_session, get_last_session_date)
```
**Powerful test selection:** limit your test run not only by matching test names/descriptions, but also on the code
contained in the body of the test.
```
ward --search "Database.get_all_users"
```
Or use tag expressions for more powerful filtering.
```
ward --tags "(unit or integration) and not slow"
```
**Parameterised testing:** write a test once, and run it multiple times with different inputs by writing it in a loop.
```python
for lhs, rhs, res in [
(1, 1, 2),
(2, 3, 5),
]:
@test("simple addition")
def _(left=lhs, right=rhs, result=res):
assert left + right == result
```
**Cross platform:** Tested on Mac OS, Linux, and Windows.
**Speedy:** Ward's suite of ~320 tests run in less than half a second on my machine.
**Zero config:** Sensible defaults mean running `ward` with no arguments is enough to get started. Can be configured using `pyproject.toml` or the command line if required.
**Extendable:** Ward has a plugin system built with pluggy, the same framework used by pytest.
**Colourful, human readable output:** quickly pinpoint and fix issues with detailed output for failing tests.
<img alt="Ward failing test output example" src="https://user-images.githubusercontent.com/5740731/120125898-5dfaf780-c1b2-11eb-9acd-b9cd0ff24110.png">
## Getting Started
Have a look at the [**documentation**](https://ward.readthedocs.io)!
## How to Contribute
Contributions are very welcome and encouraged!
See the [contributing guide](.github/CONTRIBUTING.md) for information on how you can take part in the development of Ward.
Raw data
{
"_id": null,
"home_page": "https://ward.readthedocs.io",
"name": "ward",
"maintainer": "Darren Burns",
"docs_url": null,
"requires_python": ">=3.7.8,<4.0.0",
"maintainer_email": "darrenb900@gmail.com",
"keywords": "test,testing,quality-assurance,cli,python3",
"author": "Darren Burns",
"author_email": "darrenb900@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/6b/d6/8e6ffa608e05ecc4c98f17272db67d00035a3d040671ce565ee6924c0d98/ward-0.68.0b0.tar.gz",
"platform": null,
"description": "<img src=\"https://user-images.githubusercontent.com/5740731/119056107-085c6900-b9c2-11eb-9699-f54ef4945623.png\" width=\"350px\">\n\n[![Codecov](https://codecov.io/gh/darrenburns/ward/branch/master/graph/badge.svg)](https://codecov.io/gh/darrenburns/ward)\n[![Documentation Status](https://readthedocs.org/projects/ward/badge/?version=latest)](https://ward.readthedocs.io/en/latest/?badge=latest)\n[![PyPI version](https://badge.fury.io/py/ward.svg)](https://badge.fury.io/py/ward)\n\n<hr>\n\n_Ward_ is a Python testing framework with a focus on productivity and readability. It gives you the tools you need to write **well-documented** and **scalable** tests.\n\n<img alt=\"Ward typical test output example\" src=\"https://user-images.githubusercontent.com/5740731/118399779-a795ff00-b656-11eb-8fca-4ceb03151f3e.png\">\n\n## Features\n\nSee the full set of features in the [**documentation**](https://ward.readthedocs.io).\n\n**Descriptive test names:** describe what your tests do using strings, not function names.\n```python\n@test(\"simple addition\") # you can use markdown in these descriptions!\ndef _():\n assert 1 + 2 == 3 # you can use plain assert statements!\n```\n\n**Modular test dependencies:** manage test setup/teardown code using fixtures that rely on Python's import system, not\nname matching.\n```python\n@fixture\ndef user():\n return User(name=\"darren\")\n\n\n@test(\"the user is called darren\")\ndef _(u=user):\n assert u.name == \"darren\"\n```\n\n**Support for asyncio**: define your tests and fixtures with `async def` and call asynchronous code within them.\n\n```python\n@fixture\nasync def user():\n u = await create_user()\n return await u.login()\n\n\n@test(\"the logged in user has a last session date\")\nasync def _(user=user):\n last_session = await get_last_session_date(user.id)\n assert is_recent(last_session, get_last_session_date)\n```\n\n**Powerful test selection:** limit your test run not only by matching test names/descriptions, but also on the code\ncontained in the body of the test.\n```\nward --search \"Database.get_all_users\"\n```\nOr use tag expressions for more powerful filtering.\n```\nward --tags \"(unit or integration) and not slow\"\n```\n\n**Parameterised testing:** write a test once, and run it multiple times with different inputs by writing it in a loop.\n```python\nfor lhs, rhs, res in [\n (1, 1, 2),\n (2, 3, 5),\n]:\n\n @test(\"simple addition\")\n def _(left=lhs, right=rhs, result=res):\n assert left + right == result\n```\n\n**Cross platform:** Tested on Mac OS, Linux, and Windows.\n\n**Speedy:** Ward's suite of ~320 tests run in less than half a second on my machine.\n\n**Zero config:** Sensible defaults mean running `ward` with no arguments is enough to get started. Can be configured using `pyproject.toml` or the command line if required.\n\n**Extendable:** Ward has a plugin system built with pluggy, the same framework used by pytest.\n\n**Colourful, human readable output:** quickly pinpoint and fix issues with detailed output for failing tests.\n\n<img alt=\"Ward failing test output example\" src=\"https://user-images.githubusercontent.com/5740731/120125898-5dfaf780-c1b2-11eb-9acd-b9cd0ff24110.png\">\n\n## Getting Started\n\nHave a look at the [**documentation**](https://ward.readthedocs.io)!\n\n## How to Contribute\n\nContributions are very welcome and encouraged!\n\nSee the [contributing guide](.github/CONTRIBUTING.md) for information on how you can take part in the development of Ward.\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "A modern Python testing framework",
"version": "0.68.0b0",
"project_urls": {
"Documentation": "https://ward.readthedocs.io",
"Homepage": "https://ward.readthedocs.io",
"Repository": "https://github.com/darrenburns/ward"
},
"split_keywords": [
"test",
"testing",
"quality-assurance",
"cli",
"python3"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "f0dd6999a6f4b01ab01bd5d8bc926d34d8224c232dce1f7353f746e93b482449",
"md5": "2e694b1b8af2d2c285ec4fe928f2fe25",
"sha256": "0847e6b95db9d2b83c7d1b9cea9bcb7ac3b8e8f6d341b8dc8920d6afb05458b1"
},
"downloads": -1,
"filename": "ward-0.68.0b0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "2e694b1b8af2d2c285ec4fe928f2fe25",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.7.8,<4.0.0",
"size": 43416,
"upload_time": "2023-12-18T22:56:59",
"upload_time_iso_8601": "2023-12-18T22:56:59.434389Z",
"url": "https://files.pythonhosted.org/packages/f0/dd/6999a6f4b01ab01bd5d8bc926d34d8224c232dce1f7353f746e93b482449/ward-0.68.0b0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "6bd68e6ffa608e05ecc4c98f17272db67d00035a3d040671ce565ee6924c0d98",
"md5": "34de9b9aadbc6b3915b4a3ed1178d844",
"sha256": "d8aafa4ddb81f4d5787d95bdb2f7ba69a2e89f183feec78d8afcc64b2cd19ee9"
},
"downloads": -1,
"filename": "ward-0.68.0b0.tar.gz",
"has_sig": false,
"md5_digest": "34de9b9aadbc6b3915b4a3ed1178d844",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.7.8,<4.0.0",
"size": 38657,
"upload_time": "2023-12-18T22:57:02",
"upload_time_iso_8601": "2023-12-18T22:57:02.054288Z",
"url": "https://files.pythonhosted.org/packages/6b/d6/8e6ffa608e05ecc4c98f17272db67d00035a3d040671ce565ee6924c0d98/ward-0.68.0b0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2023-12-18 22:57:02",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "darrenburns",
"github_project": "ward",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "ward"
}