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