From bcd1413d8fcebf6adebba3ee02c2719cd5f18cb0 Mon Sep 17 00:00:00 2001 From: etuzon Date: Tue, 20 Jan 2026 09:39:45 +0000 Subject: [PATCH] Version 2.0.0 --- .flake8 | 3 + .github/workflows/python-package.yml | 57 +- README.md | 40 +- RELEASE.md | 4 + coverage_report/lcov.info | 976 +++-- coverage_report/report.json | 3792 ++++++++++++++--- nrt_pytest_soft_asserts/__init__.py | 2 +- nrt_pytest_soft_asserts/soft_asserts.py | 378 +- pyproject.toml | 3 +- requirements-dev.txt | 2 + setup.py | 1 - .../soft_asserts_test.py | 202 +- 12 files changed, 4447 insertions(+), 1013 deletions(-) create mode 100644 requirements-dev.txt diff --git a/.flake8 b/.flake8 index fa9d9e6..ead6ec7 100644 --- a/.flake8 +++ b/.flake8 @@ -11,6 +11,9 @@ exclude = dist, .flask8, venv + max-complexity = 10 +max-line-length = 100 + filename = *.py \ No newline at end of file diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index 2a58d54..10eff88 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -5,28 +5,69 @@ name: Python multi version tests on: push: branches: [ 'main' ] + pull_request: + branches: [ 'main' ] schedule: - # Run every 05:00 AM on the 1st day of every month - - cron: '0 5 1 * *' + # Run every 05:00 AM + - cron: '0 5 * * *' jobs: + pytest-version-check: + runs-on: ubuntu-latest + outputs: + should_run: ${{ steps.decision.outputs.should_run }} + steps: + - uses: actions/checkout@v4 + - name: Restore last version + id: cache-pytest + uses: actions/cache@v4 + with: + path: last_pytest_version.txt + key: pytest-version-cache-${{ github.run_id }} + restore-keys: pytest-version-cache- + - name: Fetch Latest Pytest + id: pypi + run: | + LATEST=$(curl -s https://pypi.org/pypi/pytest/json | jq -r '.info.version') + echo "latest=$LATEST" >> $GITHUB_OUTPUT + [ -f last_pytest_version.txt ] && LAST=$(cat last_pytest_version.txt) || LAST="0.0.0" + echo "last=$LAST" >> $GITHUB_OUTPUT + - name: Determine if we should run + id: decision + run: | + if [[ "${{ github.event_name }}" != "schedule" ]]; then + echo "should_run=true" >> $GITHUB_OUTPUT + elif [[ "${{ steps.pypi.outputs.latest }}" != "${{ steps.pypi.outputs.last }}" ]]; then + echo "should_run=true" >> $GITHUB_OUTPUT + else + echo "should_run=false" >> $GITHUB_OUTPUT + fi + - name: Cancel if no update + if: steps.decision.outputs.should_run == 'false' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + echo "No new pytest version. Cancelling and deleting run." + gh run delete ${{ github.run_id }} test: + needs: pytest-version-check + if: needs.pytest-version-check.outputs.should_run == 'true' runs-on: ubuntu-latest strategy: - fail-fast: true + fail-fast: false matrix: python-version: ['3.8', '3.9', '3.10', '3.11', '3.12', '3.13', '3.14'] pytest-version: ['7.0.1', 'latest'] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v3 + uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} - name: Install testing dependencies run: | python -m pip install --upgrade pip python -m pip install coverage deepdiff parameterized - - name: Install application dependencies + - name: Install application dependencies run: | grep -v pytest requirements.txt > requirements_without_pytest.txt || true @@ -42,6 +83,10 @@ jobs: - name: Test with pytest run: | python tests_execution.py + - name: Update last pytest version + if: github.event_name == 'schedule' && success() + run: | + echo "${{ needs.pytest-version-check.outputs.latest }}" > last_pytest_version.txt - name: Send lcov.info to coveralls uses: coverallsapp/github-action@master with: diff --git a/README.md b/README.md index 83dcaf8..8d7d197 100644 --- a/README.md +++ b/README.md @@ -43,9 +43,9 @@ To verify the soft asserts in the middle of the test, call `sa.assert_all()`.
assert_all() will raise _AssertionError_ if any of the asserts failed.
-### With statement +### ith statement -Soft asserts can be used in 'with' statement.
+Soft asserts can be used in `with` statement.

#### Example 1 @@ -76,11 +76,30 @@ with SoftAsserts() as sa: sa.assert_equal(1, 2, 'Second assert failed') ``` +### aync context manager +Soft asserts can be used in `async with` statement.
+
+#### Example +```python +import asyncio +from nrt_pytest_soft_asserts.soft_asserts import SoftAsserts + +async def print_on_failure(): + print('Assertion failed!') +async def test_assert_with_async_statement(): + async with SoftAsserts() as sa: + sa.assert_true(False, 'First assert failed') + sa.assert_equal(1, 2, 'Second assert failed') + +asyncio.run(test_assert_with_async_statement()) +``` + ### soft_asserts decorator Soft asserts can be used as a decorator.
+Soft asserts decorator supports also async test functions.
The assert_all() method will be run in the decorator, so it is not needed to run in the test itself.
-#### Example +#### Example 1 ```python import pytest @@ -95,6 +114,21 @@ def test_assert_with_decorator(): sa.assert_equal(1, 2, 'Second assert failed') ``` +#### Example 2 + +```python +import pytest +from nrt_pytest_soft_asserts.soft_asserts import SoftAsserts, soft_asserts + + +sa = SoftAsserts() + +@soft_asserts(sa=sa) +async def test_assert_with_decorator_async(): + sa.assert_true(False, 'First assert failed') + sa.assert_equal(1, 2, 'Second assert failed') +``` + ### Steps Each testing section can be divided to steps.
diff --git a/RELEASE.md b/RELEASE.md index 0f8ca7b..277ab95 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -2,6 +2,10 @@ ## Version History +### Version 2.0.0 + +- Support for asynchronous context managers. `async with SoftAsserts()` and `async with sa.assert_raised_with`. + ### Version 1.4.1 - Add new assertion method: `assert_greater`, `assert_greater_equal`, `assert_less`, `assert_less_equal`. diff --git a/coverage_report/lcov.info b/coverage_report/lcov.info index 2308f06..bce1730 100644 --- a/coverage_report/lcov.info +++ b/coverage_report/lcov.info @@ -1,439 +1,539 @@ -TN: -SF:nrt_pytest_soft_asserts\soft_asserts.py -DA:1,1,rP4JHqAK36dzp9gm59AGTw -DA:2,1,Lhk5d8oicIJYwDoccMDdHg -DA:3,1,7Z9Lj4ed27Wf2hBX6jooEA -DA:4,1,7HpIEQVf5K0efdTzo05mJg -DA:5,1,gRHjawkciFUavd6j4zLvOw -DA:6,1,YOe9avog2o7Ju8MeMAAAVQ -DA:7,1,o7XN3CMj67n397EmDP0M3w -DA:10,1,HNyqmKt8LXuEyFUhKXn2Fw -DA:12,1,UHmfk7ksyBYu8Sx9/0IHzg -DA:13,1,R0c92vNi1ivibHjrrWbPQA -DA:15,1,HmADa1g/W1C2Vo9Wm4sNNA -DA:16,1,pgmlJfqqDy/innYws/2vQQ -DA:17,1,4ZSpmGMxKiPnLlJzv5xO/w -DA:19,1,HmADa1g/W1C2Vo9Wm4sNNA -DA:20,1,Z8FgyppPBvaHzfEbU8Nu1Q -DA:21,1,tOCpM2t08G+bDQxsc2V9ww -DA:24,1,CT9XrugR0VmgtyLiirko8A -DA:25,1,UWMFjPhL9cjw2PNid09Teg -DA:26,1,+SGCpVWY58FgRVOVeHAUaQ -DA:27,1,hrAqVZ4+nJDfZWiyo7USPQ -DA:28,1,qbcWZTaHHkFMNzZLiRiJWg -DA:29,1,x58qBQiiUN5gSgkjvQMEsA -DA:30,1,sRjzUmZYGNMCGdE1QaJWlg -DA:31,1,+OJDgVD9b3Z77L4f0EsXzQ -DA:33,1,j+CcxAIEiLeqjzkbiEHnZA -DA:34,1,WB6jzkVzsmrFH8EjsIPbnQ -DA:38,1,VWrOtSvpsG3XM/+ldlYTtw -DA:39,1,/ZvqiDY7XVzMiSFdpC6ZCg -DA:45,1,nbKTbmHFx7nM+aMlyHoQuQ -DA:46,1,cZwl7SZ7Og3/jQc9chklaw -DA:47,1,o/ICqHT57VM1Vq7HjJyy3A -DA:48,1,8gMV8dVZf8YNcIeIuAT9mg -DA:49,1,X04jIckKz8MzqNgMEd/zuQ -DA:50,1,a0nRmTlbYpRBNWYW8jYG3Q -DA:51,1,l6WuX2g4Er0/Rs+0xoDpbQ -DA:53,1,gFdnwIzxJ64X+nD2UauP7A -DA:54,1,euNjmfcAJnt/3VzkyXBypw -DA:55,1,VoZlPxzJT8iSDla3nXg6gA -DA:56,1,85MB8fTEWIJkzcB4ojosFw -DA:58,1,4UXU5l6KZiFcWiDuP3K00Q -DA:61,1,w/qRhPKePx2X8WQ5IFwHQw -DA:62,1,wLAvyX6ae7qHPfR0U5nuNQ -DA:64,1,xZzMcn+sbVdMvp1XWeSE3A -DA:65,1,TCKiqpktFcWqlWOlIXkr/Q -DA:67,1,uenxe9PzjuP0timvd1Fnpg -DA:69,1,UNg5Tja4vJsKufLKzB/kig -DA:70,1,cF/F8prOxehBDvWes+tMMg -DA:71,1,SddcyX1RBTAngKzlGAFzog -DA:72,1,Cnx2MsMmRgZZ9pxo0Kqc6Q -DA:73,1,kycMaH6XbPuAfUpgfG1Lbg -DA:75,1,eJ6zrxnLWn/k18a2vHOhRA -DA:77,1,sf7ootpAbWpm30XMolcs3w -DA:79,1,SVjSWEY0bM8LLJH3qp/3Og -DA:80,1,BSDSyrd28WloFCHGdn2FQQ -DA:81,1,SddcyX1RBTAngKzlGAFzog -DA:82,1,Cnx2MsMmRgZZ9pxo0Kqc6Q -DA:83,1,kycMaH6XbPuAfUpgfG1Lbg -DA:85,1,eJ6zrxnLWn/k18a2vHOhRA -DA:87,1,etggTVdvtKE8jcPY5Ud6HA -DA:89,1,fPOM4pkCeXOfL2Nmu5oikw -DA:90,1,KTOM1IoHRdymNOi2MOrfow -DA:91,1,SddcyX1RBTAngKzlGAFzog -DA:92,1,Cnx2MsMmRgZZ9pxo0Kqc6Q -DA:93,1,kycMaH6XbPuAfUpgfG1Lbg -DA:95,1,eJ6zrxnLWn/k18a2vHOhRA -DA:97,1,0jIPhSELFaTYpbWVs6d9/Q -DA:99,1,cs5FkiD5nnhu8NJ+8Cen0g -DA:100,1,MMzR/4FNHLQDvhbSfEhRjg -DA:101,1,SddcyX1RBTAngKzlGAFzog -DA:102,1,Cnx2MsMmRgZZ9pxo0Kqc6Q -DA:103,1,kycMaH6XbPuAfUpgfG1Lbg -DA:105,1,eJ6zrxnLWn/k18a2vHOhRA -DA:107,1,CnoF1Y4S/qPkG96tJoujbw -DA:109,1,UvVffiJP7JXRjZxgfdWzTQ -DA:110,1,DTuNQCIG/8w3N1XraVIKJg -DA:111,1,SddcyX1RBTAngKzlGAFzog -DA:112,1,Cnx2MsMmRgZZ9pxo0Kqc6Q -DA:113,1,kycMaH6XbPuAfUpgfG1Lbg -DA:115,1,eJ6zrxnLWn/k18a2vHOhRA -DA:117,1,PCEKL5os1ioD6YCVwlk+ag -DA:120,1,RCmMUfWixha1VrgX7Bduiw -DA:121,1,pHgMis/8XMKOPm2UF8jNhQ -DA:122,1,SddcyX1RBTAngKzlGAFzog -DA:123,1,Cnx2MsMmRgZZ9pxo0Kqc6Q -DA:124,1,kycMaH6XbPuAfUpgfG1Lbg -DA:126,1,eJ6zrxnLWn/k18a2vHOhRA -DA:128,1,+jKNCs350vd78OnXeegumQ -DA:130,1,FHzyfM5b2f0cviUxP0sBtQ -DA:131,1,/8l5Lzg4VhFCWJtchOun/g -DA:132,1,SddcyX1RBTAngKzlGAFzog -DA:133,1,Cnx2MsMmRgZZ9pxo0Kqc6Q -DA:134,1,kycMaH6XbPuAfUpgfG1Lbg -DA:136,1,eJ6zrxnLWn/k18a2vHOhRA -DA:138,1,ZQc40jF3qD1B3AyNPm1I1Q -DA:140,1,mRdl7VDZFExyHxk+JWpuOw -DA:141,1,kRdoTRONRrrlQqLVXKQM9A -DA:142,1,SddcyX1RBTAngKzlGAFzog -DA:143,1,Cnx2MsMmRgZZ9pxo0Kqc6Q -DA:144,1,kycMaH6XbPuAfUpgfG1Lbg -DA:146,1,eJ6zrxnLWn/k18a2vHOhRA -DA:148,1,S+7dWdjRUTubWx3qMmOJUw -DA:150,1,TJY/ZQHPl6v9wt0iiFUHgA -DA:151,1,ByiK0QTfZbN7pcEJMLnKnA -DA:152,1,SddcyX1RBTAngKzlGAFzog -DA:153,1,Cnx2MsMmRgZZ9pxo0Kqc6Q -DA:154,1,kycMaH6XbPuAfUpgfG1Lbg -DA:156,1,eJ6zrxnLWn/k18a2vHOhRA -DA:158,1,zt1nhGxxqvUyUWpnzGTeCQ -DA:160,1,caD9Ne8dKQaQHLzB/bHx1A -DA:161,1,x9Djg3dmtnNgOW88ewk5Gw -DA:162,1,SddcyX1RBTAngKzlGAFzog -DA:163,1,Cnx2MsMmRgZZ9pxo0Kqc6Q -DA:164,1,kycMaH6XbPuAfUpgfG1Lbg -DA:166,1,eJ6zrxnLWn/k18a2vHOhRA -DA:168,1,ppGp3Km7cerV6uMzjUBWZQ -DA:170,1,HOBRRotEGUH3HEJEbr0YUA -DA:171,1,vZnC+h5JTs752xY6owGb4g -DA:172,1,SddcyX1RBTAngKzlGAFzog -DA:173,1,Cnx2MsMmRgZZ9pxo0Kqc6Q -DA:174,1,kycMaH6XbPuAfUpgfG1Lbg -DA:176,1,eJ6zrxnLWn/k18a2vHOhRA -DA:178,1,NFkCJ6bmRT+bfudFdTLy7Q -DA:180,1,EGNruTy0X+Kp9Jkg/flHiw -DA:181,1,Ob0eQ+a3YhRVJHOBXnjrRA -DA:182,1,SddcyX1RBTAngKzlGAFzog -DA:183,1,Cnx2MsMmRgZZ9pxo0Kqc6Q -DA:184,1,kycMaH6XbPuAfUpgfG1Lbg -DA:186,1,eJ6zrxnLWn/k18a2vHOhRA -DA:188,1,6coMV2pxR/8SIG768LkGRA -DA:190,1,UxwR8N+Yj6i7HYMpbMepww -DA:191,1,RzRBmIy8MpMoehK51SMnPA -DA:192,1,SddcyX1RBTAngKzlGAFzog -DA:193,1,Cnx2MsMmRgZZ9pxo0Kqc6Q -DA:194,1,kycMaH6XbPuAfUpgfG1Lbg -DA:196,1,eJ6zrxnLWn/k18a2vHOhRA -DA:198,1,TIdfG65kxvz8De3eVGw6/w -DA:200,1,hUWpochcPK4BW5vofnIyIQ -DA:201,1,y+St3rSnijDiXGKMyWbmzQ -DA:202,1,SddcyX1RBTAngKzlGAFzog -DA:203,1,Cnx2MsMmRgZZ9pxo0Kqc6Q -DA:204,1,kycMaH6XbPuAfUpgfG1Lbg -DA:206,1,eJ6zrxnLWn/k18a2vHOhRA -DA:208,1,82swfyG1YYluLpbyGHOYhw -DA:211,1,BR+8hJcp/4J8oqZtHtAcUg -DA:212,1,Ey9ONPXZk4cV3nRUh/Npxw -DA:213,1,SddcyX1RBTAngKzlGAFzog -DA:214,1,Cnx2MsMmRgZZ9pxo0Kqc6Q -DA:215,1,kycMaH6XbPuAfUpgfG1Lbg -DA:217,1,eJ6zrxnLWn/k18a2vHOhRA -DA:219,1,Nro7lx18AIO7JgPJDEoUPQ -DA:221,1,hMZeVjp7IQfEeIhu7T6Qug -DA:222,1,Xul9OhdjYz634dcls+D5Sg -DA:223,1,SddcyX1RBTAngKzlGAFzog -DA:224,1,Cnx2MsMmRgZZ9pxo0Kqc6Q -DA:225,1,kycMaH6XbPuAfUpgfG1Lbg -DA:227,1,eJ6zrxnLWn/k18a2vHOhRA -DA:229,1,DGojR+yWl8hFuPCZryho9w -DA:231,1,LEr6iS1ehZPEln0938LgDA -DA:232,1,7CSN9PHZE0v8HuRE7SFpHQ -DA:233,1,SddcyX1RBTAngKzlGAFzog -DA:234,1,Cnx2MsMmRgZZ9pxo0Kqc6Q -DA:235,1,kycMaH6XbPuAfUpgfG1Lbg -DA:237,1,eJ6zrxnLWn/k18a2vHOhRA -DA:239,1,93tM7g9fcRkC6TVzhrQYqw -DA:242,1,ABp2lMt/GqraddSKyQroNg -DA:243,1,Gl3BECggWbqqjd2cqP4bRw -DA:244,1,SddcyX1RBTAngKzlGAFzog -DA:245,1,Cnx2MsMmRgZZ9pxo0Kqc6Q -DA:246,1,kycMaH6XbPuAfUpgfG1Lbg -DA:248,1,eJ6zrxnLWn/k18a2vHOhRA -DA:250,1,vnf/h1YAGWnCCqmImeSPng -DA:253,1,BEji8rHRRQd6Khq3M6eG1A -DA:254,1,OkhVZVE4+qXfT2qlBfFMCg -DA:255,1,SddcyX1RBTAngKzlGAFzog -DA:256,1,Cnx2MsMmRgZZ9pxo0Kqc6Q -DA:257,1,kycMaH6XbPuAfUpgfG1Lbg -DA:259,1,eJ6zrxnLWn/k18a2vHOhRA -DA:261,1,7Id/9w+MJ7mmStv5GmlnEQ -DA:263,1,xjcDBnSwra0OiNOAYAwoHA -DA:264,1,fzgfIgcG6g+2bwqhpFlehA -DA:265,1,1bm+6DR9CmDHJRc1CVEkAA -DA:266,1,SddcyX1RBTAngKzlGAFzog -DA:267,1,kycMaH6XbPuAfUpgfG1Lbg -DA:268,1,cCzhnT+1tmGi11b28Pmfwg -DA:269,1,FFqRFcnwn5yIyeIymeaJKA -DA:270,1,cHkzfZuxAWImImgqWlqrvA -DA:271,1,BPFPHxC1g838zXudSH9ZRw -DA:272,1,7N/JFuOs+JgNw/t49ouLjw -DA:274,1,eJ6zrxnLWn/k18a2vHOhRA -DA:276,1,ryobKX2nTRjIfTVwG2V/gA -DA:278,1,4Q+csjKa1iovQxt7Y739Jg -DA:280,1,5q+soJGeT4wj2rvA0ImJjw -DA:282,1,oGXcTu7RhYjXaCN+oyGeow -DA:283,1,WLm2H1W+3yCdma2u9U4Q8Q -DA:285,1,NgEyPOKakdhldTxcO/9WTw -DA:286,1,9tjsd4fQsN3iZRwF3XVokQ -DA:287,1,jVibu8inmyhUmI99MXh8cQ -DA:289,1,qCY/j2HCLFtYyfrTwAWWTA -DA:290,1,Lfip+xp+akrfc/rJIcMOhA -DA:292,1,KUmQB5oU4NORV0lSdMIZZQ -DA:294,1,dAfL0n8Wo5Ppew0jXSR2ew -DA:295,1,DSI4Ot1H4VotwCjdGHX7OA -DA:296,1,tQ6XNUsbh/EhqDe2FXTfEQ -DA:297,1,pQwmxEsLjfyo0RJUGYzkdQ -DA:298,1,MxcyyJW2FDs9bItTe2A0WQ -DA:299,1,niU61jbEbVCIu9EZqALWTw -DA:300,1,tQ6XNUsbh/EhqDe2FXTfEQ -DA:301,1,pQwmxEsLjfyo0RJUGYzkdQ -DA:303,1,n05AfdIFALNK7eRaTWeHow -DA:305,1,kyYMRg89VLWc8SyOrK8q5Q -DA:306,1,kqzLnAGZ+xnQSwV+BB/t0g -DA:307,1,58RbqM0oeMzNED75ozQZPA -DA:308,1,Gat2aS4cG4ecEfgNdw98MQ -DA:310,1,0d4Sudq2J47ghEvQaeqPWg -DA:312,1,kVvJCoZ+arOc3lZ+og4IEg -DA:318,1,ogP0iNXJ2rXGUSaYFfx0HQ -DA:320,1,rKc6OtluApu4vUPkue80OA -DA:321,1,51oFRiFZA8XRplZCPT+gSA -DA:322,1,D+1gEQAN6fkTn2TYmA0kkQ -DA:324,1,cNL8bb7c9LibXQYEYcASDg -DA:334,1,NXnbOz6yv8VObuskZ3a09w -DA:336,1,4Ai509LeMB+eQOSsyF0ceg -DA:338,1,jsx3/YHv5T+3CO5a2lRGpQ -DA:339,1,jv3zm1wOeBalyM4h/jcIlw -DA:341,1,MZYNNYkbtsx2Hg+DZ/h3rg -DA:342,1,UgfgQM6wxrSfJ+EcPxgD7Q -DA:344,1,HmADa1g/W1C2Vo9Wm4sNNA -DA:345,1,YZHh1zdnsa3bb+dCKtCLig -DA:346,1,tWBXudt5bV+DpuYf1ygf2g -DA:348,1,HmADa1g/W1C2Vo9Wm4sNNA -DA:349,1,IGhNwPBj/a1FDMfnrvNhxA -DA:350,1,Lmo1GBciEu5kMSFvKCB7QA -DA:352,1,B+mxYdm1Xk4QgBlIJzGpEA -DA:353,1,/ZJ79mb3sx4CFjKob6BxSg -DA:354,1,jJxyxzcVU/1lqNaNLAC6ww -DA:356,1,HmADa1g/W1C2Vo9Wm4sNNA -DA:357,1,AACMT/Hs4upHq8Ew2B9pkw -DA:358,1,imu7vnfF8HYHN8t4pc3HPg -DA:360,1,eWtV2DE74Bf4LMjyOYhztA -DA:361,1,5pS0mYO/k+dKwNQD7ujZUA -DA:362,1,1FgF9OmzkYtoOD3tJOYdMw -DA:364,1,mnoV0T4hEkr2W8HjAfJidA -DA:365,1,ackOWdJx2/IgtB/ELuvQJg -DA:367,1,X7Jctv7Y9ipZV+LU0Dd22Q -DA:368,1,MxfrZfLDXj6knarCE3/qnQ -DA:370,1,Wd4o5epo//51J+v3mzza3g -DA:372,1,uzhXwjJ9NZwxd4KflQkJjQ -DA:375,1,yv59v8KaHavQluMyO7xT6Q -DA:384,1,uF4zFbrMEq1Q2tBZDT+gFw -DA:385,1,5k5xFmIZN3sHRzFdi75O9g -DA:386,1,ZYD2ukZ1AkUEIF0999bzrA -DA:388,1,F7BxVjrSmcFdJg0cgJR0Ug -DA:390,1,LoEuE38WZEqXaWStadj74A -DA:391,1,eAsE5egSNvb89A+FpfM1WA -DA:393,1,kXRb0nLhg6TwkPdOsbGjMw -DA:394,1,TbpR75xr22MMdHYOups+mw -DA:398,1,ELJ7LUVpNFEr+chYkvSNXw -DA:399,1,axk8RZ5pktHgVzhXYOqXtQ -DA:400,1,j8tEkLkPGosEFeEBxt3NPg -DA:403,1,A5dwaEi+zaV7BTs2wPI/Vg -DA:404,1,n05AfdIFALNK7eRaTWeHow -DA:406,1,W/g8GJDAYJkSSurt59Mzfw -DA:408,1,9Jo4BOY7UWW5frAynDb+Tw -DA:409,1,axk8RZ5pktHgVzhXYOqXtQ -DA:410,1,wxkMEa+8R8RJLHGn+LRWNg -DA:413,1,A5dwaEi+zaV7BTs2wPI/Vg -DA:414,1,n05AfdIFALNK7eRaTWeHow -DA:416,1,W/g8GJDAYJkSSurt59Mzfw -DA:418,1,40Zj8qSBlqKplwMbRRNMSg -DA:420,1,4Q+csjKa1iovQxt7Y739Jg -DA:422,1,Bjf2yqUbzaNQ9uaOdvhPSg -DA:423,1,bzxIXyJyvP9dw3dM5CdD/g -DA:425,1,Nnqu9X+lU2lagW39QNhFWA -DA:426,1,AnuWxAUDyCmMczt8tp7TBw -DA:427,1,n4NDUGewH3j5dzwolDzf5A -DA:429,1,Nnqu9X+lU2lagW39QNhFWA -DA:430,1,uk5+o+CCjDLLIkm9IQLPtQ -DA:431,1,Yv5hMrZtSl+2+8NtPWsDLw -DA:433,1,Nnqu9X+lU2lagW39QNhFWA -DA:434,1,GflCFTf20x0JWupDDMETJA -DA:435,1,q0wIMUlz3srDH0Lg+BK9mA -DA:437,1,Nnqu9X+lU2lagW39QNhFWA -DA:438,1,FfYeIxYuJuJRN5k6/K6Y7Q -DA:439,1,1dqIY04d+M/CQT9EZGY5Fw -DA:441,1,Nnqu9X+lU2lagW39QNhFWA -DA:442,1,kF5iB3hgBW8WnyoggLwmfg -DA:443,1,Ahj3u1JF+byhc08crW0QLQ -DA:445,1,vNNTgt7R+e4BwFXobGtOlQ -DA:447,1,mNeFbVseW/qARC32FDxTEQ -DA:448,1,acMBX5l1srZ491NxjonaeA -DA:449,1,vmrz1EiRGmh1MNZlc7IsNQ -DA:450,1,vtZuiIh5DSDD2AlHVYOVKw -DA:452,1,Nnqu9X+lU2lagW39QNhFWA -DA:453,1,NmqLPZ3fyfxpCRHbaSiJOQ -DA:454,1,IrKsTNk7dtBPez/9W/Qj+g -DA:455,1,iecXh0RffNZfyyBKrCOmrA -DA:457,1,Nnqu9X+lU2lagW39QNhFWA -DA:458,1,Jb45BMi1721wc8ypt23M6g -DA:459,1,XceuZSE58kAuwRkXfCz3mg -DA:461,1,Nnqu9X+lU2lagW39QNhFWA -DA:462,1,EmQ+hxBlgQKFFnT9CP0d5Q -DA:464,1,wGa+SQn8bApFMeivn0kWYA -DA:465,1,rhh+0om3ksyfSzaGY9Tk0A -DA:466,1,3/vpxbGaiug1MaL3IlGbdg -DA:467,1,hKnFetzAAHrF5+pb/rogiw -DA:468,1,8D0ZFuVO1joTZliocqancg -DA:470,1,jJR6mVBBc4GHpLqW+Cu+AA -DA:473,1,i6ND+zEn608986XchiXxtg -DA:475,1,3x9modhLl1GVgSov1EafeA -DA:477,1,weueeF/E0b62qRvs9UfTHg -DA:478,1,XrM7y7C+Y6sArqjttjxCXQ -DA:479,1,Ot1FyVGKPkrAHd2zGU6llw -DA:480,1,cgC3xGILfIzNcib8vhwpKA -DA:483,1,faRZWFRR4ynrzXVRkmnejg -DA:485,1,OdUfkURaBEWAhtZgeU5gPg -DA:59,0,HjPpECiz2JbSEtrK7/YHZw -DA:396,0,bR1WU/8OFabRJ0osmdBSOQ -DA:481,0,6gJdd5cLy26USvBW9BRF1w -LF:317 -LH:314 -BRDA:15,0,0,1 -BRDA:19,0,1,1 -BRDA:0,1,0,1 -BRDA:19,1,1,1 -BRDA:25,2,0,1 -BRDA:26,2,1,1 -BRDA:70,3,0,1 -BRDA:75,3,1,1 -BRDA:80,4,0,1 -BRDA:85,4,1,1 -BRDA:90,5,0,1 -BRDA:95,5,1,1 -BRDA:100,6,0,1 -BRDA:105,6,1,1 -BRDA:110,7,0,1 -BRDA:115,7,1,1 -BRDA:121,8,0,1 -BRDA:126,8,1,1 -BRDA:131,9,0,1 -BRDA:136,9,1,1 -BRDA:141,10,0,1 -BRDA:146,10,1,1 -BRDA:151,11,0,1 -BRDA:156,11,1,1 -BRDA:161,12,0,1 -BRDA:166,12,1,1 -BRDA:171,13,0,1 -BRDA:176,13,1,1 -BRDA:181,14,0,1 -BRDA:186,14,1,1 -BRDA:191,15,0,1 -BRDA:196,15,1,1 -BRDA:201,16,0,1 -BRDA:206,16,1,1 -BRDA:212,17,0,1 -BRDA:217,17,1,1 -BRDA:222,18,0,1 -BRDA:227,18,1,1 -BRDA:232,19,0,1 -BRDA:237,19,1,1 -BRDA:243,20,0,1 -BRDA:248,20,1,1 -BRDA:254,21,0,1 -BRDA:259,21,1,1 -BRDA:270,22,0,1 -BRDA:274,22,1,1 -BRDA:295,23,0,1 -BRDA:298,23,1,1 -BRDA:299,24,0,1 -BRDA:303,24,1,1 -BRDA:0,25,0,1 -BRDA:305,25,1,1 -BRDA:0,26,0,1 -BRDA:308,26,1,1 -BRDA:0,27,0,1 -BRDA:321,27,1,1 -BRDA:0,28,0,1 -BRDA:324,28,1,1 -BRDA:334,28,2,1 -BRDA:0,29,0,1 -BRDA:334,29,1,1 -BRDA:336,29,2,1 -BRDA:344,30,0,1 -BRDA:348,30,1,1 -BRDA:348,31,0,1 -BRDA:352,31,1,1 -BRDA:352,32,0,1 -BRDA:356,32,1,1 -BRDA:356,33,0,1 -BRDA:360,33,1,1 -BRDA:360,34,0,1 -BRDA:364,34,1,1 -BRDA:0,35,0,1 -BRDA:385,35,1,1 -BRDA:391,36,0,1 -BRDA:393,36,1,1 -BRDA:396,37,0,- -BRDA:394,37,1,1 -BRDA:400,38,0,1 -BRDA:406,38,1,1 -BRDA:399,39,0,1 -BRDA:400,39,1,1 -BRDA:403,39,2,1 -BRDA:410,40,0,1 -BRDA:416,40,1,1 -BRDA:409,41,0,1 -BRDA:410,41,1,1 -BRDA:413,41,2,1 -BRDA:0,42,0,1 -BRDA:423,42,1,1 -BRDA:425,43,0,1 -BRDA:429,43,1,1 -BRDA:429,44,0,1 -BRDA:433,44,1,1 -BRDA:433,45,0,1 -BRDA:437,45,1,1 -BRDA:437,46,0,1 -BRDA:441,46,1,1 -BRDA:441,47,0,1 -BRDA:452,47,1,1 -BRDA:448,48,0,1 -BRDA:449,48,1,1 -BRDA:0,49,0,1 -BRDA:450,49,1,1 -BRDA:452,50,0,1 -BRDA:457,50,1,1 -BRDA:0,51,0,1 -BRDA:455,51,1,1 -BRDA:457,52,0,1 -BRDA:461,52,1,1 -BRDA:0,53,0,1 -BRDA:461,53,1,1 -BRDA:477,54,0,1 -BRDA:483,54,1,1 -BRF:110 -BRH:109 +SF:nrt_pytest_soft_asserts/soft_asserts.py +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:6,1 +DA:7,1 +DA:8,1 +DA:11,1 +DA:13,1 +DA:14,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:20,1 +DA:21,1 +DA:22,1 +DA:25,1 +DA:26,1 +DA:27,1 +DA:28,1 +DA:29,1 +DA:30,1 +DA:31,1 +DA:32,1 +DA:34,1 +DA:35,1 +DA:39,1 +DA:46,1 +DA:48,1 +DA:49,1 +DA:50,1 +DA:51,1 +DA:52,1 +DA:53,1 +DA:55,1 +DA:56,1 +DA:57,1 +DA:58,1 +DA:60,1 +DA:70,1 +DA:71,1 +DA:72,1 +DA:73,1 +DA:74,1 +DA:76,1 +DA:78,1 +DA:89,1 +DA:90,1 +DA:91,1 +DA:92,1 +DA:93,1 +DA:95,1 +DA:97,1 +DA:109,1 +DA:110,1 +DA:111,1 +DA:112,1 +DA:113,1 +DA:115,1 +DA:117,1 +DA:129,1 +DA:130,1 +DA:131,1 +DA:132,1 +DA:133,1 +DA:135,1 +DA:137,1 +DA:149,1 +DA:150,1 +DA:151,1 +DA:152,1 +DA:153,1 +DA:155,1 +DA:157,1 +DA:170,1 +DA:171,1 +DA:172,1 +DA:173,1 +DA:174,1 +DA:176,1 +DA:178,1 +DA:190,1 +DA:191,1 +DA:192,1 +DA:193,1 +DA:194,1 +DA:196,1 +DA:198,1 +DA:210,1 +DA:211,1 +DA:212,1 +DA:213,1 +DA:214,1 +DA:216,1 +DA:218,1 +DA:230,1 +DA:231,1 +DA:232,1 +DA:233,1 +DA:234,1 +DA:236,1 +DA:238,1 +DA:250,1 +DA:251,1 +DA:252,1 +DA:253,1 +DA:254,1 +DA:256,1 +DA:258,1 +DA:269,1 +DA:270,1 +DA:271,1 +DA:272,1 +DA:273,1 +DA:275,1 +DA:277,1 +DA:288,1 +DA:289,1 +DA:290,1 +DA:291,1 +DA:292,1 +DA:294,1 +DA:296,1 +DA:308,1 +DA:309,1 +DA:310,1 +DA:311,1 +DA:312,1 +DA:314,1 +DA:316,1 +DA:328,1 +DA:329,1 +DA:330,1 +DA:331,1 +DA:332,1 +DA:334,1 +DA:336,1 +DA:349,1 +DA:350,1 +DA:351,1 +DA:352,1 +DA:353,1 +DA:355,1 +DA:357,1 +DA:369,1 +DA:370,1 +DA:371,1 +DA:372,1 +DA:373,1 +DA:375,1 +DA:377,1 +DA:389,1 +DA:390,1 +DA:391,1 +DA:392,1 +DA:393,1 +DA:395,1 +DA:397,1 +DA:411,1 +DA:412,1 +DA:413,1 +DA:414,1 +DA:415,1 +DA:417,1 +DA:419,1 +DA:433,1 +DA:434,1 +DA:435,1 +DA:436,1 +DA:437,1 +DA:439,1 +DA:441,1 +DA:454,1 +DA:455,1 +DA:456,1 +DA:457,1 +DA:458,1 +DA:459,1 +DA:460,1 +DA:461,1 +DA:462,1 +DA:463,1 +DA:465,1 +DA:467,1 +DA:478,1 +DA:480,1 +DA:482,1 +DA:483,1 +DA:485,1 +DA:486,1 +DA:487,1 +DA:489,1 +DA:490,1 +DA:492,1 +DA:493,1 +DA:495,1 +DA:496,1 +DA:497,1 +DA:498,1 +DA:499,1 +DA:500,1 +DA:501,1 +DA:502,1 +DA:503,1 +DA:505,1 +DA:507,1 +DA:508,1 +DA:510,1 +DA:511,1 +DA:512,1 +DA:513,1 +DA:515,1 +DA:517,1 +DA:525,1 +DA:527,1 +DA:528,1 +DA:529,1 +DA:531,1 +DA:539,1 +DA:541,1 +DA:542,1 +DA:543,1 +DA:545,1 +DA:550,1 +DA:552,1 +DA:561,1 +DA:563,1 +DA:572,1 +DA:574,1 +DA:581,1 +DA:583,1 +DA:588,1 +DA:590,1 +DA:591,1 +DA:596,1 +DA:598,1 +DA:599,1 +DA:604,1 +DA:606,1 +DA:607,1 +DA:612,1 +DA:614,1 +DA:615,1 +DA:620,1 +DA:622,1 +DA:623,1 +DA:630,1 +DA:632,1 +DA:633,1 +DA:635,1 +DA:636,1 +DA:638,1 +DA:639,1 +DA:641,1 +DA:642,1 +DA:644,1 +DA:646,1 +DA:649,1 +DA:658,1 +DA:659,1 +DA:660,1 +DA:661,1 +DA:663,1 +DA:665,1 +DA:666,1 +DA:668,1 +DA:669,1 +DA:671,0 +DA:673,1 +DA:674,1 +DA:675,1 +DA:678,1 +DA:679,1 +DA:681,1 +DA:683,1 +DA:684,1 +DA:685,1 +DA:688,1 +DA:689,1 +DA:691,1 +DA:693,1 +DA:695,1 +DA:697,1 +DA:698,1 +DA:700,1 +DA:701,1 +DA:706,1 +DA:708,1 +DA:709,1 +DA:714,1 +DA:716,1 +DA:717,1 +DA:724,1 +DA:726,1 +DA:727,1 +DA:732,1 +DA:734,1 +DA:735,1 +DA:736,1 +DA:738,1 +DA:740,1 +DA:741,1 +DA:742,1 +DA:743,1 +DA:745,1 +DA:746,1 +DA:747,1 +DA:748,1 +DA:750,1 +DA:751,1 +DA:752,1 +DA:754,1 +DA:755,1 +DA:757,1 +DA:758,1 +DA:759,1 +DA:760,1 +DA:761,1 +DA:763,1 +DA:766,1 +DA:780,1 +DA:782,1 +DA:783,1 +DA:784,1 +DA:785,1 +DA:786,1 +DA:787,1 +DA:789,1 +DA:790,1 +DA:791,1 +DA:792,1 +DA:793,1 +DA:795,1 +DA:797,1 +LF:335 +LH:334 +FN:17,18,DuplicatedErrorsEnum.is_no_duplicated_errors_code_source +FNDA:1,DuplicatedErrorsEnum.is_no_duplicated_errors_code_source +FN:21,22,DuplicatedErrorsEnum.is_no_duplicated_errors_code_source_and_error +FNDA:1,DuplicatedErrorsEnum.is_no_duplicated_errors_code_source_and_error +FN:34,36,Failure.__str__ +FNDA:1,Failure.__str__ +FN:55,58,SoftAsserts.__init__ +FNDA:1,SoftAsserts.__init__ +FN:60,76,SoftAsserts.assert_true +FNDA:1,SoftAsserts.assert_true +FN:78,95,SoftAsserts.assert_false +FNDA:1,SoftAsserts.assert_false +FN:97,115,SoftAsserts.assert_equal +FNDA:1,SoftAsserts.assert_equal +FN:117,135,SoftAsserts.assert_not_equal +FNDA:1,SoftAsserts.assert_not_equal +FN:137,155,SoftAsserts.assert_greater +FNDA:1,SoftAsserts.assert_greater +FN:157,176,SoftAsserts.assert_greater_equal +FNDA:1,SoftAsserts.assert_greater_equal +FN:178,196,SoftAsserts.assert_less +FNDA:1,SoftAsserts.assert_less +FN:198,216,SoftAsserts.assert_less_equal +FNDA:1,SoftAsserts.assert_less_equal +FN:218,236,SoftAsserts.assert_is +FNDA:1,SoftAsserts.assert_is +FN:238,256,SoftAsserts.assert_is_not +FNDA:1,SoftAsserts.assert_is_not +FN:258,275,SoftAsserts.assert_is_none +FNDA:1,SoftAsserts.assert_is_none +FN:277,294,SoftAsserts.assert_is_not_none +FNDA:1,SoftAsserts.assert_is_not_none +FN:296,314,SoftAsserts.assert_in +FNDA:1,SoftAsserts.assert_in +FN:316,334,SoftAsserts.assert_not_in +FNDA:1,SoftAsserts.assert_not_in +FN:336,355,SoftAsserts.assert_len_equal +FNDA:1,SoftAsserts.assert_len_equal +FN:357,375,SoftAsserts.assert_is_instance +FNDA:1,SoftAsserts.assert_is_instance +FN:377,395,SoftAsserts.assert_not_is_instance +FNDA:1,SoftAsserts.assert_not_is_instance +FN:397,417,SoftAsserts.assert_almost_equal +FNDA:1,SoftAsserts.assert_almost_equal +FN:419,439,SoftAsserts.assert_not_almost_equal +FNDA:1,SoftAsserts.assert_not_almost_equal +FN:441,465,SoftAsserts.assert_raises +FNDA:1,SoftAsserts.assert_raises +FN:467,515,SoftAsserts.assert_raised_with +FNDA:1,SoftAsserts.assert_raised_with +FN:485,487,SoftAsserts.assert_raised_with.AssertRaises.__init__ +FNDA:1,SoftAsserts.assert_raised_with.AssertRaises.__init__ +FN:489,490,SoftAsserts.assert_raised_with.AssertRaises.__enter__ +FNDA:1,SoftAsserts.assert_raised_with.AssertRaises.__enter__ +FN:492,493,SoftAsserts.assert_raised_with.AssertRaises.__aenter__ +FNDA:1,SoftAsserts.assert_raised_with.AssertRaises.__aenter__ +FN:495,505,SoftAsserts.assert_raised_with.AssertRaises.__exit__ +FNDA:1,SoftAsserts.assert_raised_with.AssertRaises.__exit__ +FN:507,508,SoftAsserts.assert_raised_with.AssertRaises.__aexit__ +FNDA:1,SoftAsserts.assert_raised_with.AssertRaises.__aexit__ +FN:511,513,SoftAsserts.assert_raised_with.AssertRaises.__execute_on_failure +FNDA:1,SoftAsserts.assert_raised_with.AssertRaises.__execute_on_failure +FN:517,543,SoftAsserts.assert_all +FNDA:1,SoftAsserts.assert_all +FN:545,550,SoftAsserts.init_failure_steps +FNDA:1,SoftAsserts.init_failure_steps +FN:552,561,SoftAsserts.is_in_failure_steps +FNDA:1,SoftAsserts.is_in_failure_steps +FN:563,572,SoftAsserts.set_on_failure +FNDA:1,SoftAsserts.set_on_failure +FN:574,581,SoftAsserts.set_step +FNDA:1,SoftAsserts.set_step +FN:583,588,SoftAsserts.unset_step +FNDA:1,SoftAsserts.unset_step +FN:591,596,SoftAsserts.failures +FNDA:1,SoftAsserts.failures +FN:599,604,SoftAsserts.failure_steps +FNDA:1,SoftAsserts.failure_steps +FN:607,612,SoftAsserts.failure_steps +FNDA:1,SoftAsserts.failure_steps +FN:615,620,SoftAsserts.print_duplicate_errors +FNDA:1,SoftAsserts.print_duplicate_errors +FN:623,630,SoftAsserts.print_duplicate_errors +FNDA:1,SoftAsserts.print_duplicate_errors +FN:632,633,SoftAsserts.__enter__ +FNDA:1,SoftAsserts.__enter__ +FN:635,636,SoftAsserts.__aenter__ +FNDA:1,SoftAsserts.__aenter__ +FN:638,639,SoftAsserts.__exit__ +FNDA:1,SoftAsserts.__exit__ +FN:641,642,SoftAsserts.__aexit__ +FNDA:1,SoftAsserts.__aexit__ +FN:644,661,SoftAsserts.__append_to_failures +FNDA:1,SoftAsserts.__append_to_failures +FN:663,671,SoftAsserts.__is_append_failure +FNDA:1,SoftAsserts.__is_append_failure +FN:673,681,SoftAsserts.__is_code_source_failure_in_failures +FNDA:1,SoftAsserts.__is_code_source_failure_in_failures +FN:683,691,SoftAsserts.__is_code_source_and_error_failure_in_failures +FNDA:1,SoftAsserts.__is_code_source_and_error_failure_in_failures +FN:693,698,SoftAsserts.__execute_on_failure +FNDA:1,SoftAsserts.__execute_on_failure +FN:701,706,SoftAsserts.set_logger +FNDA:1,SoftAsserts.set_logger +FN:709,714,SoftAsserts.unset_logger +FNDA:1,SoftAsserts.unset_logger +FN:717,724,SoftAsserts.set_print_method +FNDA:1,SoftAsserts.set_print_method +FN:727,732,SoftAsserts.unset_print_method +FNDA:1,SoftAsserts.unset_print_method +FN:735,743,SoftAsserts.__print_error_to_log +FNDA:1,SoftAsserts.__print_error_to_log +FN:746,748,SoftAsserts.__validate_params +FNDA:1,SoftAsserts.__validate_params +FN:751,752,SoftAsserts.__is_almost_equal +FNDA:1,SoftAsserts.__is_almost_equal +FN:755,763,SoftAsserts.__get_failure_file_path_and_line_code_and_line_number +FNDA:1,SoftAsserts.__get_failure_file_path_and_line_code_and_line_number +FN:766,797,soft_asserts +FNDA:1,soft_asserts +FN:780,795,soft_asserts.soft_asserts_wrapper +FNDA:1,soft_asserts.soft_asserts_wrapper +FN:784,787,soft_asserts.soft_asserts_wrapper.soft_asserts_func_wrapper +FNDA:1,soft_asserts.soft_asserts_wrapper.soft_asserts_func_wrapper +FNF:62 +FNH:62 +BRDA:70,0,jump to line 71,1 +BRDA:70,0,jump to line 76,1 +BRDA:89,0,jump to line 90,1 +BRDA:89,0,jump to line 95,1 +BRDA:109,0,jump to line 110,1 +BRDA:109,0,jump to line 115,1 +BRDA:129,0,jump to line 130,1 +BRDA:129,0,jump to line 135,1 +BRDA:149,0,jump to line 150,1 +BRDA:149,0,jump to line 155,1 +BRDA:170,0,jump to line 171,1 +BRDA:170,0,jump to line 176,1 +BRDA:190,0,jump to line 191,1 +BRDA:190,0,jump to line 196,1 +BRDA:210,0,jump to line 211,1 +BRDA:210,0,jump to line 216,1 +BRDA:230,0,jump to line 231,1 +BRDA:230,0,jump to line 236,1 +BRDA:250,0,jump to line 251,1 +BRDA:250,0,jump to line 256,1 +BRDA:269,0,jump to line 270,1 +BRDA:269,0,jump to line 275,1 +BRDA:288,0,jump to line 289,1 +BRDA:288,0,jump to line 294,1 +BRDA:308,0,jump to line 309,1 +BRDA:308,0,jump to line 314,1 +BRDA:328,0,jump to line 329,1 +BRDA:328,0,jump to line 334,1 +BRDA:349,0,jump to line 350,1 +BRDA:349,0,jump to line 355,1 +BRDA:369,0,jump to line 370,1 +BRDA:369,0,jump to line 375,1 +BRDA:389,0,jump to line 390,1 +BRDA:389,0,jump to line 395,1 +BRDA:411,0,jump to line 412,1 +BRDA:411,0,jump to line 417,1 +BRDA:433,0,jump to line 434,1 +BRDA:433,0,jump to line 439,1 +BRDA:460,0,jump to line 461,1 +BRDA:460,0,jump to line 465,1 +BRDA:496,0,jump to line 497,1 +BRDA:496,0,jump to line 500,1 +BRDA:500,0,jump to line 501,1 +BRDA:500,0,jump to line 505,1 +BRDA:512,0,jump to line 513,1 +BRDA:512,0,return from function '__execute_on_failure',1 +BRDA:527,0,jump to line 528,1 +BRDA:527,0,return from function 'assert_all',1 +BRDA:658,0,jump to line 659,1 +BRDA:658,0,return from function '__append_to_failures',1 +BRDA:665,0,jump to line 666,1 +BRDA:665,0,jump to line 668,1 +BRDA:668,0,jump to line 669,1 +BRDA:668,0,jump to line 671,0 +BRDA:674,0,jump to line 675,1 +BRDA:674,0,jump to line 681,1 +BRDA:675,0,jump to line 674,1 +BRDA:675,0,jump to line 678,1 +BRDA:684,0,jump to line 685,1 +BRDA:684,0,jump to line 691,1 +BRDA:685,0,jump to line 684,1 +BRDA:685,0,jump to line 688,1 +BRDA:697,0,jump to line 698,1 +BRDA:697,0,return from function '__execute_on_failure',1 +BRDA:740,0,jump to line 741,1 +BRDA:740,0,jump to line 742,1 +BRDA:742,0,jump to line 743,1 +BRDA:742,0,return from function '__print_error_to_log',1 +BRDA:747,0,jump to line 748,1 +BRDA:747,0,return from function '__validate_params',1 +BRDA:782,0,jump to line 783,1 +BRDA:782,0,jump to line 789,1 +BRF:72 +BRH:71 end_of_record diff --git a/coverage_report/report.json b/coverage_report/report.json index 6474278..40e8d65 100644 --- a/coverage_report/report.json +++ b/coverage_report/report.json @@ -1,12 +1,13 @@ { "meta": { - "version": "7.3.0", - "timestamp": "2025-12-19T20:05:53.758318", + "format": 3, + "version": "7.13.1", + "timestamp": "2026-01-20T09:39:36.656840", "branch_coverage": true, "show_contexts": false }, "files": { - "nrt_pytest_soft_asserts\\soft_asserts.py": { + "nrt_pytest_soft_asserts/soft_asserts.py": { "executed_lines": [ 1, 2, @@ -15,16 +16,16 @@ 5, 6, 7, - 10, - 12, + 8, + 11, 13, - 15, + 14, 16, 17, - 19, + 18, 20, 21, - 24, + 22, 25, 26, 27, @@ -32,41 +33,29 @@ 29, 30, 31, - 33, + 32, 34, - 38, + 35, 39, - 45, 46, - 47, 48, 49, 50, 51, + 52, 53, - 54, 55, 56, + 57, 58, - 61, - 62, - 64, - 65, - 67, - 69, + 60, 70, 71, 72, 73, - 75, - 77, - 79, - 80, - 81, - 82, - 83, - 85, - 87, + 74, + 76, + 78, 89, 90, 91, @@ -74,13 +63,6 @@ 93, 95, 97, - 99, - 100, - 101, - 102, - 103, - 105, - 107, 109, 110, 111, @@ -88,41 +70,20 @@ 113, 115, 117, - 120, - 121, - 122, - 123, - 124, - 126, - 128, + 129, 130, 131, 132, 133, - 134, - 136, - 138, - 140, - 141, - 142, - 143, - 144, - 146, - 148, + 135, + 137, + 149, 150, 151, 152, 153, - 154, - 156, - 158, - 160, - 161, - 162, - 163, - 164, - 166, - 168, + 155, + 157, 170, 171, 172, @@ -130,13 +91,6 @@ 174, 176, 178, - 180, - 181, - 182, - 183, - 184, - 186, - 188, 190, 191, 192, @@ -144,244 +98,280 @@ 194, 196, 198, - 200, - 201, - 202, - 203, - 204, - 206, - 208, + 210, 211, 212, 213, 214, - 215, - 217, - 219, - 221, - 222, - 223, - 224, - 225, - 227, - 229, + 216, + 218, + 230, 231, 232, 233, 234, - 235, - 237, - 239, - 242, - 243, - 244, - 245, - 246, - 248, + 236, + 238, 250, + 251, + 252, 253, 254, - 255, 256, - 257, - 259, - 261, - 263, - 264, - 265, - 266, - 267, - 268, + 258, 269, 270, 271, 272, - 274, - 276, - 278, - 280, - 282, - 283, - 285, - 286, - 287, + 273, + 275, + 277, + 288, 289, 290, + 291, 292, 294, - 295, 296, - 297, - 298, - 299, - 300, - 301, - 303, - 305, - 306, - 307, 308, + 309, 310, + 311, 312, - 318, - 320, - 321, - 322, - 324, + 314, + 316, + 328, + 329, + 330, + 331, + 332, 334, 336, - 338, - 339, - 341, - 342, - 344, - 345, - 346, - 348, 349, 350, + 351, 352, 353, - 354, - 356, + 355, 357, - 358, - 360, - 361, - 362, - 364, - 365, - 367, - 368, + 369, 370, + 371, 372, + 373, 375, - 384, - 385, - 386, - 388, + 377, + 389, 390, 391, + 392, 393, - 394, - 398, - 399, - 400, - 403, - 404, - 406, - 408, - 409, - 410, + 395, + 397, + 411, + 412, 413, 414, - 416, - 418, - 420, - 422, - 423, - 425, - 426, - 427, - 429, - 430, - 431, + 415, + 417, + 419, 433, 434, 435, + 436, 437, - 438, 439, 441, - 442, - 443, - 445, - 447, - 448, - 449, - 450, - 452, - 453, 454, 455, + 456, 457, 458, 459, + 460, 461, 462, - 464, + 463, 465, - 466, 467, - 468, - 470, - 473, - 475, - 477, 478, - 479, 480, + 482, 483, - 485 + 485, + 486, + 487, + 489, + 490, + 492, + 493, + 495, + 496, + 497, + 498, + 499, + 500, + 501, + 502, + 503, + 505, + 507, + 508, + 510, + 511, + 512, + 513, + 515, + 517, + 525, + 527, + 528, + 529, + 531, + 539, + 541, + 542, + 543, + 545, + 550, + 552, + 561, + 563, + 572, + 574, + 581, + 583, + 588, + 590, + 591, + 596, + 598, + 599, + 604, + 606, + 607, + 612, + 614, + 615, + 620, + 622, + 623, + 630, + 632, + 633, + 635, + 636, + 638, + 639, + 641, + 642, + 644, + 646, + 649, + 658, + 659, + 660, + 661, + 663, + 665, + 666, + 668, + 669, + 673, + 674, + 675, + 678, + 679, + 681, + 683, + 684, + 685, + 688, + 689, + 691, + 693, + 695, + 697, + 698, + 700, + 701, + 706, + 708, + 709, + 714, + 716, + 717, + 724, + 726, + 727, + 732, + 734, + 735, + 736, + 738, + 740, + 741, + 742, + 743, + 745, + 746, + 747, + 748, + 750, + 751, + 752, + 754, + 755, + 757, + 758, + 759, + 760, + 761, + 763, + 766, + 780, + 782, + 783, + 784, + 785, + 786, + 787, + 789, + 790, + 791, + 792, + 793, + 795, + 797 ], "summary": { - "covered_lines": 314, - "num_statements": 317, - "percent_covered": 99.06323185011709, + "covered_lines": 334, + "num_statements": 335, + "percent_covered": 99.5085995085995, "percent_covered_display": "99", - "missing_lines": 3, + "missing_lines": 1, "excluded_lines": 0, - "num_branches": 110, + "percent_statements_covered": 99.70149253731343, + "percent_statements_covered_display": "99", + "num_branches": 72, "num_partial_branches": 1, - "covered_branches": 109, - "missing_branches": 1 + "covered_branches": 71, + "missing_branches": 1, + "percent_branches_covered": 98.61111111111111, + "percent_branches_covered_display": "99" }, "missing_lines": [ - 59, - 396, - 481 + 671 ], "excluded_lines": [], "executed_branches": [ [ - 16, - 15 + 70, + 71 ], [ - 16, - 19 - ], - [ - 20, - -10 - ], - [ - 20, - 19 - ], - [ - 24, - 25 - ], - [ - 24, - 26 - ], - [ - 69, - 70 - ], - [ - 69, - 75 - ], - [ - 79, - 80 - ], - [ - 79, - 85 + 70, + 76 ], [ 89, @@ -391,14 +381,6 @@ 89, 95 ], - [ - 99, - 100 - ], - [ - 99, - 105 - ], [ 109, 110 @@ -408,44 +390,20 @@ 115 ], [ - 120, - 121 + 129, + 130 ], [ - 120, - 126 + 129, + 135 ], [ - 130, - 131 + 149, + 150 ], [ - 130, - 136 - ], - [ - 140, - 141 - ], - [ - 140, - 146 - ], - [ - 150, - 151 - ], - [ - 150, - 156 - ], - [ - 160, - 161 - ], - [ - 160, - 166 + 149, + 155 ], [ 170, @@ -455,14 +413,6 @@ 170, 176 ], - [ - 180, - 181 - ], - [ - 180, - 186 - ], [ 190, 191 @@ -472,52 +422,28 @@ 196 ], [ - 200, - 201 - ], - [ - 200, - 206 - ], - [ - 211, - 212 - ], - [ - 211, - 217 - ], - [ - 221, - 222 - ], - [ - 221, - 227 - ], - [ - 231, - 232 + 210, + 211 ], [ - 231, - 237 + 210, + 216 ], [ - 242, - 243 + 230, + 231 ], [ - 242, - 248 + 230, + 236 ], [ - 253, - 254 + 250, + 251 ], [ - 253, - 259 + 250, + 256 ], [ 269, @@ -525,295 +451,3163 @@ ], [ 269, - 274 - ], - [ - 294, - 295 - ], - [ - 294, - 298 - ], - [ - 298, - 299 + 275 ], [ - 298, - 303 + 288, + 289 ], [ - 306, - -280 + 288, + 294 ], [ - 306, - 305 + 308, + 309 ], [ - 307, - -305 + 308, + 314 ], [ - 307, - 308 + 328, + 329 ], [ - 320, - -312 - ], - [ - 320, - 321 - ], - [ - 324, - -324 - ], - [ - 324, - 324 - ], - [ - 324, + 328, 334 ], - [ - 334, - -334 - ], - [ - 334, - 334 - ], - [ - 334, - 336 - ], - [ - 345, - 344 - ], - [ - 345, - 348 - ], [ 349, - 348 + 350 ], [ 349, - 352 - ], - [ - 353, - 352 - ], - [ - 353, - 356 - ], - [ - 357, - 356 + 355 ], [ - 357, - 360 + 369, + 370 ], [ - 361, - 360 + 369, + 375 ], [ - 361, - 364 + 389, + 390 ], [ - 384, - -370 + 389, + 395 ], [ - 384, - 385 + 411, + 412 ], [ - 390, - 391 + 411, + 417 ], [ - 390, - 393 + 433, + 434 ], [ - 393, - 394 + 433, + 439 ], [ - 399, - 400 - ], - [ - 399, - 406 - ], - [ - 400, - 399 - ], - [ - 400, - 400 + 460, + 461 ], [ - 400, - 403 + 460, + 465 ], [ - 409, - 410 + 496, + 497 ], [ - 409, - 416 + 496, + 500 ], [ - 410, - 409 + 500, + 501 ], [ - 410, - 410 + 500, + 505 ], [ - 410, - 413 + 512, + -510 ], [ - 422, - -418 + 512, + 513 ], [ - 422, - 423 + 527, + -517 ], [ - 426, - 425 + 527, + 528 ], [ - 426, - 429 + 658, + -644 ], [ - 430, - 429 + 658, + 659 ], [ - 430, - 433 + 665, + 666 ], [ - 434, - 433 + 665, + 668 ], [ - 434, - 437 + 668, + 669 ], [ - 438, - 437 + 674, + 675 ], [ - 438, - 441 + 674, + 681 ], [ - 442, - 441 + 675, + 674 ], [ - 442, - 452 + 675, + 678 ], [ - 447, - 448 + 684, + 685 ], [ - 447, - 449 + 684, + 691 ], [ - 449, - -441 + 685, + 684 ], [ - 449, - 450 + 685, + 688 ], [ - 453, - 452 + 697, + -693 ], [ - 453, - 457 + 697, + 698 ], [ - 454, - -452 + 740, + 741 ], [ - 454, - 455 + 740, + 742 ], [ - 458, - 457 + 742, + -734 ], [ - 458, - 461 + 742, + 743 ], [ - 462, - -38 + 747, + -745 ], [ - 462, - 461 + 747, + 748 ], [ - 478, - 477 + 782, + 783 ], [ - 478, - 483 + 782, + 789 ] ], "missing_branches": [ [ - 393, - 396 + 668, + 671 ] - ] + ], + "functions": { + "DuplicatedErrorsEnum.is_no_duplicated_errors_code_source": { + "executed_lines": [ + 18 + ], + "summary": { + "covered_lines": 1, + "num_statements": 1, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 0, + "num_partial_branches": 0, + "covered_branches": 0, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 17, + "executed_branches": [], + "missing_branches": [] + }, + "DuplicatedErrorsEnum.is_no_duplicated_errors_code_source_and_error": { + "executed_lines": [ + 22 + ], + "summary": { + "covered_lines": 1, + "num_statements": 1, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 0, + "num_partial_branches": 0, + "covered_branches": 0, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 21, + "executed_branches": [], + "missing_branches": [] + }, + "Failure.__str__": { + "executed_lines": [ + 35 + ], + "summary": { + "covered_lines": 1, + "num_statements": 1, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 0, + "num_partial_branches": 0, + "covered_branches": 0, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 34, + "executed_branches": [], + "missing_branches": [] + }, + "SoftAsserts.__init__": { + "executed_lines": [ + 56, + 57, + 58 + ], + "summary": { + "covered_lines": 3, + "num_statements": 3, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 0, + "num_partial_branches": 0, + "covered_branches": 0, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 55, + "executed_branches": [], + "missing_branches": [] + }, + "SoftAsserts.assert_true": { + "executed_lines": [ + 70, + 71, + 72, + 73, + 74, + 76 + ], + "summary": { + "covered_lines": 6, + "num_statements": 6, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 2, + "num_partial_branches": 0, + "covered_branches": 2, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 60, + "executed_branches": [ + [ + 70, + 71 + ], + [ + 70, + 76 + ] + ], + "missing_branches": [] + }, + "SoftAsserts.assert_false": { + "executed_lines": [ + 89, + 90, + 91, + 92, + 93, + 95 + ], + "summary": { + "covered_lines": 6, + "num_statements": 6, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 2, + "num_partial_branches": 0, + "covered_branches": 2, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 78, + "executed_branches": [ + [ + 89, + 90 + ], + [ + 89, + 95 + ] + ], + "missing_branches": [] + }, + "SoftAsserts.assert_equal": { + "executed_lines": [ + 109, + 110, + 111, + 112, + 113, + 115 + ], + "summary": { + "covered_lines": 6, + "num_statements": 6, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 2, + "num_partial_branches": 0, + "covered_branches": 2, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 97, + "executed_branches": [ + [ + 109, + 110 + ], + [ + 109, + 115 + ] + ], + "missing_branches": [] + }, + "SoftAsserts.assert_not_equal": { + "executed_lines": [ + 129, + 130, + 131, + 132, + 133, + 135 + ], + "summary": { + "covered_lines": 6, + "num_statements": 6, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 2, + "num_partial_branches": 0, + "covered_branches": 2, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 117, + "executed_branches": [ + [ + 129, + 130 + ], + [ + 129, + 135 + ] + ], + "missing_branches": [] + }, + "SoftAsserts.assert_greater": { + "executed_lines": [ + 149, + 150, + 151, + 152, + 153, + 155 + ], + "summary": { + "covered_lines": 6, + "num_statements": 6, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 2, + "num_partial_branches": 0, + "covered_branches": 2, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 137, + "executed_branches": [ + [ + 149, + 150 + ], + [ + 149, + 155 + ] + ], + "missing_branches": [] + }, + "SoftAsserts.assert_greater_equal": { + "executed_lines": [ + 170, + 171, + 172, + 173, + 174, + 176 + ], + "summary": { + "covered_lines": 6, + "num_statements": 6, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 2, + "num_partial_branches": 0, + "covered_branches": 2, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 157, + "executed_branches": [ + [ + 170, + 171 + ], + [ + 170, + 176 + ] + ], + "missing_branches": [] + }, + "SoftAsserts.assert_less": { + "executed_lines": [ + 190, + 191, + 192, + 193, + 194, + 196 + ], + "summary": { + "covered_lines": 6, + "num_statements": 6, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 2, + "num_partial_branches": 0, + "covered_branches": 2, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 178, + "executed_branches": [ + [ + 190, + 191 + ], + [ + 190, + 196 + ] + ], + "missing_branches": [] + }, + "SoftAsserts.assert_less_equal": { + "executed_lines": [ + 210, + 211, + 212, + 213, + 214, + 216 + ], + "summary": { + "covered_lines": 6, + "num_statements": 6, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 2, + "num_partial_branches": 0, + "covered_branches": 2, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 198, + "executed_branches": [ + [ + 210, + 211 + ], + [ + 210, + 216 + ] + ], + "missing_branches": [] + }, + "SoftAsserts.assert_is": { + "executed_lines": [ + 230, + 231, + 232, + 233, + 234, + 236 + ], + "summary": { + "covered_lines": 6, + "num_statements": 6, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 2, + "num_partial_branches": 0, + "covered_branches": 2, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 218, + "executed_branches": [ + [ + 230, + 231 + ], + [ + 230, + 236 + ] + ], + "missing_branches": [] + }, + "SoftAsserts.assert_is_not": { + "executed_lines": [ + 250, + 251, + 252, + 253, + 254, + 256 + ], + "summary": { + "covered_lines": 6, + "num_statements": 6, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 2, + "num_partial_branches": 0, + "covered_branches": 2, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 238, + "executed_branches": [ + [ + 250, + 251 + ], + [ + 250, + 256 + ] + ], + "missing_branches": [] + }, + "SoftAsserts.assert_is_none": { + "executed_lines": [ + 269, + 270, + 271, + 272, + 273, + 275 + ], + "summary": { + "covered_lines": 6, + "num_statements": 6, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 2, + "num_partial_branches": 0, + "covered_branches": 2, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 258, + "executed_branches": [ + [ + 269, + 270 + ], + [ + 269, + 275 + ] + ], + "missing_branches": [] + }, + "SoftAsserts.assert_is_not_none": { + "executed_lines": [ + 288, + 289, + 290, + 291, + 292, + 294 + ], + "summary": { + "covered_lines": 6, + "num_statements": 6, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 2, + "num_partial_branches": 0, + "covered_branches": 2, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 277, + "executed_branches": [ + [ + 288, + 289 + ], + [ + 288, + 294 + ] + ], + "missing_branches": [] + }, + "SoftAsserts.assert_in": { + "executed_lines": [ + 308, + 309, + 310, + 311, + 312, + 314 + ], + "summary": { + "covered_lines": 6, + "num_statements": 6, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 2, + "num_partial_branches": 0, + "covered_branches": 2, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 296, + "executed_branches": [ + [ + 308, + 309 + ], + [ + 308, + 314 + ] + ], + "missing_branches": [] + }, + "SoftAsserts.assert_not_in": { + "executed_lines": [ + 328, + 329, + 330, + 331, + 332, + 334 + ], + "summary": { + "covered_lines": 6, + "num_statements": 6, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 2, + "num_partial_branches": 0, + "covered_branches": 2, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 316, + "executed_branches": [ + [ + 328, + 329 + ], + [ + 328, + 334 + ] + ], + "missing_branches": [] + }, + "SoftAsserts.assert_len_equal": { + "executed_lines": [ + 349, + 350, + 351, + 352, + 353, + 355 + ], + "summary": { + "covered_lines": 6, + "num_statements": 6, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 2, + "num_partial_branches": 0, + "covered_branches": 2, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 336, + "executed_branches": [ + [ + 349, + 350 + ], + [ + 349, + 355 + ] + ], + "missing_branches": [] + }, + "SoftAsserts.assert_is_instance": { + "executed_lines": [ + 369, + 370, + 371, + 372, + 373, + 375 + ], + "summary": { + "covered_lines": 6, + "num_statements": 6, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 2, + "num_partial_branches": 0, + "covered_branches": 2, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 357, + "executed_branches": [ + [ + 369, + 370 + ], + [ + 369, + 375 + ] + ], + "missing_branches": [] + }, + "SoftAsserts.assert_not_is_instance": { + "executed_lines": [ + 389, + 390, + 391, + 392, + 393, + 395 + ], + "summary": { + "covered_lines": 6, + "num_statements": 6, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 2, + "num_partial_branches": 0, + "covered_branches": 2, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 377, + "executed_branches": [ + [ + 389, + 390 + ], + [ + 389, + 395 + ] + ], + "missing_branches": [] + }, + "SoftAsserts.assert_almost_equal": { + "executed_lines": [ + 411, + 412, + 413, + 414, + 415, + 417 + ], + "summary": { + "covered_lines": 6, + "num_statements": 6, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 2, + "num_partial_branches": 0, + "covered_branches": 2, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 397, + "executed_branches": [ + [ + 411, + 412 + ], + [ + 411, + 417 + ] + ], + "missing_branches": [] + }, + "SoftAsserts.assert_not_almost_equal": { + "executed_lines": [ + 433, + 434, + 435, + 436, + 437, + 439 + ], + "summary": { + "covered_lines": 6, + "num_statements": 6, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 2, + "num_partial_branches": 0, + "covered_branches": 2, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 419, + "executed_branches": [ + [ + 433, + 434 + ], + [ + 433, + 439 + ] + ], + "missing_branches": [] + }, + "SoftAsserts.assert_raises": { + "executed_lines": [ + 454, + 455, + 456, + 457, + 458, + 459, + 460, + 461, + 462, + 463, + 465 + ], + "summary": { + "covered_lines": 11, + "num_statements": 11, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 2, + "num_partial_branches": 0, + "covered_branches": 2, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 441, + "executed_branches": [ + [ + 460, + 461 + ], + [ + 460, + 465 + ] + ], + "missing_branches": [] + }, + "SoftAsserts.assert_raised_with": { + "executed_lines": [ + 478, + 480, + 482, + 483, + 485, + 489, + 492, + 495, + 507, + 510, + 511, + 515 + ], + "summary": { + "covered_lines": 12, + "num_statements": 12, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 0, + "num_partial_branches": 0, + "covered_branches": 0, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 467, + "executed_branches": [], + "missing_branches": [] + }, + "SoftAsserts.assert_raised_with.AssertRaises.__init__": { + "executed_lines": [ + 486, + 487 + ], + "summary": { + "covered_lines": 2, + "num_statements": 2, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 0, + "num_partial_branches": 0, + "covered_branches": 0, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 485, + "executed_branches": [], + "missing_branches": [] + }, + "SoftAsserts.assert_raised_with.AssertRaises.__enter__": { + "executed_lines": [ + 490 + ], + "summary": { + "covered_lines": 1, + "num_statements": 1, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 0, + "num_partial_branches": 0, + "covered_branches": 0, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 489, + "executed_branches": [], + "missing_branches": [] + }, + "SoftAsserts.assert_raised_with.AssertRaises.__aenter__": { + "executed_lines": [ + 493 + ], + "summary": { + "covered_lines": 1, + "num_statements": 1, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 0, + "num_partial_branches": 0, + "covered_branches": 0, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 492, + "executed_branches": [], + "missing_branches": [] + }, + "SoftAsserts.assert_raised_with.AssertRaises.__exit__": { + "executed_lines": [ + 496, + 497, + 498, + 499, + 500, + 501, + 502, + 503, + 505 + ], + "summary": { + "covered_lines": 9, + "num_statements": 9, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 4, + "num_partial_branches": 0, + "covered_branches": 4, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 495, + "executed_branches": [ + [ + 496, + 497 + ], + [ + 496, + 500 + ], + [ + 500, + 501 + ], + [ + 500, + 505 + ] + ], + "missing_branches": [] + }, + "SoftAsserts.assert_raised_with.AssertRaises.__aexit__": { + "executed_lines": [ + 508 + ], + "summary": { + "covered_lines": 1, + "num_statements": 1, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 0, + "num_partial_branches": 0, + "covered_branches": 0, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 507, + "executed_branches": [], + "missing_branches": [] + }, + "SoftAsserts.assert_raised_with.AssertRaises.__execute_on_failure": { + "executed_lines": [ + 512, + 513 + ], + "summary": { + "covered_lines": 2, + "num_statements": 2, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 2, + "num_partial_branches": 0, + "covered_branches": 2, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 511, + "executed_branches": [ + [ + 512, + -510 + ], + [ + 512, + 513 + ] + ], + "missing_branches": [] + }, + "SoftAsserts.assert_all": { + "executed_lines": [ + 525, + 527, + 528, + 529, + 531, + 539, + 541, + 542, + 543 + ], + "summary": { + "covered_lines": 9, + "num_statements": 9, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 2, + "num_partial_branches": 0, + "covered_branches": 2, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 517, + "executed_branches": [ + [ + 527, + -517 + ], + [ + 527, + 528 + ] + ], + "missing_branches": [] + }, + "SoftAsserts.init_failure_steps": { + "executed_lines": [ + 550 + ], + "summary": { + "covered_lines": 1, + "num_statements": 1, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 0, + "num_partial_branches": 0, + "covered_branches": 0, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 545, + "executed_branches": [], + "missing_branches": [] + }, + "SoftAsserts.is_in_failure_steps": { + "executed_lines": [ + 561 + ], + "summary": { + "covered_lines": 1, + "num_statements": 1, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 0, + "num_partial_branches": 0, + "covered_branches": 0, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 552, + "executed_branches": [], + "missing_branches": [] + }, + "SoftAsserts.set_on_failure": { + "executed_lines": [ + 572 + ], + "summary": { + "covered_lines": 1, + "num_statements": 1, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 0, + "num_partial_branches": 0, + "covered_branches": 0, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 563, + "executed_branches": [], + "missing_branches": [] + }, + "SoftAsserts.set_step": { + "executed_lines": [ + 581 + ], + "summary": { + "covered_lines": 1, + "num_statements": 1, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 0, + "num_partial_branches": 0, + "covered_branches": 0, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 574, + "executed_branches": [], + "missing_branches": [] + }, + "SoftAsserts.unset_step": { + "executed_lines": [ + 588 + ], + "summary": { + "covered_lines": 1, + "num_statements": 1, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 0, + "num_partial_branches": 0, + "covered_branches": 0, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 583, + "executed_branches": [], + "missing_branches": [] + }, + "SoftAsserts.failures": { + "executed_lines": [ + 596 + ], + "summary": { + "covered_lines": 1, + "num_statements": 1, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 0, + "num_partial_branches": 0, + "covered_branches": 0, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 591, + "executed_branches": [], + "missing_branches": [] + }, + "SoftAsserts.failure_steps": { + "executed_lines": [ + 612 + ], + "summary": { + "covered_lines": 1, + "num_statements": 1, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 0, + "num_partial_branches": 0, + "covered_branches": 0, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 607, + "executed_branches": [], + "missing_branches": [] + }, + "SoftAsserts.print_duplicate_errors": { + "executed_lines": [ + 630 + ], + "summary": { + "covered_lines": 1, + "num_statements": 1, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 0, + "num_partial_branches": 0, + "covered_branches": 0, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 623, + "executed_branches": [], + "missing_branches": [] + }, + "SoftAsserts.__enter__": { + "executed_lines": [ + 633 + ], + "summary": { + "covered_lines": 1, + "num_statements": 1, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 0, + "num_partial_branches": 0, + "covered_branches": 0, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 632, + "executed_branches": [], + "missing_branches": [] + }, + "SoftAsserts.__aenter__": { + "executed_lines": [ + 636 + ], + "summary": { + "covered_lines": 1, + "num_statements": 1, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 0, + "num_partial_branches": 0, + "covered_branches": 0, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 635, + "executed_branches": [], + "missing_branches": [] + }, + "SoftAsserts.__exit__": { + "executed_lines": [ + 639 + ], + "summary": { + "covered_lines": 1, + "num_statements": 1, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 0, + "num_partial_branches": 0, + "covered_branches": 0, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 638, + "executed_branches": [], + "missing_branches": [] + }, + "SoftAsserts.__aexit__": { + "executed_lines": [ + 642 + ], + "summary": { + "covered_lines": 1, + "num_statements": 1, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 0, + "num_partial_branches": 0, + "covered_branches": 0, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 641, + "executed_branches": [], + "missing_branches": [] + }, + "SoftAsserts.__append_to_failures": { + "executed_lines": [ + 646, + 649, + 658, + 659, + 660, + 661 + ], + "summary": { + "covered_lines": 6, + "num_statements": 6, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 2, + "num_partial_branches": 0, + "covered_branches": 2, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 644, + "executed_branches": [ + [ + 658, + -644 + ], + [ + 658, + 659 + ] + ], + "missing_branches": [] + }, + "SoftAsserts.__is_append_failure": { + "executed_lines": [ + 665, + 666, + 668, + 669 + ], + "summary": { + "covered_lines": 4, + "num_statements": 5, + "percent_covered": 77.77777777777777, + "percent_covered_display": "78", + "missing_lines": 1, + "excluded_lines": 0, + "percent_statements_covered": 80.0, + "percent_statements_covered_display": "80", + "num_branches": 4, + "num_partial_branches": 1, + "covered_branches": 3, + "missing_branches": 1, + "percent_branches_covered": 75.0, + "percent_branches_covered_display": "75" + }, + "missing_lines": [ + 671 + ], + "excluded_lines": [], + "start_line": 663, + "executed_branches": [ + [ + 665, + 666 + ], + [ + 665, + 668 + ], + [ + 668, + 669 + ] + ], + "missing_branches": [ + [ + 668, + 671 + ] + ] + }, + "SoftAsserts.__is_code_source_failure_in_failures": { + "executed_lines": [ + 674, + 675, + 678, + 679, + 681 + ], + "summary": { + "covered_lines": 5, + "num_statements": 5, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 4, + "num_partial_branches": 0, + "covered_branches": 4, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 673, + "executed_branches": [ + [ + 674, + 675 + ], + [ + 674, + 681 + ], + [ + 675, + 674 + ], + [ + 675, + 678 + ] + ], + "missing_branches": [] + }, + "SoftAsserts.__is_code_source_and_error_failure_in_failures": { + "executed_lines": [ + 684, + 685, + 688, + 689, + 691 + ], + "summary": { + "covered_lines": 5, + "num_statements": 5, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 4, + "num_partial_branches": 0, + "covered_branches": 4, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 683, + "executed_branches": [ + [ + 684, + 685 + ], + [ + 684, + 691 + ], + [ + 685, + 684 + ], + [ + 685, + 688 + ] + ], + "missing_branches": [] + }, + "SoftAsserts.__execute_on_failure": { + "executed_lines": [ + 695, + 697, + 698 + ], + "summary": { + "covered_lines": 3, + "num_statements": 3, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 2, + "num_partial_branches": 0, + "covered_branches": 2, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 693, + "executed_branches": [ + [ + 697, + -693 + ], + [ + 697, + 698 + ] + ], + "missing_branches": [] + }, + "SoftAsserts.set_logger": { + "executed_lines": [ + 706 + ], + "summary": { + "covered_lines": 1, + "num_statements": 1, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 0, + "num_partial_branches": 0, + "covered_branches": 0, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 701, + "executed_branches": [], + "missing_branches": [] + }, + "SoftAsserts.unset_logger": { + "executed_lines": [ + 714 + ], + "summary": { + "covered_lines": 1, + "num_statements": 1, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 0, + "num_partial_branches": 0, + "covered_branches": 0, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 709, + "executed_branches": [], + "missing_branches": [] + }, + "SoftAsserts.set_print_method": { + "executed_lines": [ + 724 + ], + "summary": { + "covered_lines": 1, + "num_statements": 1, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 0, + "num_partial_branches": 0, + "covered_branches": 0, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 717, + "executed_branches": [], + "missing_branches": [] + }, + "SoftAsserts.unset_print_method": { + "executed_lines": [ + 732 + ], + "summary": { + "covered_lines": 1, + "num_statements": 1, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 0, + "num_partial_branches": 0, + "covered_branches": 0, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 727, + "executed_branches": [], + "missing_branches": [] + }, + "SoftAsserts.__print_error_to_log": { + "executed_lines": [ + 736, + 738, + 740, + 741, + 742, + 743 + ], + "summary": { + "covered_lines": 6, + "num_statements": 6, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 4, + "num_partial_branches": 0, + "covered_branches": 4, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 735, + "executed_branches": [ + [ + 740, + 741 + ], + [ + 740, + 742 + ], + [ + 742, + -734 + ], + [ + 742, + 743 + ] + ], + "missing_branches": [] + }, + "SoftAsserts.__validate_params": { + "executed_lines": [ + 747, + 748 + ], + "summary": { + "covered_lines": 2, + "num_statements": 2, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 2, + "num_partial_branches": 0, + "covered_branches": 2, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 746, + "executed_branches": [ + [ + 747, + -745 + ], + [ + 747, + 748 + ] + ], + "missing_branches": [] + }, + "SoftAsserts.__is_almost_equal": { + "executed_lines": [ + 752 + ], + "summary": { + "covered_lines": 1, + "num_statements": 1, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 0, + "num_partial_branches": 0, + "covered_branches": 0, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 751, + "executed_branches": [], + "missing_branches": [] + }, + "SoftAsserts.__get_failure_file_path_and_line_code_and_line_number": { + "executed_lines": [ + 757, + 758, + 759, + 760, + 761, + 763 + ], + "summary": { + "covered_lines": 6, + "num_statements": 6, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 0, + "num_partial_branches": 0, + "covered_branches": 0, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 755, + "executed_branches": [], + "missing_branches": [] + }, + "soft_asserts": { + "executed_lines": [ + 780, + 797 + ], + "summary": { + "covered_lines": 2, + "num_statements": 2, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 0, + "num_partial_branches": 0, + "covered_branches": 0, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 766, + "executed_branches": [], + "missing_branches": [] + }, + "soft_asserts.soft_asserts_wrapper": { + "executed_lines": [ + 782, + 783, + 784, + 789, + 790, + 791, + 792, + 793, + 795 + ], + "summary": { + "covered_lines": 9, + "num_statements": 9, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 2, + "num_partial_branches": 0, + "covered_branches": 2, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 780, + "executed_branches": [ + [ + 782, + 783 + ], + [ + 782, + 789 + ] + ], + "missing_branches": [] + }, + "soft_asserts.soft_asserts_wrapper.soft_asserts_func_wrapper": { + "executed_lines": [ + 785, + 786, + 787 + ], + "summary": { + "covered_lines": 3, + "num_statements": 3, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 0, + "num_partial_branches": 0, + "covered_branches": 0, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 784, + "executed_branches": [], + "missing_branches": [] + }, + "": { + "executed_lines": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 11, + 13, + 14, + 16, + 17, + 20, + 21, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 34, + 39, + 46, + 48, + 49, + 50, + 51, + 52, + 53, + 55, + 60, + 78, + 97, + 117, + 137, + 157, + 178, + 198, + 218, + 238, + 258, + 277, + 296, + 316, + 336, + 357, + 377, + 397, + 419, + 441, + 467, + 517, + 545, + 552, + 563, + 574, + 583, + 590, + 591, + 598, + 599, + 606, + 607, + 614, + 615, + 622, + 623, + 632, + 635, + 638, + 641, + 644, + 663, + 673, + 683, + 693, + 700, + 701, + 708, + 709, + 716, + 717, + 726, + 727, + 734, + 735, + 745, + 746, + 750, + 751, + 754, + 755, + 766 + ], + "summary": { + "covered_lines": 96, + "num_statements": 96, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 0, + "num_partial_branches": 0, + "covered_branches": 0, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 1, + "executed_branches": [], + "missing_branches": [] + } + }, + "classes": { + "DuplicatedErrorsEnum": { + "executed_lines": [ + 18, + 22 + ], + "summary": { + "covered_lines": 2, + "num_statements": 2, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 0, + "num_partial_branches": 0, + "covered_branches": 0, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 11, + "executed_branches": [], + "missing_branches": [] + }, + "Failure": { + "executed_lines": [ + 35 + ], + "summary": { + "covered_lines": 1, + "num_statements": 1, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 0, + "num_partial_branches": 0, + "covered_branches": 0, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 26, + "executed_branches": [], + "missing_branches": [] + }, + "SoftAsserts": { + "executed_lines": [ + 56, + 57, + 58, + 70, + 71, + 72, + 73, + 74, + 76, + 89, + 90, + 91, + 92, + 93, + 95, + 109, + 110, + 111, + 112, + 113, + 115, + 129, + 130, + 131, + 132, + 133, + 135, + 149, + 150, + 151, + 152, + 153, + 155, + 170, + 171, + 172, + 173, + 174, + 176, + 190, + 191, + 192, + 193, + 194, + 196, + 210, + 211, + 212, + 213, + 214, + 216, + 230, + 231, + 232, + 233, + 234, + 236, + 250, + 251, + 252, + 253, + 254, + 256, + 269, + 270, + 271, + 272, + 273, + 275, + 288, + 289, + 290, + 291, + 292, + 294, + 308, + 309, + 310, + 311, + 312, + 314, + 328, + 329, + 330, + 331, + 332, + 334, + 349, + 350, + 351, + 352, + 353, + 355, + 369, + 370, + 371, + 372, + 373, + 375, + 389, + 390, + 391, + 392, + 393, + 395, + 411, + 412, + 413, + 414, + 415, + 417, + 433, + 434, + 435, + 436, + 437, + 439, + 454, + 455, + 456, + 457, + 458, + 459, + 460, + 461, + 462, + 463, + 465, + 478, + 480, + 482, + 483, + 485, + 489, + 492, + 495, + 507, + 510, + 511, + 515, + 525, + 527, + 528, + 529, + 531, + 539, + 541, + 542, + 543, + 550, + 561, + 572, + 581, + 588, + 596, + 604, + 612, + 620, + 630, + 633, + 636, + 639, + 642, + 646, + 649, + 658, + 659, + 660, + 661, + 665, + 666, + 668, + 669, + 674, + 675, + 678, + 679, + 681, + 684, + 685, + 688, + 689, + 691, + 695, + 697, + 698, + 706, + 714, + 724, + 732, + 736, + 738, + 740, + 741, + 742, + 743, + 747, + 748, + 752, + 757, + 758, + 759, + 760, + 761, + 763 + ], + "summary": { + "covered_lines": 205, + "num_statements": 206, + "percent_covered": 99.25925925925925, + "percent_covered_display": "99", + "missing_lines": 1, + "excluded_lines": 0, + "percent_statements_covered": 99.51456310679612, + "percent_statements_covered_display": "99", + "num_branches": 64, + "num_partial_branches": 1, + "covered_branches": 63, + "missing_branches": 1, + "percent_branches_covered": 98.4375, + "percent_branches_covered_display": "98" + }, + "missing_lines": [ + 671 + ], + "excluded_lines": [], + "start_line": 39, + "executed_branches": [ + [ + 70, + 71 + ], + [ + 70, + 76 + ], + [ + 89, + 90 + ], + [ + 89, + 95 + ], + [ + 109, + 110 + ], + [ + 109, + 115 + ], + [ + 129, + 130 + ], + [ + 129, + 135 + ], + [ + 149, + 150 + ], + [ + 149, + 155 + ], + [ + 170, + 171 + ], + [ + 170, + 176 + ], + [ + 190, + 191 + ], + [ + 190, + 196 + ], + [ + 210, + 211 + ], + [ + 210, + 216 + ], + [ + 230, + 231 + ], + [ + 230, + 236 + ], + [ + 250, + 251 + ], + [ + 250, + 256 + ], + [ + 269, + 270 + ], + [ + 269, + 275 + ], + [ + 288, + 289 + ], + [ + 288, + 294 + ], + [ + 308, + 309 + ], + [ + 308, + 314 + ], + [ + 328, + 329 + ], + [ + 328, + 334 + ], + [ + 349, + 350 + ], + [ + 349, + 355 + ], + [ + 369, + 370 + ], + [ + 369, + 375 + ], + [ + 389, + 390 + ], + [ + 389, + 395 + ], + [ + 411, + 412 + ], + [ + 411, + 417 + ], + [ + 433, + 434 + ], + [ + 433, + 439 + ], + [ + 460, + 461 + ], + [ + 460, + 465 + ], + [ + 527, + -517 + ], + [ + 527, + 528 + ], + [ + 658, + -644 + ], + [ + 658, + 659 + ], + [ + 665, + 666 + ], + [ + 665, + 668 + ], + [ + 668, + 669 + ], + [ + 674, + 675 + ], + [ + 674, + 681 + ], + [ + 675, + 674 + ], + [ + 675, + 678 + ], + [ + 684, + 685 + ], + [ + 684, + 691 + ], + [ + 685, + 684 + ], + [ + 685, + 688 + ], + [ + 697, + -693 + ], + [ + 697, + 698 + ], + [ + 740, + 741 + ], + [ + 740, + 742 + ], + [ + 742, + -734 + ], + [ + 742, + 743 + ], + [ + 747, + -745 + ], + [ + 747, + 748 + ] + ], + "missing_branches": [ + [ + 668, + 671 + ] + ] + }, + "SoftAsserts.assert_raised_with.AssertRaises": { + "executed_lines": [ + 486, + 487, + 490, + 493, + 496, + 497, + 498, + 499, + 500, + 501, + 502, + 503, + 505, + 508, + 512, + 513 + ], + "summary": { + "covered_lines": 16, + "num_statements": 16, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 6, + "num_partial_branches": 0, + "covered_branches": 6, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 480, + "executed_branches": [ + [ + 496, + 497 + ], + [ + 496, + 500 + ], + [ + 500, + 501 + ], + [ + 500, + 505 + ], + [ + 512, + -510 + ], + [ + 512, + 513 + ] + ], + "missing_branches": [] + }, + "": { + "executed_lines": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 11, + 13, + 14, + 16, + 17, + 20, + 21, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 34, + 39, + 46, + 48, + 49, + 50, + 51, + 52, + 53, + 55, + 60, + 78, + 97, + 117, + 137, + 157, + 178, + 198, + 218, + 238, + 258, + 277, + 296, + 316, + 336, + 357, + 377, + 397, + 419, + 441, + 467, + 517, + 545, + 552, + 563, + 574, + 583, + 590, + 591, + 598, + 599, + 606, + 607, + 614, + 615, + 622, + 623, + 632, + 635, + 638, + 641, + 644, + 663, + 673, + 683, + 693, + 700, + 701, + 708, + 709, + 716, + 717, + 726, + 727, + 734, + 735, + 745, + 746, + 750, + 751, + 754, + 755, + 766, + 780, + 782, + 783, + 784, + 785, + 786, + 787, + 789, + 790, + 791, + 792, + 793, + 795, + 797 + ], + "summary": { + "covered_lines": 110, + "num_statements": 110, + "percent_covered": 100.0, + "percent_covered_display": "100", + "missing_lines": 0, + "excluded_lines": 0, + "percent_statements_covered": 100.0, + "percent_statements_covered_display": "100", + "num_branches": 2, + "num_partial_branches": 0, + "covered_branches": 2, + "missing_branches": 0, + "percent_branches_covered": 100.0, + "percent_branches_covered_display": "100" + }, + "missing_lines": [], + "excluded_lines": [], + "start_line": 1, + "executed_branches": [ + [ + 782, + 783 + ], + [ + 782, + 789 + ] + ], + "missing_branches": [] + } + } } }, "totals": { - "covered_lines": 314, - "num_statements": 317, - "percent_covered": 99.06323185011709, + "covered_lines": 334, + "num_statements": 335, + "percent_covered": 99.5085995085995, "percent_covered_display": "99", - "missing_lines": 3, + "missing_lines": 1, "excluded_lines": 0, - "num_branches": 110, + "percent_statements_covered": 99.70149253731343, + "percent_statements_covered_display": "99", + "num_branches": 72, "num_partial_branches": 1, - "covered_branches": 109, - "missing_branches": 1 + "covered_branches": 71, + "missing_branches": 1, + "percent_branches_covered": 98.61111111111111, + "percent_branches_covered_display": "99" } } \ No newline at end of file diff --git a/nrt_pytest_soft_asserts/__init__.py b/nrt_pytest_soft_asserts/__init__.py index 9833edd..405c614 100644 --- a/nrt_pytest_soft_asserts/__init__.py +++ b/nrt_pytest_soft_asserts/__init__.py @@ -1,3 +1,3 @@ -__version__ = '1.4.1' +__version__ = '2.0.0' diff --git a/nrt_pytest_soft_asserts/soft_asserts.py b/nrt_pytest_soft_asserts/soft_asserts.py index a5eb074..3f77914 100644 --- a/nrt_pytest_soft_asserts/soft_asserts.py +++ b/nrt_pytest_soft_asserts/soft_asserts.py @@ -1,6 +1,7 @@ import functools import linecache import os +from contextvars import ContextVar from dataclasses import dataclass from enum import Enum from typing import Callable, Optional, List @@ -42,30 +43,30 @@ class SoftAsserts: @author: Eyal Tuzon. """ - __failures: List[Failure] = [] + __failures_context: ContextVar[List[Failure]] = ContextVar('soft-asserts-context', default=None) + __logger = None __print_method: Optional[Callable] = None __current_step: Optional[str] = None - __failure_steps: List[str] = [] + __failure_steps: List[str] = None __on_failure: Callable = None __print_duplicate_errors: DuplicatedErrorsEnum def __init__(self): self.__validate_params() - self.__failures = [] + self.__failure_steps = [] self.__print_duplicate_errors = DuplicatedErrorsEnum.NO_DUPLICATED_ERRORS_CODE_SOURCE - def set_on_failure(self, on_failure: Callable): - self.__on_failure = on_failure - - def set_step(self, step: str): - self.__current_step = step - - def unset_step(self): - self.__current_step = None - def assert_true(self, condition, message=None, on_failure: Callable = None) -> bool: + """" + Asserts that the condition is True. + + :param condition: Condition to evaluate. + :param message: Optional message to display on failure. + :param on_failure: Optional callable to execute on failure. + :return: True if the condition is True, False otherwise. + """ if not condition: error = message or 'Expected True, got False.' self.__append_to_failures(error) @@ -75,6 +76,15 @@ def assert_true(self, condition, message=None, on_failure: Callable = None) -> b return True def assert_false(self, condition, message=None, on_failure: Callable = None) -> bool: + """ + Asserts that the condition is False. + + :param condition: Condition to evaluate. + :param message: Optional message to display on failure. + :param on_failure: Optional callable to execute on failure. + + :return: True if the condition is False, False otherwise. + """ if condition: error = message or 'Expected False, got True.' @@ -85,6 +95,16 @@ def assert_false(self, condition, message=None, on_failure: Callable = None) -> return True def assert_equal(self, first, second, message=None, on_failure: Callable = None) -> bool: + """ + Asserts that first is equal to second. + + :param first: First value. + :param second: Second value. + :param message: Optional message to display on failure. + :param on_failure: Optional callable to execute on failure. + + :return: True if first is equal to second, False otherwise. + """ if first != second: error = message or f'{first} != {second}' @@ -95,6 +115,16 @@ def assert_equal(self, first, second, message=None, on_failure: Callable = None) return True def assert_not_equal(self, first, second, message=None, on_failure: Callable = None) -> bool: + """ + Asserts that first is not equal to second. + + :param first: First value. + :param second: Second value. + :param message: Optional message to display on failure. + :param on_failure: Optional callable to execute on failure. + + :return: True if first is not equal to second, False otherwise. + """ if first == second: error = message or f'{first} == {second}' @@ -105,6 +135,16 @@ def assert_not_equal(self, first, second, message=None, on_failure: Callable = N return True def assert_greater(self, first, second, message=None, on_failure: Callable = None) -> bool: + """ + Asserts that first is greater than second. + + :param first: First value. + :param second: Second value. + :param message: Optional message to display on failure. + :param on_failure: Optional callable to execute on failure. + + :return: True if first is greater than second, False otherwise. + """ if first <= second: error = message or f'{first} is not greater than {second}' @@ -116,6 +156,16 @@ def assert_greater(self, first, second, message=None, on_failure: Callable = Non def assert_greater_equal( self, first, second, message=None, on_failure: Callable = None) -> bool: + """ + Asserts that first is greater than or equal to second. + + :param first: First value. + :param second: Second value. + :param message: Optional message to display on failure. + :param on_failure: Optional callable to execute on failure. + + :return: True if first is greater than or equal to second, False otherwise. + """ if first < second: error = message or f'{first} is not greater than or equal to {second}' @@ -126,6 +176,16 @@ def assert_greater_equal( return True def assert_less(self, first, second, message=None, on_failure: Callable = None) -> bool: + """ + Asserts that first is less than second. + + :param first: First value. + :param second: Second value. + :param message: Optional message to display on failure. + :param on_failure: Optional callable to execute on failure. + + :return: True if first is less than second, False otherwise. + """ if first >= second: error = message or f'{first} is not less than {second}' @@ -136,6 +196,16 @@ def assert_less(self, first, second, message=None, on_failure: Callable = None) return True def assert_less_equal(self, first, second, message=None, on_failure: Callable = None) -> bool: + """ + Asserts that first is less than or equal to second. + + :param first: First value. + :param second: Second value. + :param message: Optional message to display on failure. + :param on_failure: Optional callable to execute on failure. + + :return: True if first is less than or equal to second, False otherwise. + """ if first > second: error = message or f'{first} is not less than or equal to {second}' @@ -146,6 +216,16 @@ def assert_less_equal(self, first, second, message=None, on_failure: Callable = return True def assert_is(self, first, second, message=None, on_failure: Callable = None) -> bool: + """ + Asserts that first is second. + + :param first: First value. + :param second: Second value. + :param message: Optional message to display on failure. + :param on_failure: Optional callable to execute on failure. + + :return: True if first is second, False otherwise. + """ if first is not second: error = message or f'{first} is not {second}' @@ -156,6 +236,16 @@ def assert_is(self, first, second, message=None, on_failure: Callable = None) -> return True def assert_is_not(self, first, second, message=None, on_failure: Callable = None) -> bool: + """ + Asserts that first is not second. + + :param first: First value. + :param second: Second value. + :param message: Optional message to display on failure. + :param on_failure: Optional callable to execute on failure. + + :return: True if first is not second, False otherwise. + """ if first is second: error = message or f'{first} is {second}' @@ -166,6 +256,15 @@ def assert_is_not(self, first, second, message=None, on_failure: Callable = None return True def assert_is_none(self, obj, message=None, on_failure: Callable = None) -> bool: + """ + Asserts that the object is None. + + :param obj: Object to evaluate. + :param message: Optional message to display on failure. + :param on_failure: Optional callable to execute on failure. + + :return: True if the object is None, False otherwise. + """ if obj is not None: error = message or f'{obj} is not None' @@ -176,6 +275,15 @@ def assert_is_none(self, obj, message=None, on_failure: Callable = None) -> bool return True def assert_is_not_none(self, obj, message=None, on_failure: Callable = None) -> bool: + """ + Asserts that the object is not None. + + :param obj: Object to evaluate. + :param message: Optional message to display on failure. + :param on_failure: Optional callable to execute on failure. + + :return: True if the object is not None, False otherwise. + """ if obj is None: error = message or 'obj is None' @@ -186,6 +294,16 @@ def assert_is_not_none(self, obj, message=None, on_failure: Callable = None) -> return True def assert_in(self, obj, container, message=None, on_failure: Callable = None) -> bool: + """ + Asserts that the object is in the container. + + :param obj: Object to evaluate. + :param container: Container to check. + :param message: Optional message to display on failure. + :param on_failure: Optional callable to execute on failure. + + :return: True if the object is in the container, False otherwise. + """ if obj not in container: error = message or f'{obj} not in {container}' @@ -196,6 +314,16 @@ def assert_in(self, obj, container, message=None, on_failure: Callable = None) - return True def assert_not_in(self, obj, container, message=None, on_failure: Callable = None) -> bool: + """ + Asserts that the object is not in the container. + + :param obj: Object to evaluate. + :param container: Container to check. + :param message: Optional message to display on failure. + :param on_failure: Optional callable to execute on failure. + + :return: True if the object is not in the container, False otherwise. + """ if obj in container: error = message or f'{obj} in {container}' @@ -207,6 +335,16 @@ def assert_not_in(self, obj, container, message=None, on_failure: Callable = Non def assert_len_equal( self, obj, expected_length, message=None, on_failure: Callable = None) -> bool: + """ + Asserts that the length of the object is equal to the expected length. + + :param obj: Object to evaluate. + :param expected_length: Expected length. + :param message: Optional message to display on failure. + :param on_failure: Optional callable to execute on failure. + + :return: True if the length of the object is equal to the expected length, False otherwise. + """ if len(obj) != expected_length: error = message or f'Length of {obj} is {len(obj)}, expected {expected_length}' @@ -217,6 +355,16 @@ def assert_len_equal( return True def assert_is_instance(self, obj, cls, message=None, on_failure: Callable = None) -> bool: + """ + Asserts that the object is an instance of the specified class. + + :param obj: Object to evaluate. + :param cls: Class to check. + :param message: Optional message to display on failure. + :param on_failure: Optional callable to execute on failure. + + :return: True if the object is an instance of the specified class, False otherwise. + """ if not isinstance(obj, cls): error = message or f'{obj} is not instance of {cls}' @@ -227,6 +375,16 @@ def assert_is_instance(self, obj, cls, message=None, on_failure: Callable = None return True def assert_not_is_instance(self, obj, cls, message=None, on_failure: Callable = None) -> bool: + """ + Asserts that the object is not an instance of the specified class. + + :param obj: Object to evaluate. + :param cls: Class to check. + :param message: Optional message to display on failure. + :param on_failure: Optional callable to execute on failure. + + :return: True if the object is not an instance of the specified class, False otherwise. + """ if isinstance(obj, cls): error = message or f'{obj} is instance of {cls}' @@ -238,6 +396,17 @@ def assert_not_is_instance(self, obj, cls, message=None, on_failure: Callable = def assert_almost_equal( self, first, second, delta, message=None, on_failure: Callable = None) -> bool: + """ + Asserts that first is almost equal to second within the given delta. + + :param first: First value. + :param second: Second value. + :param delta: Maximum difference for which first and second are considered almost equal. + :param message: Optional message to display on failure. + :param on_failure: Optional callable to execute on failure. + + :return: True if first is almost equal to second, False otherwise. + """ if not self.__is_almost_equal(first, second, delta): error = message or f'Assertion failed: {first} not almost equal to {second}' @@ -249,6 +418,17 @@ def assert_almost_equal( def assert_not_almost_equal( self, first, second, delta, message=None, on_failure: Callable = None) -> bool: + """ + Asserts that first is not almost equal to second within the given delta. + + :param first: First value. + :param second: Second value. + :param delta: Maximum difference for which first and second are considered almost equal. + :param message: Optional message to display on failure. + :param on_failure: Optional callable to execute on failure. + + :return: True if first is not almost equal to second, False otherwise. + """ if self.__is_almost_equal(first, second, delta): error = message or f'Assertion failed: {first} almost equal to {second}' @@ -259,6 +439,17 @@ def assert_not_almost_equal( return True def assert_raises(self, exception, method: Callable, *args, **kwargs) -> bool: + """ + Asserts that the specified exception is raised when calling + the method with the given arguments. + + :param exception: Exception class to check. + :param method: Method to call. + :param args: Positional arguments to pass to the method. + :param kwargs: Keyword arguments to pass to the method. + + :return: True if the exception is raised, False otherwise. + """ try: method(*args, **kwargs) @@ -274,8 +465,17 @@ def assert_raises(self, exception, method: Callable, *args, **kwargs) -> bool: return True def assert_raised_with(self, exception, message=None, on_failure: Callable = None): + """ + Context manager to assert that the specified exception is raised. + + :param exception: Exception class to check. + :param message: Optional message to display on failure. + :param on_failure: Optional callable to execute on failure. - on_failure = on_failure if on_failure else self.__on_failure + :return: Context manager. + """ + + on_failure = on_failure or self.__on_failure class AssertRaises: @@ -289,8 +489,10 @@ def __init__(self, e, append_to_failures: Callable): def __enter__(self): return self - def __exit__(self, exc_type, exc_value, traceback): + async def __aenter__(self): + return self + def __exit__(self, exc_type, exc_val, exc_tb): if exc_type is None: error = message or f'{self.__exception} not raised' self.__append_to_failures(error) @@ -302,6 +504,9 @@ def __exit__(self, exc_type, exc_value, traceback): return True + async def __aexit__(self, exc_type, exc_val, exc_tb): + return self.__exit__(exc_type, exc_val, exc_tb) + @classmethod def __execute_on_failure(cls): if callable(on_failure): @@ -311,62 +516,131 @@ def __execute_on_failure(cls): def assert_all(self): """ - Raises AssertionError if any of the asserts failed. - :return: + Asserts that there are no failures. + Raises an AssertionError with all failures if there are any. + + :raises AssertionError: If there are any failures. """ self.unset_step() if self.failures: failures = self.failures.copy() - self.__failures = [] + self.__failures_context.set([]) self.failure_steps = ( list( dict.fromkeys( - [ - failure.step for failure in failures if failure.step is not None - ] + [failure.step for failure in failures if failure.step is not None] ) ) ) errors = '\n'.join([str(failure) for failure in failures]) - raise AssertionError(f'\n{errors}') + ex = AssertionError(f'\n{errors}') + ex.failures = failures + raise ex + + def init_failure_steps(self): + """ + Initializes the failure steps list. + """ + + self.failure_steps = [] def is_in_failure_steps(self, step: str) -> bool: + """ + Checks if the given step is in the failure steps list. + + :param step: Step to check. + + :return: True if the step is in the failure steps list, False otherwise. + """ + return step in self.failure_steps - def init_failure_steps(self): - self.failure_steps = [] + def set_on_failure(self, on_failure: Callable): + """ + Sets the on_failure callable to be executed on each failure. + This callable will be used if no on_failure is provided + in the individual assert methods. + + :param on_failure: Callable to execute on failure. + """ + + self.__on_failure = on_failure + + def set_step(self, step: str): + """ + Sets the current step for failures. + + :param step: Step to set. + """ + + self.__current_step = step + + def unset_step(self): + """ + Unsets the current step for failures. + """ + + self.__current_step = None @property def failures(self): - return self.__failures + """ + Gets the list of failures. + """ + + return self.__failures_context.get() or [] @property def failure_steps(self): + """ + Gets the list of failure steps. + """ + return self.__failure_steps @failure_steps.setter def failure_steps(self, value): + """ + Sets the list of failure steps. + """ + self.__failure_steps = value @property def print_duplicate_errors(self) -> DuplicatedErrorsEnum: + """ + Gets the print duplicate errors setting. + """ + return self.__print_duplicate_errors @print_duplicate_errors.setter def print_duplicate_errors(self, value: DuplicatedErrorsEnum): + """ + Sets the print duplicate errors setting. + + :param value: DuplicatedErrorsEnum value. + """ + self.__print_duplicate_errors = value def __enter__(self): return self + async def __aenter__(self): + return self + def __exit__(self, exc_type, exc_value, traceback): self.assert_all() + async def __aexit__(self, exc_type, exc_value, traceback): + self.assert_all() + def __append_to_failures(self, error): file_path, code_line, line_number = \ @@ -382,7 +656,8 @@ def __append_to_failures(self, error): ) if self.__is_append_failure(failure): - self.__failures.append(failure) + failures = self.failures + [failure] + self.__failures_context.set(failures) self.__print_error_to_log(failure) def __is_append_failure(self, failure: Failure) -> bool: @@ -396,7 +671,7 @@ def __is_append_failure(self, failure: Failure) -> bool: raise ValueError(f'Unknown duplicated errors validation: {self.print_duplicate_errors}') def __is_code_source_failure_in_failures(self, failure: Failure) -> bool: - for f in self.__failures: + for f in self.failures: if f.file_path == failure.file_path and f.line_number == failure.line_number \ and f.code_line == failure.code_line: @@ -406,7 +681,7 @@ def __is_code_source_failure_in_failures(self, failure: Failure) -> bool: return False def __is_code_source_and_error_failure_in_failures(self, failure: Failure) -> bool: - for f in self.__failures: + for f in self.failures: if f.error == failure.error and f.file_path == failure.file_path \ and f.line_number == failure.line_number and f.code_line == failure.code_line: @@ -417,25 +692,43 @@ def __is_code_source_and_error_failure_in_failures(self, failure: Failure) -> bo def __execute_on_failure(self, on_failure: Callable): - on_failure = on_failure if on_failure else self.__on_failure + on_failure = on_failure or self.__on_failure if callable(on_failure): on_failure() @classmethod def set_logger(cls, logger): + """ + Sets the logger to be used for logging errors. + """ + cls.__logger = logger @classmethod def unset_logger(cls): + """ + Unsets the logger. + """ + cls.__logger = None @classmethod def set_print_method(cls, print_method: Callable): + """ + Sets the print method to be used for printing errors. + + :param print_method: Callable to use for printing errors. + """ + cls.__print_method = print_method @classmethod def unset_print_method(cls): + """ + Unsets the print method. + """ + cls.__print_method = None @classmethod @@ -471,14 +764,33 @@ def __get_failure_file_path_and_line_code_and_line_number(cls): def soft_asserts(sa: SoftAsserts): + """ + Decorator to wrap a function with soft asserts. + Supports both synchronous and asynchronous functions. + + Example: + @soft_asserts(sa=sa) + def test_function(): + sa.assert_true(False, "This will not raise immediately") + :param sa: SoftAsserts instance. + + :return: Wrapped function. + """ def soft_asserts_wrapper(func): - @functools.wraps(func) - def soft_asserts_func_wrapper(*args, **kwargs): - result = func(*args, **kwargs) - sa.assert_all() - return result + if inspect.iscoroutinefunction(func): + @functools.wraps(func) + async def soft_asserts_func_wrapper(*args, **kwargs): + result = await func(*args, **kwargs) + sa.assert_all() + return result + else: + @functools.wraps(func) + def soft_asserts_func_wrapper(*args, **kwargs): + result = func(*args, **kwargs) + sa.assert_all() + return result return soft_asserts_func_wrapper diff --git a/pyproject.toml b/pyproject.toml index 956bece..33aa5c4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -2,7 +2,7 @@ name='nrt-pytest-soft-asserts' -version='1.4.1' +version='2.0.0' authors=[ { name='Eyal Tuzon', email='eyal.tuzon.dev@gmail.com' }, @@ -34,7 +34,6 @@ classifiers=[ 'Topic :: Software Development :: Testing', 'Topic :: Software Development :: Testing :: Unit', 'Topic :: Software Development :: Libraries', -'Topic :: Utilities', 'Development Status :: 5 - Production/Stable', ] diff --git a/requirements-dev.txt b/requirements-dev.txt new file mode 100644 index 0000000..eb3961c --- /dev/null +++ b/requirements-dev.txt @@ -0,0 +1,2 @@ +flake8~=7.3.0 +coverage~=7.13.1 \ No newline at end of file diff --git a/setup.py b/setup.py index f90ee62..fbbfe0d 100644 --- a/setup.py +++ b/setup.py @@ -39,7 +39,6 @@ 'Topic :: Software Development :: Testing', 'Topic :: Software Development :: Testing :: Unit', 'Topic :: Software Development :: Libraries', - 'Topic :: Utilities', 'Development Status :: 5 - Production/Stable' ], install_requires=[requirements], diff --git a/tests/nrt_pytest_soft_asserts/soft_asserts_test.py b/tests/nrt_pytest_soft_asserts/soft_asserts_test.py index 5e9e44a..de4ce77 100644 --- a/tests/nrt_pytest_soft_asserts/soft_asserts_test.py +++ b/tests/nrt_pytest_soft_asserts/soft_asserts_test.py @@ -20,7 +20,7 @@ @pytest.fixture(autouse=True) -def before_test(): +def function(): SoftAsserts.unset_logger() SoftAsserts.unset_print_method() @@ -29,9 +29,10 @@ def before_test(): sa.init_failure_steps() global is_on_failure is_on_failure = False + yield -def test_assert_true(): +def test_assert_true_pass(): # Soft Asserts return True if assertion passes, False if assertion fails. assert sa.assert_true(True) assert sa.assert_true(True, ERROR_MESSAGE_1) @@ -42,7 +43,7 @@ def test_assert_true(): sa.assert_all() -def test_assert_false(): +def test_assert_false_pass(): assert sa.assert_false(False) assert sa.assert_false(False, ERROR_MESSAGE_1) assert sa.assert_false(False, on_failure=__set_is_on_failure_true) @@ -52,7 +53,7 @@ def test_assert_false(): sa.assert_all() -def test_assert_equal(): +def test_assert_equal_pass(): assert sa.assert_equal(1, 1) assert sa.assert_equal('1', '1', ERROR_MESSAGE_1) assert sa.assert_equal(2, 2, on_failure=__set_is_on_failure_true) @@ -62,7 +63,7 @@ def test_assert_equal(): sa.assert_all() -def test_assert_not_equal(): +def test_assert_not_equal_pass(): assert sa.assert_not_equal(1, 2) assert sa.assert_not_equal('1', '2', ERROR_MESSAGE_1) assert sa.assert_not_equal(1, 5, on_failure=__set_is_on_failure_true) @@ -72,7 +73,7 @@ def test_assert_not_equal(): sa.assert_all() -def test_assert_greater(): +def test_assert_greater_pass(): assert sa.assert_greater(2, 1) assert sa.assert_greater(3, 2, ERROR_MESSAGE_1) assert sa.assert_greater(5, 4, on_failure=__set_is_on_failure_true) @@ -82,7 +83,7 @@ def test_assert_greater(): sa.assert_all() -def test_assert_greater_equal(): +def test_assert_greater_equal_pass(): assert sa.assert_greater_equal(2, 1) assert sa.assert_greater_equal(2, 2, ERROR_MESSAGE_1) assert sa.assert_greater_equal(3, 2, on_failure=__set_is_on_failure_true) @@ -92,7 +93,7 @@ def test_assert_greater_equal(): sa.assert_all() -def test_assert_less(): +def test_assert_less_pass(): assert sa.assert_less(1, 2) assert sa.assert_less(2, 3, ERROR_MESSAGE_1) assert sa.assert_less(4, 5, on_failure=__set_is_on_failure_true) @@ -102,7 +103,7 @@ def test_assert_less(): sa.assert_all() -def test_assert_less_equal(): +def test_assert_less_equal_pass(): assert sa.assert_less_equal(1, 2) assert sa.assert_less_equal(2, 2, ERROR_MESSAGE_1) assert sa.assert_less_equal(3, 4, on_failure=__set_is_on_failure_true) @@ -112,7 +113,7 @@ def test_assert_less_equal(): sa.assert_all() -def test_assert_is(): +def test_assert_is_pass(): a = b = SoftAsserts() assert sa.assert_is(1, 1) @@ -124,7 +125,7 @@ def test_assert_is(): sa.assert_all() -def test_assert_is_not(): +def test_assert_is_not_pass(): a = SoftAsserts() b = SoftAsserts() @@ -137,7 +138,7 @@ def test_assert_is_not(): sa.assert_all() -def test_assert_is_none(): +def test_assert_is_none_pass(): assert sa.assert_is_none(None) assert sa.assert_is_none(None, ERROR_MESSAGE_1) assert sa.assert_is_none(None, on_failure=__set_is_on_failure_true) @@ -147,7 +148,7 @@ def test_assert_is_none(): sa.assert_all() -def test_assert_is_not_none(): +def test_assert_is_not_none_pass(): assert sa.assert_is_not_none(1) assert sa.assert_is_not_none(1, ERROR_MESSAGE_1) assert sa.assert_is_not_none(1, on_failure=__set_is_on_failure_true) @@ -157,7 +158,7 @@ def test_assert_is_not_none(): sa.assert_all() -def test_assert_in(): +def test_assert_in_pass(): assert sa.assert_in(1, [1, 2, 3]) assert sa.assert_in('1', ['1', '2', '3'], ERROR_MESSAGE_1) assert sa.assert_in(2, [1, 2, 3], on_failure=__set_is_on_failure_true) @@ -167,7 +168,7 @@ def test_assert_in(): sa.assert_all() -def test_assert_not_in(): +def test_assert_not_in_pass(): assert sa.assert_not_in(1, [2, 3, 4]) assert sa.assert_not_in('1', ['2', '3', '4'], ERROR_MESSAGE_1) assert sa.assert_not_in(5, [1, 2, 3], on_failure=__set_is_on_failure_true) @@ -177,7 +178,7 @@ def test_assert_not_in(): sa.assert_all() -def test_assert_len_equal(): +def test_assert_len_equal_pass(): assert sa.assert_len_equal([1, 2, 3], 3) assert sa.assert_len_equal('12345', 5, ERROR_MESSAGE_1) assert sa.assert_len_equal((1, 2), 2, on_failure=__set_is_on_failure_true) @@ -187,7 +188,7 @@ def test_assert_len_equal(): sa.assert_all() -def test_assert_is_instance(): +def test_assert_is_instance_pass(): a = SoftAsserts() assert sa.assert_is_instance(1, int) @@ -199,7 +200,7 @@ def test_assert_is_instance(): sa.assert_all() -def test_assert_not_is_instance(): +def test_assert_not_is_instance_pass(): assert sa.assert_not_is_instance(1, str) assert sa.assert_not_is_instance('1', int, ERROR_MESSAGE_1) assert sa.assert_not_is_instance(1, str, on_failure=__set_is_on_failure_true) @@ -209,7 +210,7 @@ def test_assert_not_is_instance(): sa.assert_all() -def test_assert_almost_equal(): +def test_assert_almost_equal_pass(): assert sa.assert_almost_equal(1.0001, 1.0002, 0.002) assert sa.assert_almost_equal(1.0001, 1.0002, 0.002, ERROR_MESSAGE_1) assert sa.assert_almost_equal(1.0001, 1.0002, 0.002, on_failure=__set_is_on_failure_true) @@ -219,7 +220,7 @@ def test_assert_almost_equal(): sa.assert_all() -def test_assert_not_almost_equal(): +def test_assert_not_almost_equal_pass(): assert sa.assert_not_almost_equal(1.0001, 1.0002, 0.000001) assert sa.assert_not_almost_equal(1.0001, 1.0002, 0.000001, ERROR_MESSAGE_1) assert sa.assert_not_almost_equal(1.0001, 1.0002, 0.000001, on_failure=__set_is_on_failure_true) @@ -229,7 +230,7 @@ def test_assert_not_almost_equal(): sa.assert_all() -def test_assert_raises(): +def test_assert_raises_pass(): assert sa.assert_raises(ValueError, __raise_value_error) assert not is_on_failure @@ -237,7 +238,7 @@ def test_assert_raises(): sa.assert_all() -def test_assert_raised_with(): +def test_assert_raised_with_pass(): with sa.assert_raised_with(ValueError): raise ValueError(ERROR_MESSAGE_1) @@ -251,6 +252,68 @@ def test_assert_raised_with(): sa.assert_all() +def test_assert_raised_with_async_pass(): + + import asyncio + + async def raise_value_error_async(): + raise ValueError(ERROR_MESSAGE_1) + + async def test_coroutine(): + async with sa.assert_raised_with(ValueError): + await raise_value_error_async() + + sa.assert_all() + + asyncio.run(test_coroutine()) + + +def test_assert_with_statement_pass(): + + with SoftAsserts() as sa_1: + assert sa_1.assert_true(True) + assert sa_1.assert_true(True, ERROR_MESSAGE_1) + assert not len(sa_1.failures) + + sa_1.assert_all() + + +def test_assert_with_statement_async_pass(): + + import asyncio + + async def test_coroutine(): + async with SoftAsserts() as sa_1: + assert sa_1.assert_true(True) + assert sa_1.assert_true(True, ERROR_MESSAGE_1) + assert not len(sa_1.failures) + + sa_1.assert_all() + + asyncio.run(test_coroutine()) + + +def test_set_on_failure(): + sa_1 = SoftAsserts() + sa_1.set_on_failure(__set_is_on_failure_true) + assert not sa_1.assert_true(False) + + assert is_on_failure + + __verify_assert_all_raised_exception() + + +def test_set_on_failure_on_assert_raised_with(): + sa_1 = SoftAsserts() + sa_1.set_on_failure(__set_is_on_failure_true) + + with sa_1.assert_raised_with(ValueError): + raise NotImplementedError() + + assert is_on_failure + + __verify_assert_all_raised_exception() + def test_assert_true_fail(): @@ -562,6 +625,59 @@ def test_assert_raised_with_fail(): __verify_assert_all_raised_exception() +def test_assert_raised_with_async_fail(): + + import asyncio + + async def not_raise_exception_async(): + return + + async def raise_not_implemented_exception_async(): + raise NotImplementedError() + + async def test_coroutine_fail_not_raise_exception(): + async with sa.assert_raised_with(ValueError): + await not_raise_exception_async() + + assert len(sa.failures) == 1 + + __verify_assert_all_raised_exception() + + async def test_coroutine_fail_raise_not_implemented_error(): + async with sa.assert_raised_with(ValueError): + await raise_not_implemented_exception_async() + + assert len(sa.failures) == 1 + + __verify_assert_all_raised_exception() + + asyncio.run(test_coroutine_fail_not_raise_exception()) + asyncio.run(test_coroutine_fail_raise_not_implemented_error()) + + +def test_with_statement_fail(): + + with pytest.raises(AssertionError) as e: + with SoftAsserts() as sa_1: + sa_1.assert_true(False, ERROR_MESSAGE_1) + sa_1.assert_false(True) + assert len(sa_1.failures) == 2 + + +def test_with_statement_async_fail(): + + import asyncio + + async def test_coroutine(): + with pytest.raises(AssertionError): + async with SoftAsserts() as sa_1: + sa_1.assert_true(False, ERROR_MESSAGE_1) + sa_1.assert_false(True) + assert len(sa_1.failures) == 2 + + asyncio.run(test_coroutine()) + + def test_fail_with_print_message(): SoftAsserts.set_print_method(__print) @@ -706,30 +822,56 @@ def test_print_duplicate_errors_value_no_duplicated_errors_code_source_and_error assert e.value.args[0].count(f'[1] {ERROR_MESSAGE_2}') == 1 -def test_with_statement(): +def test_decorator_soft_asserts_pass(): + + @soft_asserts(sa=sa) + def test_function(): + __soft_assert_true(True) + __soft_assert_true(True, ERROR_MESSAGE_1) + + test_function() + + sa.assert_all() + + +def test_decorator_soft_asserts_fail(): with pytest.raises(AssertionError) as e: - with sa: + + @soft_asserts(sa=sa) + def test_function(): __soft_assert_true(False, ERROR_MESSAGE_1) - __soft_assert_true(True) - assert len(sa.failures) == 1 - assert not len(sa.failures) + test_function() assert e.value.args[0].count(ERROR_MESSAGE_1) == 1 + +def test_test_decorator_soft_asserts_async_pass(): + + import asyncio + + @soft_asserts(sa=sa) + async def test_coroutine(): + __soft_assert_true(True) + __soft_assert_true(True, ERROR_MESSAGE_1) + + asyncio.run(test_coroutine()) + sa.assert_all() -def test_decorator_soft_asserts(): +def test_test_decorator_soft_asserts_async_fail(): + + import asyncio with pytest.raises(AssertionError) as e: @soft_asserts(sa=sa) - def test_function(): + async def test_coroutine(): __soft_assert_true(False, ERROR_MESSAGE_1) - test_function() + asyncio.run(test_coroutine()) assert e.value.args[0].count(ERROR_MESSAGE_1) == 1