Skip to main content

Build Status PyPI version Downloads Downloads

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.

Sample

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()

Credit : http://pythontesting.net/strategy/delayed-assert/

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)

Source distribution for delayed-assert 0.4.2
File Size Uploaded
delayed_assert-0.4.2.tar.gz 5.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for delayed-assert 0.4.2
File Interpreter ABI Platform
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 log

Release 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

Release history Release notifications | RSS feed

This release

0.4.2 This release

2 release files

0.4.1

2 release files

0.4.0

2 release files

0.3.6

2 release files

0.3.5

2 release files

0.3.4

2 release files

0.3.3

2 release files

0.3.2

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.3

2 release files

0.2.1

2 release files

0.2

2 release files

0.1

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page