Skip to content

Karva (0.0.1-alpha.1)

codecov PyPI - Version

[!NOTE]

Sadly, this will not be very well maintained and should not be used for anything important. I wanted to see if I could make a better pytest. But unless I completely diverge from the current architecture and basically start again, and try to make a better pytest-xdist, the performance of this will not be much better than pytest, let alone pytest-xdist.

Thanks for taking an interest! Perhaps I will have a proper go at this in the future.

A Python test framework, written in Rust.

Benchmark results

About Karva

Karva aims to be an efficient alternative to pytest and unittest.

While we do not yet support all of pytest's features, we aim to gradually add support for pytest alternatives as we add features.

Getting started

Installation

Karva is available as karva on PyPI.

Use karva directly with uvx:

Bash
1
2
uvx karva test
uvx karva version

Or install karva with uv, or pip:

Bash
1
2
3
4
5
6
7
8
# With uv.
uv tool install karva@latest

# Add karva to your project.
uv add --dev karva

# With pip.
pip install karva

Usage

By default, Karva will respect your .gitignore files when discovering tests in specified directories.

To run your tests, try any of the following:

Bash
1
2
3
4
5
6
7
8
# Run all tests.
karva test

# Run tests in a specific directory.
karva test tests/

# Run tests in a specific file.
karva test tests/test_example.py

Example

Here is a small example usage

tests/test.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
def test_pass():
    assert True


def test_fail():
    assert False, "This test should fail"


def test_error():
    raise ValueError("This is an error")

Running karva:

Bash
1
uv run karva test tests/

Provides the following output:

Text Only
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
test tests.test::test_pass ... ok
test tests.test::test_fail ... FAILED
test tests.test::test_error ... FAILED

diagnostics:

error[test-failure]: Test `test_fail` failed
 --> tests/test.py:5:5
  |
5 | def test_fail():
  |     ^^^^^^^^^
6 |     assert False, "This test should fail"
  |
info: Test failed here
 --> tests/test.py:6:5
  |
5 | def test_fail():
6 |     assert False, "This test should fail"
  |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  |
info: Error message: This test should fail

error[test-failure]: Test `test_error` failed
  --> tests/test.py:9:5
   |
 9 | def test_error():
   |     ^^^^^^^^^^
10 |     raise ValueError("This is an error")
   |
info: Test failed here
  --> tests/test.py:10:5
   |
 9 | def test_error():
10 |     raise ValueError("This is an error")
   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   |
info: Error message: This is an error

test result: FAILED. 1 passed; 2 failed; 0 skipped; finished in 8ms

Contributing

Contributions are welcome! See CONTRIBUTING.md for more information.

You can also join us on Discord