Python-Delayed-Assert
Delayed aka. Soft asserts for python
Few features:
- No Dependenices on any other framework/library.
- Should work with any testing framework.
- Can be use as decorator or context manager.
Installation
Install via pip
pip install delayed-assert
Install from master
pip install git+https://github.com/pr4bh4sh/delayed-assert
Uses
See example_unittest.py for usage.
Using assertion library with lambda
Pass the assertion call as
expect(lambda: self.assertListEqual([4,5,6,2,5],[7,8]))
While I've tested only with unittest asserttion,It should be able to use any assertion library.
Keep in mind that, Python does not support statement inside lambda, so
expect(lambda: assert 1 == 1)
won't work as it is not a valid lambda expression in python
Current possible uses
def testSomething(self):
delayed_assert.expect(1 == 1) # will succeed
delayed_assert.expect(1 == 2) # will fail but won't stop execution
delayed_assert.expect(3 == 2, "Value don't match") # will fail but won't stop execution
delayed_assert.expect(3 == 3) # will succeed
# will stop execution and show the stack trace of 2nd assertion
delayed_assert.assert_expectations()
def testLambdas(self):
expect(lambda: self.assertEqual(3,4)) # will fail but won't stop execution
expect(lambda: self.assertListEqual([4,5,6,2,5],[7,8])) # will fail but won't stop execution
assert_expectations()
@delayed_assert.assert_all()
def testDecorator(self):
expect('five' == 'Six', 'String do not match')
expect([5,2] == [3,4], 'List item do not match')
expect([3,4] == [3,4], 'This message wont be printed')
# No need to call delayed_assert.assert_expectations() when decorator is used
def testContextManeger(self):
with delayed_assert.assert_all():
expect('four' == 'Six', 'String do not match')
expect([5,2] == [3,4], 'List item do not match')
expect([3,4] == [3,4], 'This message wont be printed')
# No need to call delayed_assert.assert_expectations() when using context maneger is used
Color Output Control
The library supports toggling colorized output on/off via environment variable or programmatically.
Disable Colors via Environment Variable
# Disable colors
DELAYED_ASSERT_ENABLE_COLOR=0 python -m unittest example_unittest.py
# Enable colors (default)
DELAYED_ASSERT_ENABLE_COLOR=1 python -m unittest example_unittest.py
Values that disable colors: 0, false, no, off (case-insensitive)
Disable Colors Programmatically
from delayed_assert.delayed_assert import set_color_enabled, get_color_enabled
# Disable colors
set_color_enabled(False)
# Check status
if get_color_enabled():
print("Colors are enabled")
This is useful for:
- CI/CD environments where ANSI color codes may not be supported
- Log files where color codes create noise
- Environments with accessibility requirements
Caller Stack Verification
By default, the library verifies that expect() is called from a method named test*.
You can disable this check if you need to use expect() in helper methods or custom test runners.
Disable via Environment Variable:
DELAYED_ASSERT_CHECK_CALLER=0 python -m unittest example_unittest.py
Disable Programmatically:
from delayed_assert.delayed_assert import set_check_caller
set_check_caller(False)
Using the @test_case Decorator:
Alternatively, you can mark any function as a test case using the @test_case decorator. This allows expect() to identify the function correctly without disabling verificaton globally.
from delayed_assert import expect, assert_expectations, test_case
@test_case
def verify_custom_scenario():
expect(1 == 1, "Should pass")
def test_runner():
verify_custom_scenario()
assert_expectations()
Release files for delayed-assert 0.4.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| delayed_assert-0.4.2.tar.gz | 5.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| delayed_assert-0.4.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 11.7 kB
Release files / delayed_assert-0.4.2.tar.gz
| Download URL | delayed_assert-0.4.2.tar.gz |
|---|---|
| Size | 5.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
3ec7e3ab65ca674c241ebe66510104b318b3688a520d02a9da08a1abfd127d36
|
|
BLAKE2b-256 checksum How to use checksums |
eeaaa8f07e0f7f6279106bd7e41ad1cf6fea48bb1f3e0e6dbf8ae77d842db1dc
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Dec 7, 2025.
Transparency logRelease files / delayed_assert-0.4.2-py3-none-any.whl
| Download URL | delayed_assert-0.4.2-py3-none-any.whl |
|---|---|
| Size | 6.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
4520f5d8ab9cdfe98de22568de93bf1e6f21e2a81efa8ec58dc0c1b48d424c8a
|
|
BLAKE2b-256 checksum How to use checksums |
d46b50fe1c03685f1ef67d0795fd57b37864e862f1a35e92f0b2fa0bf44703d9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Dec 7, 2025.
Transparency log