Pytest参数选项自由执行测试用例详解(二)

王大力测试进阶之路

共 25997字,需浏览 52分钟

 ·

2021-07-22 05:44

  

      运行pytest可以指定目录和文件,如果不指定,pytest会搜索当前目录及其子目录中以test_开头或以_test结尾得测试函数。我们把pytest搜索测试文件和测试用例的过程称为测试搜索(test discovery)。只要遵循pytest的命名规则,pytest就能自动搜索所有待执行的测试用例。所有的包必须要有init.py文件(在使用各种编辑器时会自动生成)

1、测试文件命名规则,test_xxx.py或xxx_test.py

2、方法、测试函数命名规则,test_xxx

3、测试类命名规则,Testxxx,并且不能带有 init 方法


Pytest参数选项在脚本中和命令行用法详解(一)

-k选项  -K EXPRESSION

使用表达式指定某个关键字的测试用例,如果某测试名是唯一的或多个测试名的前缀或后缀相同,可快速匹配,匹配范围是全局相同目录或下层目录所有(包名、文件名、类名、函数名为变量),文件名、类名、函数名,必须是test_开头或_test结尾的。

pytest.main(['-k','关键字'])关键字包含于或等于文件名、类名、函数名,多个关键字之间用andornot连接

测试代码如下:

chengzi\test_04.py
import pytest

class TestClass(object): def test_one(self): assert 2 == 1

def test_two(self): assert 2 == 2
def test_two2(self): assert 2 == 2

执行匹配包名,运行了3条用例

pytest.main(['-v','-k','chengzi'])

if __name__ == '__main__':    pytest.main(['-v','-k','chengzi'])     "C:\Program Files\Python35\python.exe" C:/Users/wangli/PycharmProjects/untitled/chengzi/test_04.py============================= test session starts =============================platform win32 -- Python 3.5.2, pytest-6.1.1, py-1.9.0, pluggy-0.13.1 -- C:\Program Files\Python35\python.execachedir: .pytest_cachemetadata: {'Packages': {'pluggy': '0.13.1', 'py': '1.9.0', 'pytest': '6.1.1'}, 'Platform': 'Windows-10-10.0.18362-SP0', 'JAVA_HOME': 'C:\\Program Files\\Java\\jdk1.8.0_101', 'Python': '3.5.2', 'Plugins': {'allure-pytest': '2.8.18', 'metadata': '1.8.0', 'rerunfailures': '9.1.1', 'html': '1.22.0'}}rootdir: C:\Users\wangli\PycharmProjects\untitled\chengziplugins: allure-pytest-2.8.18, html-1.22.0, metadata-1.8.0, rerunfailures-9.1.1collecting ... collected 3 items
test_04.py::TestClass::test_one FAILED [ 33%]test_04.py::TestClass::test_two PASSED [ 66%]test_04.py::TestClass::test_two2 PASSED [100%]
================================== FAILURES ===================================_____________________________ TestClass.test_one ______________________________
self = <chengzi.test_04.TestClass object at 0x000001F27E537B70>
def test_one(self):> assert 2 == 1E assert 2 == 1E +2E -1
test_04.py:5: AssertionError=========================== short test summary info ===========================FAILED test_04.py::TestClass::test_one - assert 2 == 1========================= 1 failed, 2 passed in 0.63s =========================
Process finished with exit code 0

执行匹配文件名,运行了3条用例

pytest.main(['-v','-k','test_04.py'])
if __name__ == '__main__':    pytest.main(['-v','-k','test_04.py'])    "C:\Program Files\Python35\python.exe" C:/Users/wangli/PycharmProjects/untitled/chengzi/test_04.py============================= test session starts =============================platform win32 -- Python 3.5.2, pytest-6.1.1, py-1.9.0, pluggy-0.13.1 -- C:\Program Files\Python35\python.execachedir: .pytest_cachemetadata: {'Platform': 'Windows-10-10.0.18362-SP0', 'Python': '3.5.2', 'Packages': {'py': '1.9.0', 'pluggy': '0.13.1', 'pytest': '6.1.1'}, 'JAVA_HOME': 'C:\\Program Files\\Java\\jdk1.8.0_101', 'Plugins': {'rerunfailures': '9.1.1', 'html': '1.22.0', 'allure-pytest': '2.8.18', 'metadata': '1.8.0'}}rootdir: C:\Users\wangli\PycharmProjects\untitled\chengziplugins: allure-pytest-2.8.18, html-1.22.0, metadata-1.8.0, rerunfailures-9.1.1collecting ... collected 3 items
test_04.py::TestClass::test_one FAILED [ 33%]test_04.py::TestClass::test_two PASSED [ 66%]test_04.py::TestClass::test_two2 PASSED [100%]
================================== FAILURES ===================================_____________________________ TestClass.test_one ______________________________
self = <chengzi.test_04.TestClass object at 0x000002031D345588>
def test_one(self):> assert 2 == 1E assert 2 == 1E +2E -1
test_04.py:6: AssertionError=========================== short test summary info ===========================FAILED test_04.py::TestClass::test_one - assert 2 == 1========================= 1 failed, 2 passed in 0.48s =========================
Process finished with exit code 0

执行匹配类名,运行了3条用例

pytest.main(['-v','-k','Class'])

if __name__ == '__main__': pytest.main(['-v','-k','Class'])
"C:\Program Files\Python35\python.exe" C:/Users/wangli/PycharmProjects/untitled/chengzi/test_04.py============================= test session starts =============================platform win32 -- Python 3.5.2, pytest-6.1.1, py-1.9.0, pluggy-0.13.1 -- C:\Program Files\Python35\python.execachedir: .pytest_cachemetadata: {'Plugins': {'html': '1.22.0', 'rerunfailures': '9.1.1', 'metadata': '1.8.0', 'allure-pytest': '2.8.18'}, 'Packages': {'pluggy': '0.13.1', 'py': '1.9.0', 'pytest': '6.1.1'}, 'JAVA_HOME': 'C:\\Program Files\\Java\\jdk1.8.0_101', 'Python': '3.5.2', 'Platform': 'Windows-10-10.0.18362-SP0'}rootdir: C:\Users\wangli\PycharmProjects\untitled\chengziplugins: allure-pytest-2.8.18, html-1.22.0, metadata-1.8.0, rerunfailures-9.1.1collecting ... collected 3 items
test_04.py::TestClass::test_one FAILED [ 33%]test_04.py::TestClass::test_two PASSED [ 66%]test_04.py::TestClass::test_two2 PASSED [100%]
================================== FAILURES ===================================_____________________________ TestClass.test_one ______________________________
self = <chengzi.test_04.TestClass object at 0x0000023ED5C68B00>
def test_one(self):> assert 2 == 1E assert 2 == 1E +2E -1
test_04.py:6: AssertionError=========================== short test summary info ===========================FAILED test_04.py::TestClass::test_one - assert 2 == 1========================= 1 failed, 2 passed in 0.21s =========================
Process finished with exit code 0

执行匹配函数名,函数名中含test且含two的,运行了2条用例

pytest.main(['-v','-k','test and two'])
if __name__ == '__main__':    pytest.main(['-v','-k','test and two'])
"C:\Program Files\Python35\python.exe" C:/Users/wangli/PycharmProjects/untitled/chengzi/test_04.py============================= test session starts =============================platform win32 -- Python 3.5.2, pytest-6.1.1, py-1.9.0, pluggy-0.13.1 -- C:\Program Files\Python35\python.execachedir: .pytest_cachemetadata: {'Platform': 'Windows-10-10.0.18362-SP0', 'JAVA_HOME': 'C:\\Program Files\\Java\\jdk1.8.0_101', 'Plugins': {'rerunfailures': '9.1.1', 'html': '1.22.0', 'allure-pytest': '2.8.18', 'metadata': '1.8.0'}, 'Packages': {'pluggy': '0.13.1', 'py': '1.9.0', 'pytest': '6.1.1'}, 'Python': '3.5.2'}rootdir: C:\Users\wangli\PycharmProjects\untitled\chengziplugins: allure-pytest-2.8.18, html-1.22.0, metadata-1.8.0, rerunfailures-9.1.1collecting ... collected 3 items / 1 deselected / 2 selected
test_04.py::TestClass::test_two PASSED [ 50%]test_04.py::TestClass::test_two2 PASSED [100%]
======================= 2 passed, 1 deselected in 0.11s =======================
Process finished with exit code 0

-m选项  -m MARKEXPR

标记(marker)用于标记测试并分组,以便快速选中并运行,匹配运行所有标记了装饰器@pytest.mark.marker类或方法的测试用例,标记名可自行定义,如果标记名为run_all,可使用@pytest.mark.run_all装饰类或函数来做标记,匹配范围是全局相同目录或下层目录所有(类装饰器的标记名、函数装饰器的标记),文件名、类名、函数名,必须是test_开头或_test结尾的。

pytest.main(['-v','-m','关键字'])关键字等于类装饰器或函装饰器@pytest.mark.标记名,里的标记名,多个关键字之间用andornot连接

测试代码目录:

测试代码:

chengzi\test_01.pyimport pytest

class Test_Class(object): def test_one(self): assert 2 == 1
@pytest.mark.run_two def testtwo(self): assert 2 == 2
def test_two2(self): assert 2 == 2

if __name__ == '__main__': pytest.main(['-v','-m','run_one or run_all'])    juzi\test_02.py@pytest.mark.run_allclass TestClass(object): def test_one(self): assert 2 == 1

def test_two(self): assert 2 == 2

def test_two2(self): assert 2 == 2

if __name__ == '__main__': pytest.main(['-v','-m','run_one or run_all'])  import pytest
test_03.pyclass TestClass(object): @pytest.mark.run_one def test_one(self): assert 2 == 1
def test_two(self): assert 2 == 2

def test_two2(self): assert 2 == 2

if __name__ == '__main__': pytest.main(['-v','-m','run_one or run_all']) test_04.py    class TestClass(object): def test_onqq(self): assert 2 == 1

def test_two(self): assert 2 == 2
@pytest.mark.two2 def test_two2(self): assert 2 == 2

if __name__ == '__main__':    pytest.main(['-v','-m','run_one or run_all'])  

执行匹配类或函数装饰器里,标记名为run_one或run_all的测试用例,可以看到匹配运行了4条用例

pytest.main(['-v','-m','run_one or run_all'])

if __name__ == '__main__':    pytest.main(['-v','-m','run_one or run_all'])    "C:\Program Files\Python35\python.exe" C:/Users/wangli/PycharmProjects/untitled/test_04.py============================= test session starts =============================platform win32 -- Python 3.5.2, pytest-6.1.1, py-1.9.0, pluggy-0.13.1 -- C:\Program Files\Python35\python.execachedir: .pytest_cachemetadata: {'JAVA_HOME': 'C:\\Program Files\\Java\\jdk1.8.0_101', 'Platform': 'Windows-10-10.0.18362-SP0', 'Python': '3.5.2', 'Plugins': {'allure-pytest': '2.8.18', 'html': '1.22.0', 'metadata': '1.8.0', 'rerunfailures': '9.1.1'}, 'Packages': {'pytest': '6.1.1', 'pluggy': '0.13.1', 'py': '1.9.0'}}rootdir: C:\Users\wangli\PycharmProjects\untitledplugins: allure-pytest-2.8.18, html-1.22.0, metadata-1.8.0, rerunfailures-9.1.1collecting ... collected 12 items / 8 deselected / 4 selected
test_03.py::TestClass::test_one FAILED [ 25%]juzi/test_02.py::TestClass::test_one FAILED [ 50%]juzi/test_02.py::TestClass::test_two PASSED [ 75%]juzi/test_02.py::TestClass::test_two2 PASSED [100%]
================================== FAILURES ===================================_____________________________ TestClass.test_one ______________________________
self = <test_03.TestClass object at 0x00000232EDB1BF60>
@pytest.mark.run_one def test_one(self):> assert 2 == 1E assert 2 == 1E +2E -1
test_03.py:7: AssertionError_____________________________ TestClass.test_one ______________________________
self = <juzi.test_02.TestClass object at 0x00000232EDB0B080>
def test_one(self):> assert 2 == 1E assert 2 == 1E +2E -1
juzi\test_02.py:6: AssertionError============================== warnings summary ===============================test_03.py:5 C:\Users\wangli\PycharmProjects\untitled\test_03.py:5: PytestUnknownMarkWarning: Unknown pytest.mark.run_one - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html @pytest.mark.run_one
test_04.py:12 C:\Users\wangli\PycharmProjects\untitled\test_04.py:12: PytestUnknownMarkWarning: Unknown pytest.mark.two2 - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html @pytest.mark.two2
chengzi\test_01.py:8 C:\Users\wangli\PycharmProjects\untitled\chengzi\test_01.py:8: PytestUnknownMarkWarning: Unknown pytest.mark.run_two - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html @pytest.mark.run_two
juzi\test_02.py:3 C:\Users\wangli\PycharmProjects\untitled\juzi\test_02.py:3: PytestUnknownMarkWarning: Unknown pytest.mark.run_all - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html @pytest.mark.run_all
-- Docs: https://docs.pytest.org/en/stable/warnings.html=========================== short test summary info ===========================FAILED test_03.py::TestClass::test_one - assert 2 == 1FAILED juzi/test_02.py::TestClass::test_one - assert 2 == 1============ 2 failed, 2 passed, 8 deselected, 4 warnings in 0.24s ============
Process finished with exit code 0

-V(--verbose)选项

输出更加详细的信息,比如用例所在的包、py文件、类名及用例名称等测试的名字和结果都会显示出来,最明显区别就是每个文件中的测试用例都会占一行(先前是每个文件占一行)

pytest.main(['-v'])

-s选项

允许终端在测试运行时,输出用例中的调式信息,包括任何符合标准的输出流信息,比如print的打印信息等。

pytest.main(['-s'])

测试代码:

test-04.pyimport pytest

class TestClass(object): def test_one(self): print('this is test_one') assert 2 == 1
def test_two(self): print('this is test_two') assert 2 == 2
@pytest.mark.two2 def test_two2(self): print('this is test_two2') assert 2 == 2

if __name__ == '__main__': pytest.main(['-s']) "C:\Program Files\Python35\python.exe" C:/Users/wangli/PycharmProjects/untitled/test_04.py============================= test session starts =============================platform win32 -- Python 3.5.2, pytest-6.1.1, py-1.9.0, pluggy-0.13.1rootdir: C:\Users\wangli\PycharmProjects\untitledplugins: allure-pytest-2.8.18, html-1.22.0, metadata-1.8.0, rerunfailures-9.1.1111collected 12 items
test_03.py F..test_04.py this is test_oneFthis is test_two.this is test_two2.chengzi\test_01.py F..juzi\test_02.py F..

-x选项

debug调试时,我们希望遇到断言失败时,立即全局停止,这时就可以用到-x

pytest.main(['-x','test_04.py'])

测试代码如下:

#设置用例1和用例3断言成功,断言2失败#执行后,用例1执行了,用例2执行断言失败,脚本停止,用例3没有继续执行import pytest
class TestClass(object): def test_one(self): print('this is test_one') assert 2 == 2
def test_two(self): print('this is test_two') assert 2 == 1
def test_two2(self): print('this is test_two2') assert 2 == 2

if __name__ == '__main__': pytest.main(['-x','test_04.py'])
"C:\Program Files\Python35\python.exe" C:/Users/wangli/PycharmProjects/untitled/test_04.py============================= test session starts =============================platform win32 -- Python 3.5.2, pytest-6.1.1, py-1.9.0, pluggy-0.13.1rootdir: C:\Users\wangli\PycharmProjects\untitledplugins: allure-pytest-2.8.18, html-1.22.0, metadata-1.8.0, rerunfailures-9.1.1collected 3 items
test_04.py .F
================================== FAILURES ===================================_____________________________ TestClass.test_two ______________________________
self = <test_04.TestClass object at 0x000001465DA2D780>
def test_two(self): print('this is test_two')> assert 2 == 1E assert 2 == 1
test_04.py:11: AssertionError---------------------------- Captured stdout call -----------------------------this is test_two=========================== short test summary info ===========================FAILED test_04.py::TestClass::test_two - assert 2 == 1!!!!!!!!!!!!!!!!!!!!!!!!!! stopping after 1 failures !!!!!!!!!!!!!!!!!!!!!!!!!!========================= 1 failed, 1 passed in 0.88s =========================
Process finished with exit code 0


--maxfail=num

与-x选项类似,测试用例达到指定失败次数,就会全局停止,不在执行,假设允许pytest失败2次后停止,则可以使用--maxfail=2,明确指定可失败次数。

pytest.main(['--maxfail=2','test_04.py'])

测试代码如下:

#设置用例1和用例2断言失败,用例3断言成功#使用pytest.main(['--maxfail=2','test_04.py'])#执行了用例1和用例2,达到2次失败,全局停止,未执行用例3test_04.pyimport pytest

class TestClass(object): def test_one(self): print('this is test_one') assert 2 == 1
def test_two(self): print('this is test_two') assert 2 == 1
@pytest.mark.two2 def test_two2(self): print('this is test_two2') assert 2 == 2

if __name__ == '__main__': pytest.main(['--maxfail=2','test_04.py']) "C:\Program Files\Python35\python.exe" C:/Users/wangli/PycharmProjects/untitled/test_04.py============================= test session starts =============================platform win32 -- Python 3.5.2, pytest-6.1.1, py-1.9.0, pluggy-0.13.1rootdir: C:\Users\wangli\PycharmProjects\untitledplugins: allure-pytest-2.8.18, html-1.22.0, metadata-1.8.0, rerunfailures-9.1.1collected 3 items
test_04.py FF
================================== FAILURES ===================================_____________________________ TestClass.test_one ______________________________
self = <test_04.TestClass object at 0x000001ACC521D5F8>
def test_one(self): print('this is test_one')> assert 2 == 1E assert 2 == 1
test_04.py:7: AssertionError---------------------------- Captured stdout call -----------------------------this is test_one_____________________________ TestClass.test_two ______________________________
self = <test_04.TestClass object at 0x000001ACC521A668>
def test_two(self): print('this is test_two')> assert 2 == 1E assert 2 == 1
test_04.py:11: AssertionError---------------------------- Captured stdout call -----------------------------this is test_two============================== warnings summary ===============================test_04.py:13 C:\Users\wangli\PycharmProjects\untitled\test_04.py:13: PytestUnknownMarkWarning: Unknown pytest.mark.two2 - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/mark.html @pytest.mark.two2
-- Docs: https://docs.pytest.org/en/stable/warnings.html=========================== short test summary info ===========================FAILED test_04.py::TestClass::test_one - assert 2 == 1FAILED test_04.py::TestClass::test_two - assert 2 == 1!!!!!!!!!!!!!!!!!!!!!!!!!! stopping after 2 failures !!!!!!!!!!!!!!!!!!!!!!!!!!======================== 2 failed, 1 warning in 0.17s =========================
Process finished with exit code 0

--lf(--last-failed)选项

执行上次断言失败的用例A,当用例A一直是断言失败,运行脚本一直只执行用例A;当用例A断言成功后,没有失败的用例了,会执行全部用例,如果又有断言失败的用例,下次会执行运行失败的用例(运行脚本会执行上次断言失败的用例,没有失败用例会执行所有用例)

pytest.main(['--lf','test_04.py'])
#设置test_two用例断言失败,运行j脚本后只跑了test_two用例import pytestclass TestClass(object):    def test_one(self):        print('this is test_one')        assert 2 == 2
def test_two(self): print('this is test_two') assert 2 == 1
def test_two2(self): print('this is test_two2') assert 2 == 2

if __name__ == '__main__': pytest.main(['--lf','test_04.py'])    collected 3 items / 2 deselected / 1 selectedrun-last-failure: rerun previous 1 failure
test_04.py F [100%]
================================== FAILURES ===================================_____________________________ TestClass.test_two ______________________________
self = <test_04.TestClass object at 0x0000028C5FB3A198>
def test_two(self): print('this is test_two')> assert 2 == 1E assert 2 == 1
test_04.py:11: AssertionError---------------------------- Captured stdout call -----------------------------this is test_two=========================== short test summary info ===========================FAILED test_04.py::TestClass::test_two - assert 2 == 1======================= 1 failed, 2 deselected in 0.15s =======================
Process finished with exit code 0
#把用例test_two改成断言正确的,再次运行脚本,仍执行了test_two用例,发现test_two# 用例断言成功了import pytestclass TestClass(object): def test_one(self): print('this is test_one') assert 2 == 2
def test_two(self): print('this is test_two') assert 2 == 2
def test_two2(self): print('this is test_two2') assert 2 == 2

if __name__ == '__main__': pytest.main(['--lf','test_04.py']) collected 3 items / 2 deselected / 1 selectedrun-last-failure: rerun previous 1 failure
test_04.py . [100%]
======================= 1 passed, 2 deselected in 0.09s =======================
Process finished with exit code 0
#再次运行脚本,执行了全部用例import pytestclass TestClass(object): def test_one(self): print('this is test_one') assert 2 == 2
def test_two(self): print('this is test_two') assert 2 == 2
def test_two2(self): print('this is test_two2') assert 2 == 2

if __name__ == '__main__':    pytest.main(['--lf','test_04.py'])    collected 3 itemsrun-last-failure: 13 known failures not in selected tests
test_04.py ... [100%]
============================== 3 passed in 0.05s ==============================
Process finished with exit code 0

--ff(--failed-first)选项

--ff选项,运行脚本,会优先执行上次断言失败的用例,再依次执行其他用例,直至运行脚本,上次断言失败的用例这次变为断言成功,下次再运行脚本,才会按正常用例顺序依次执行,与--lf选项作用基本相同,不同之处--ff会运行剩下 的测试用例。

pytest.main(['-s','--ff','test_04.py'])
# 设置test_two2断言失败,首次运行脚本,未优先执行test_two2,# 结果test_two2断言失败import pytestclass TestClass(object):    def test_one(self):        print('this is test_one')        assert 2 == 2
def test_two(self): print('this is test_two') assert 2 == 2
def test_two2(self): print('this is test_two2') assert 2 == 1

if __name__ == '__main__': pytest.main(['-s','--ff','test_04.py']) collected 3 itemsrun-last-failure: 13 known failures not in selected tests
test_04.py this is test_one.this is test_two.this is test_two2F
================================== FAILURES ===================================_____________________________ TestClass.test_two2 _____________________________
self = <test_04.TestClass object at 0x000001A124621CF8>
def test_two2(self): print('this is test_two2')> assert 2 == 1E assert 2 == 1
test_04.py:15: AssertionError=========================== short test summary info ===========================FAILED test_04.py::TestClass::test_two2 - assert 2 == 1========================= 1 failed, 2 passed in 0.17s =========================
Process finished with exit code 0
# 脚本不变,再次运行一次,发现优先执行了上次断言失败的用例test_two2# 再按顺序依次执行,结果test_two2断言失败collected 3 itemsrun-last-failure: rerun previous 1 failure first
test_04.py this is test_two2Fthis is test_one.this is test_two.
================================== FAILURES ===================================_____________________________ TestClass.test_two2 _____________________________
self = <test_04.TestClass object at 0x000002C5D0F03668>
def test_two2(self): print('this is test_two2')> assert 2 == 1E assert 2 == 1
test_04.py:15: AssertionError=========================== short test summary info ===========================FAILED test_04.py::TestClass::test_two2 - assert 2 == 1========================= 1 failed, 2 passed in 0.10s =========================
Process finished with exit code 0
# test_two2用例改成断言成功,再次执行脚本,发现还是优先执行了上次断言失败的用例test_two2# 用例,再按顺序依次执行,结果test_two2断言成功 def test_two2(self): print('this is test_two2') assert 2 == 2 collected 3 itemsrun-last-failure: rerun previous 1 failure first
test_04.py this is test_two2.this is test_one.this is test_two.
============================== 3 passed in 0.07s ==============================
Process finished with exit code 0
# 脚本不变,再运行依次脚本,发现未优先执行test_two2用例,因为上次结果# 没有断言失败的,所有不会优先执行,正常依次执行
collected 3 itemsrun-last-failure: 13 known failures not in selected tests
test_04.py this is test_one.this is test_two.this is test_two2.
============================== 3 passed in 0.03s ==============================
Process finished with exit code 0

--tb=style选项

捕捉到失败时输出信息的显示方式,某个测试用例失败后,pytest会列举出失败信息,包括失败在哪一行、是什么失败、怎么失败的,此过程称“信息回溯”它对找到问题很有帮助,但有时也会对多余的信息感到厌烦,这时--tb=style选项就有用武之地了,style类型有short、line、no。short模式仅输出assert的一行以及系统判定内容(不显示上下文);line模式只使用一行输出显示所有的错误信息;no模式则直接屏蔽全部回溯信息

pytest.main(['--tb=no','test_04.py']),屏蔽全部回溯信息
collected 3 items
test_04.py ..F [100%]
=========================== short test summary info ===========================FAILED test_04.py::TestClass::test_two2 - assert 2 == 1========================= 1 failed, 2 passed in 0.09s =========================
pytest.main(['--tb=line','test_04.py']),告诉我们错误的位置
collected 3 items
test_04.py ..F [100%]
================================== FAILURES ===================================C:\Users\wangli\PycharmProjects\untitled\test_04.py:15: assert 2 == 1=========================== short test summary info ===========================FAILED test_04.py::TestClass::test_two2 - assert 2 == 1========================= 1 failed, 2 passed in 0.19s =========================
Process finished with exit code 0
pytest.main(['--tb=short','test_04.py']),显示回溯信息比前面两种都详细
collected 3 items
test_04.py ..F [100%]
================================== FAILURES ===================================_____________________________ TestClass.test_two2 _____________________________test_04.py:15: in test_two2 assert 2 == 1E assert 2 == 1---------------------------- Captured stdout call -----------------------------this is test_two2=========================== short test summary info ===========================FAILED test_04.py::TestClass::test_two2 - assert 2 == 1========================= 1 failed, 2 passed in 0.42s =========================
Process finished with exit code 0
pytest.main(['--tb=long','test_04.py'])输出最详细的回溯信息
collected 3 items
test_04.py ..F [100%]
================================== FAILURES ===================================_____________________________ TestClass.test_two2 _____________________________
self = <test_04.TestClass object at 0x00000229D5D7E8D0>
def test_two2(self): print('this is test_two2')> assert 2 == 1E assert 2 == 1
test_04.py:15: AssertionError---------------------------- Captured stdout call -----------------------------this is test_two2=========================== short test summary info ===========================FAILED test_04.py::TestClass::test_two2 - assert 2 == 1========================= 1 failed, 2 passed in 0.18s =========================
Process finished with exit code 0


浏览 13
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报