# rytest
rytest is a reasonably fast, somewhat Pytest compatible Python test runner.
Note that this is currently under heavy development, and will likely not work
for all but the simplest test suites.
## Why Another Test Runner?
What's wrong with pytest? Well, nothing per se. It's been a great test runner
for many years. But it also tends to be quite slow, especially if you are
looking to do things like automatically rerun your tests across a large
codebase.
Rytest is an experiment to see if we can get a much faster test runner that is
still compatible with the pytest ecosystem. Some day we hope to build on that
and provide an evolution of the testing experience for python.
For now though you may be asking, how much faster is this really? Well, we've
only built support for test collection so far, but it's substantially faster against a
couple of popular Python codebases.


## Roadmap
We are releasing versions of rytest as we complete major feature groups. The
following list is a rough roadmap of what we we expect to deliver:
- ✅ 0.1.0: Test collection. This also offers an incomplete test execution framework.
- ⬜️ 0.2.0: Fixture Support. This will ensure we have full fixture support, including test paramaterization.
- ⬜️ 0.3.0: Test Execution. This will ensure we have a full test execution framework.
- ⬜️ 0.4.0: Test Reporting. This will provide test reporting capabilties including coverage reporting.
- ⬜️ 0.5.0: Miscleneous. This will include any other features we feel are necessary to make rytest a complete test runner.
- ⬜️ 1.0.0: Release. This will be the first stable release of rytest, and is expected to be usable for most test suites.
This means that early released may not be suitable for production work, but we
hope people can pull it down, try it out, and provide feedback.
The roadmap to 2.0 will focus more on developing an interface unique to rytest,
more to come on that!
## Usage
The simple version is:
```bash
$ rytest tests
```
This will run tests in any python file in the `tests` directory that starts
with `test_`.
## Development
In order for maturin to build and link against python, you will need to ensure
there is a virtualenv available to it:
```bash
python3 -m venv .venv
```
To test against our local test fixtures, run:
```bash
cargo run -- tests -v
```
### Running the Test Suite
To run the test suite, run:
```bash
cargo test
```
We make use of the `insta` crate for snapshot testing. If you need to update
snapshots, run:
```bash
cargo install cargo-insta
cargo insta review
```
For more information, check out the [documentation](https://insta.rs/docs/cli/).
## Contributing
Before contributing code to this repository, recognize that you should run the
following to satisfy CI:
```bash
cargo fmt
cargo build
cargo clippy
cargo test
```
These will all be run in CI to validate your code.
## Thank You
We wanted to thank the Astral team for providing a great example of how to
manage a lot of the scaffold around a Rust/Python project, which has alllowed
us to focus on the core of rytest.
Raw data
{
"_id": null,
"home_page": "https://github.com/jimjkelly/rytest",
"name": "rytest",
"maintainer": null,
"docs_url": null,
"requires_python": "<3.13,>=3.9",
"maintainer_email": null,
"keywords": "test, testing",
"author": "Jim Kelly, Aatish Neupane",
"author_email": null,
"download_url": "https://files.pythonhosted.org/packages/d0/9a/496b5e85433fe881876ac9415de2e3ba27a56198421b1770897dd1c071d7/rytest-0.1.0.tar.gz",
"platform": null,
"description": "# rytest\n\nrytest is a reasonably fast, somewhat Pytest compatible Python test runner.\n\nNote that this is currently under heavy development, and will likely not work\nfor all but the simplest test suites.\n\n## Why Another Test Runner?\n\nWhat's wrong with pytest? Well, nothing per se. It's been a great test runner\nfor many years. But it also tends to be quite slow, especially if you are\nlooking to do things like automatically rerun your tests across a large\ncodebase.\n\nRytest is an experiment to see if we can get a much faster test runner that is\nstill compatible with the pytest ecosystem. Some day we hope to build on that\nand provide an evolution of the testing experience for python.\n\nFor now though you may be asking, how much faster is this really? Well, we've\nonly built support for test collection so far, but it's substantially faster against a\ncouple of popular Python codebases.\n\n\n\n\n\n## Roadmap\n\nWe are releasing versions of rytest as we complete major feature groups. The\nfollowing list is a rough roadmap of what we we expect to deliver:\n\n- \u2705 0.1.0: Test collection. This also offers an incomplete test execution framework.\n- \u2b1c\ufe0f 0.2.0: Fixture Support. This will ensure we have full fixture support, including test paramaterization.\n- \u2b1c\ufe0f 0.3.0: Test Execution. This will ensure we have a full test execution framework.\n- \u2b1c\ufe0f 0.4.0: Test Reporting. This will provide test reporting capabilties including coverage reporting.\n- \u2b1c\ufe0f 0.5.0: Miscleneous. This will include any other features we feel are necessary to make rytest a complete test runner.\n- \u2b1c\ufe0f 1.0.0: Release. This will be the first stable release of rytest, and is expected to be usable for most test suites.\n\nThis means that early released may not be suitable for production work, but we\nhope people can pull it down, try it out, and provide feedback.\n\nThe roadmap to 2.0 will focus more on developing an interface unique to rytest,\nmore to come on that!\n\n## Usage\n\nThe simple version is:\n\n```bash\n$ rytest tests\n```\n\nThis will run tests in any python file in the `tests` directory that starts\nwith `test_`.\n\n## Development\n\nIn order for maturin to build and link against python, you will need to ensure\nthere is a virtualenv available to it:\n\n```bash\npython3 -m venv .venv\n```\n\nTo test against our local test fixtures, run:\n\n```bash\ncargo run -- tests -v\n```\n\n### Running the Test Suite\n\nTo run the test suite, run:\n\n```bash\ncargo test\n```\n\nWe make use of the `insta` crate for snapshot testing. If you need to update\nsnapshots, run:\n\n```bash\ncargo install cargo-insta\ncargo insta review\n```\n\nFor more information, check out the [documentation](https://insta.rs/docs/cli/).\n\n## Contributing\n\nBefore contributing code to this repository, recognize that you should run the\nfollowing to satisfy CI:\n\n```bash\ncargo fmt\ncargo build\ncargo clippy\ncargo test\n```\n\nThese will all be run in CI to validate your code.\n\n## Thank You\n\nWe wanted to thank the Astral team for providing a great example of how to\nmanage a lot of the scaffold around a Rust/Python project, which has alllowed\nus to focus on the core of rytest.\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "rytest is a reasonably fast, somewhat Pytest compatible Python test runner.",
"version": "0.1.0",
"project_urls": {
"Homepage": "https://github.com/jimjkelly/rytest",
"Source": "https://github.com/jimjkelly/rytest",
"Tracker": "https://github.com/jimjkelly/rytest/issues"
},
"split_keywords": [
"test",
" testing"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "2d344a12ff0442540bea3ddfaaca7a33074fd265d0eaf2a51afe6cf37721a754",
"md5": "5503ccc4342fbe38b95cc74077151247",
"sha256": "9a3449d56434a0ffdc922b36215d0e67f52289d53388ded50c97e18d01b322cb"
},
"downloads": -1,
"filename": "rytest-0.1.0-cp310-cp310-win32.whl",
"has_sig": false,
"md5_digest": "5503ccc4342fbe38b95cc74077151247",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": "<3.13,>=3.9",
"size": 1472567,
"upload_time": "2024-12-03T04:31:37",
"upload_time_iso_8601": "2024-12-03T04:31:37.800035Z",
"url": "https://files.pythonhosted.org/packages/2d/34/4a12ff0442540bea3ddfaaca7a33074fd265d0eaf2a51afe6cf37721a754/rytest-0.1.0-cp310-cp310-win32.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "5f8f30a98351891e98558f16ae9d5d6d920a3abca5a2fa5d90584405dbb914c7",
"md5": "6f7b439ee4eb870115eeae34a916b606",
"sha256": "bb257c568e97b173afde15267111d5ddfa9656998b92535c50c90ba04719f6fd"
},
"downloads": -1,
"filename": "rytest-0.1.0-cp310-cp310-win_amd64.whl",
"has_sig": false,
"md5_digest": "6f7b439ee4eb870115eeae34a916b606",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": "<3.13,>=3.9",
"size": 1584991,
"upload_time": "2024-12-03T04:31:30",
"upload_time_iso_8601": "2024-12-03T04:31:30.757717Z",
"url": "https://files.pythonhosted.org/packages/5f/8f/30a98351891e98558f16ae9d5d6d920a3abca5a2fa5d90584405dbb914c7/rytest-0.1.0-cp310-cp310-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "33df2c3b1fee2ede114146c84eceb65fd9d1b1fc44bf44d91e0f79ab1b67ee15",
"md5": "1074f45a130e5073439acf51cb3116a8",
"sha256": "b768a13cd63537c5613ce8e47bdf1f1f3a72419aa1fd5e2ad6dd4337311dbf04"
},
"downloads": -1,
"filename": "rytest-0.1.0-cp311-cp311-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "1074f45a130e5073439acf51cb3116a8",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": "<3.13,>=3.9",
"size": 1661227,
"upload_time": "2024-12-03T04:31:25",
"upload_time_iso_8601": "2024-12-03T04:31:25.905578Z",
"url": "https://files.pythonhosted.org/packages/33/df/2c3b1fee2ede114146c84eceb65fd9d1b1fc44bf44d91e0f79ab1b67ee15/rytest-0.1.0-cp311-cp311-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "56e7d143bc0db950033963f9864b9178b655987baa67d2a7cb9961c1f1acb3a4",
"md5": "4be2c5239e13db75cc2d6a50920afa0f",
"sha256": "3ce3af03251571f2ea51e46b5630e9b75714b990578fd4e007218f88f26ba855"
},
"downloads": -1,
"filename": "rytest-0.1.0-cp311-cp311-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "4be2c5239e13db75cc2d6a50920afa0f",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": "<3.13,>=3.9",
"size": 1593456,
"upload_time": "2024-12-03T04:31:22",
"upload_time_iso_8601": "2024-12-03T04:31:22.303989Z",
"url": "https://files.pythonhosted.org/packages/56/e7/d143bc0db950033963f9864b9178b655987baa67d2a7cb9961c1f1acb3a4/rytest-0.1.0-cp311-cp311-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "768dcca83740bd5fec229949c8425af19928323e4644672025606a0eec0c0d0a",
"md5": "04e5ecaa7f81a519065bf57e403608ee",
"sha256": "ac00e4c005226dd3364222732a272a64715aad876e13201be2c912aa167b704b"
},
"downloads": -1,
"filename": "rytest-0.1.0-cp311-cp311-win32.whl",
"has_sig": false,
"md5_digest": "04e5ecaa7f81a519065bf57e403608ee",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": "<3.13,>=3.9",
"size": 1472327,
"upload_time": "2024-12-03T04:31:39",
"upload_time_iso_8601": "2024-12-03T04:31:39.918137Z",
"url": "https://files.pythonhosted.org/packages/76/8d/cca83740bd5fec229949c8425af19928323e4644672025606a0eec0c0d0a/rytest-0.1.0-cp311-cp311-win32.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "899960e15c0eb9ae0c30bd8268fa1b85fd3803de0996240eecc09e17652228dc",
"md5": "a3dc910070d74006b30864efc8b32835",
"sha256": "e0bd036b1c0124aafcf21f3b3c18a659e3ed019ac8cb26ad7f12ecc13b685623"
},
"downloads": -1,
"filename": "rytest-0.1.0-cp311-cp311-win_amd64.whl",
"has_sig": false,
"md5_digest": "a3dc910070d74006b30864efc8b32835",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": "<3.13,>=3.9",
"size": 1584781,
"upload_time": "2024-12-03T04:31:32",
"upload_time_iso_8601": "2024-12-03T04:31:32.114400Z",
"url": "https://files.pythonhosted.org/packages/89/99/60e15c0eb9ae0c30bd8268fa1b85fd3803de0996240eecc09e17652228dc/rytest-0.1.0-cp311-cp311-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "a71bed93d24f834da78adb6e7ee681d795dd50c9dc82c6ef2187b8b52303b6c7",
"md5": "b9041899c1ca64106f8fe151ca4aa65a",
"sha256": "8630081a61df8ecd5ce5de0443d31d4cccde41aceb170c48b7c216dd20729e5c"
},
"downloads": -1,
"filename": "rytest-0.1.0-cp312-cp312-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "b9041899c1ca64106f8fe151ca4aa65a",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": "<3.13,>=3.9",
"size": 1660946,
"upload_time": "2024-12-03T04:31:27",
"upload_time_iso_8601": "2024-12-03T04:31:27.984296Z",
"url": "https://files.pythonhosted.org/packages/a7/1b/ed93d24f834da78adb6e7ee681d795dd50c9dc82c6ef2187b8b52303b6c7/rytest-0.1.0-cp312-cp312-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "62a430ad38dfeea8f5a5d31ec466c178c5edbdc730d8391a1b086d87f6b72707",
"md5": "f820865fd91421f97418dabac71a5400",
"sha256": "4930a8659d1cc10e4a532129202db954ffd1278d4326dfa4284ad7b1b9ef7998"
},
"downloads": -1,
"filename": "rytest-0.1.0-cp312-cp312-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "f820865fd91421f97418dabac71a5400",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": "<3.13,>=3.9",
"size": 1591534,
"upload_time": "2024-12-03T04:31:24",
"upload_time_iso_8601": "2024-12-03T04:31:24.013003Z",
"url": "https://files.pythonhosted.org/packages/62/a4/30ad38dfeea8f5a5d31ec466c178c5edbdc730d8391a1b086d87f6b72707/rytest-0.1.0-cp312-cp312-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "c1632aed07e2f95287c4d15aee83c7df2d1acf57c5c91a38719e872003002dc6",
"md5": "b2548965fe7c0c06418d9011ffc5b0f2",
"sha256": "9a77b0061241bc30e3024b038428686ea260f7bf5635fc181020c8d0c26d8b59"
},
"downloads": -1,
"filename": "rytest-0.1.0-cp312-cp312-win32.whl",
"has_sig": false,
"md5_digest": "b2548965fe7c0c06418d9011ffc5b0f2",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": "<3.13,>=3.9",
"size": 1470267,
"upload_time": "2024-12-03T04:31:41",
"upload_time_iso_8601": "2024-12-03T04:31:41.801268Z",
"url": "https://files.pythonhosted.org/packages/c1/63/2aed07e2f95287c4d15aee83c7df2d1acf57c5c91a38719e872003002dc6/rytest-0.1.0-cp312-cp312-win32.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "99bd125423cf48de452df20f4dc2eb0a5ff5017d4de316183412c83e61b69228",
"md5": "343575dbc453d7d3841ea32257e97fb3",
"sha256": "20b74975d433fc64ae44e235ea7be941947f1a742844edd63b554cff7441b247"
},
"downloads": -1,
"filename": "rytest-0.1.0-cp312-cp312-win_amd64.whl",
"has_sig": false,
"md5_digest": "343575dbc453d7d3841ea32257e97fb3",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": "<3.13,>=3.9",
"size": 1586448,
"upload_time": "2024-12-03T04:31:33",
"upload_time_iso_8601": "2024-12-03T04:31:33.972558Z",
"url": "https://files.pythonhosted.org/packages/99/bd/125423cf48de452df20f4dc2eb0a5ff5017d4de316183412c83e61b69228/rytest-0.1.0-cp312-cp312-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "25decf9dae9ca3b052399c36d333b2d5e471ca804886eb850cc0e48c5a53f47b",
"md5": "005e69f99bf5fff7c67cfbbfd77e872f",
"sha256": "bba7ea7d1cb92b3e054eaa00e7dd4f7bbce1a56a72a32a6fdd75a293d31094cf"
},
"downloads": -1,
"filename": "rytest-0.1.0-cp39-cp39-win32.whl",
"has_sig": false,
"md5_digest": "005e69f99bf5fff7c67cfbbfd77e872f",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": "<3.13,>=3.9",
"size": 1472500,
"upload_time": "2024-12-03T04:31:43",
"upload_time_iso_8601": "2024-12-03T04:31:43.637086Z",
"url": "https://files.pythonhosted.org/packages/25/de/cf9dae9ca3b052399c36d333b2d5e471ca804886eb850cc0e48c5a53f47b/rytest-0.1.0-cp39-cp39-win32.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "6f518cb158f721594514b12ac127c955913c6d08284809af26c739ae52308d07",
"md5": "80ef8f8aeb3fb7bd992bbb2471437d66",
"sha256": "40357a0ffadcd0ebcba924cb4d722be6c315f3a77fc7c3a7e31a91daa9890901"
},
"downloads": -1,
"filename": "rytest-0.1.0-cp39-cp39-win_amd64.whl",
"has_sig": false,
"md5_digest": "80ef8f8aeb3fb7bd992bbb2471437d66",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": "<3.13,>=3.9",
"size": 1584978,
"upload_time": "2024-12-03T04:31:36",
"upload_time_iso_8601": "2024-12-03T04:31:36.139547Z",
"url": "https://files.pythonhosted.org/packages/6f/51/8cb158f721594514b12ac127c955913c6d08284809af26c739ae52308d07/rytest-0.1.0-cp39-cp39-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "d09a496b5e85433fe881876ac9415de2e3ba27a56198421b1770897dd1c071d7",
"md5": "29eee6d5f3f853f6c4b79c27d86512e5",
"sha256": "f25a32f128ed2bb43caf485191369af501a764283a69f2b80863c38122e6ce25"
},
"downloads": -1,
"filename": "rytest-0.1.0.tar.gz",
"has_sig": false,
"md5_digest": "29eee6d5f3f853f6c4b79c27d86512e5",
"packagetype": "sdist",
"python_version": "source",
"requires_python": "<3.13,>=3.9",
"size": 27059,
"upload_time": "2024-12-03T04:31:29",
"upload_time_iso_8601": "2024-12-03T04:31:29.281662Z",
"url": "https://files.pythonhosted.org/packages/d0/9a/496b5e85433fe881876ac9415de2e3ba27a56198421b1770897dd1c071d7/rytest-0.1.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-12-03 04:31:29",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "jimjkelly",
"github_project": "rytest",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "rytest"
}