我正在寻找一种在PyTest中运行所有单元测试的方法,即使其中一些测试失败了。我知道必须有一个简单的方法来做到这一点。我检查了CLi选项,并查看了这个网站的类似问题/答案,但没有看到任何东西。对不起,如果已经回答了这个问题。
例如,请考虑以下代码片段,其中包含PyTest代码:
def parrot(i):
return i
def test_parrot():
assert parrot(0) == 0
assert parrot(1) == 1
assert parrot(2) == 1
assert parrot(2) == 2
默认情况下,执行在第一次失败时停止:
$ python -m pytest fail_me.py
=================== test session starts ===================
platform linux2 -- Python 2.7.10, pytest-2.9.1, py-1.4.31, pluggy-0.3.1
rootdir: /home/npsrt/Documents/repo/codewars, inifile:
collected 1 items
fail_me.py F
=================== FAILURES ===================
___________________ test_parrot ___________________
def test_parrot():
assert parrot(0) == 0
assert parrot(1) == 1
> assert parrot(2) == 1
E assert 2 == 1
E + where 2 = parrot(2)
fail_me.py:7: AssertionError
=================== 1 failed in 0.05 seconds ===================
我想做的是即使在PyTest遇到第一次失败后仍然可以继续执行代码。
它运行了所有测试。你只写了一个测试,测试就跑了!
如果你想要非致命断言,如果断言失败(如Google Test的EXPECT宏),测试将继续进行,请尝试pytest-expect,它提供了该功能。以下是他们网站提供的示例:
def test_func(expect):
expect('a' == 'b')
expect(1 != 1)
a = 1
b = 2
expect(a == b, 'a:%s b:%s' % (a,b))
您可以看到期望失败并未停止测试,并且报告了所有失败的预期:
$ python -m pytest test_expect.py
================ test session starts =================
platform darwin -- Python 2.7.9 -- py-1.4.26 -- pytest-2.7.0
rootdir: /Users/okken/example, inifile:
plugins: expect
collected 1 items
test_expect.py F
====================== FAILURES ======================
_____________________ test_func ______________________
> expect('a' == 'b')
test_expect.py:2
--------
> expect(1 != 1)
test_expect.py:3
--------
> expect(a == b, 'a:%s b:%s' % (a,b))
a:1 b:2
test_expect.py:6
--------
Failed Expectations:3
============== 1 failed in 0.01 seconds ==============
正如其他人已经提到的那样,理想情况下你会编写多个测试,每个测试只有一个断言(这不是一个硬限制,而是一个很好的指导)。
@pytest.mark.parametrize
装饰器使这很容易:
import pytest
def parrot(i):
return i
@pytest.mark.parametrize('inp, expected', [(0, 0), (1, 1), (2, 1), (2, 2)])
def test_parrot(inp, expected):
assert parrot(inp) == expected
使用-v
运行时:
parrot.py::test_parrot[0-0] PASSED
parrot.py::test_parrot[1-1] PASSED
parrot.py::test_parrot[2-1] FAILED
parrot.py::test_parrot[2-2] PASSED
=================================== FAILURES ===================================
_______________________________ test_parrot[2-1] _______________________________
inp = 2, expected = 1
@pytest.mark.parametrize('inp, expected', [(0, 0), (1, 1), (2, 1), (2, 2)])
def test_parrot(inp, expected):
> assert parrot(inp) == expected
E assert 2 == 1
E + where 2 = parrot(2)
parrot.py:8: AssertionError
====================== 1 failed, 3 passed in 0.01 seconds ======================
您应该能够使用--maxfail
参数来控制它。我相信默认是不会因为失败而停止,所以我会检查你可能拥有的任何py.test配置文件。