如何为同一个函数分组多个pytests?
命名约定test_<function name>_case_<test description>
可行。但是当每个函数都有很多函数和大量测试用例时,这看起来很乏味。
参数化在这种情况下不会有帮助,因为不同的测试用例会对函数执行不同的检查。
当前方法(命名约定):
import pytest
class apple():
def __init__(*args):
...
def eat(food):
...
def test_apple_case_color_is_red():
"""test if color is red"""
assert apple().color == "red"
def test_apple_case_edible():
"""test if apple is edible"""
assert eat(apple)
不能通过参数化将两个测试组合在一起,因为这两个测试会进行不同的检查。
unittest可以对测试用例进行分组:
import unittest
class TestApple(unittest.TestCase):
def test_color():
"""check if color is red"""
assert apple().color == "red"
def test_edible():
"""check if edible"""
assert eat(apple)
答案 0 :(得分:1)
我就是这样做的。考虑到你的例子的简单性,看起来有点傻,但这是它的要点。
@pytest.mark.parametrize("input,expected", [
("0", 0),
("1", 1),
("10", 10),
])
def test_thing_with_input(input, expected):
assert len(thing(4,input)) == expected
def test_thing_empty():
assert thing(4,0) == []
鉴于更新,您还可以在pytest中创建包含测试的类
class TestThing:
@pytest.mark.parametrize("input,expected", [
("0", 0),
("1", 1),
("10", 10),
])
def test_with_input(self, input, expected):
assert len(thing(4,input)) == expected
def test_empty(self):
assert thing(4,0) == []
答案 1 :(得分:1)
如果我很了解您的问题,这里有两件事:
显然,将两者融合即可生成测试。对于数据科学测试来说,通常就是这种情况,因为您拥有许多测试数据集,有时甚至超过测试用例。
您可以为此使用pytest-cases(顺便说一下,我是作者):
from pytest_cases import CaseData, THIS_MODULE, CaseDataGetter, cases_data
# --------- test cases ----------
def case_red_apple() -> CaseData:
""" Returns a red apple """
return apple('red'), None, None
def case_green_apple() -> CaseData:
""" Returns a green apple """
return apple('green'), None, None
# ------- test functions
@cases_data(module=THIS_MODULE)
def test_apple_color(case_data: CaseDataGetter):
""" Grabs an apple and check that its color is ok """
apple = case_data.get()
assert apple.color in {'red', 'green'}
@cases_data(module=THIS_MODULE)
def test_apple_else(case_data: CaseDataGetter):
""" Grabs an apple and asserts something else """
apple = case_data.get()
# assert something else...
但是从您的问题中我也感觉到您希望在同一实例上链接两个测试:您希望看到针对每个测试数据(针对每个苹果)的一系列测试步骤在上面(颜色测试,然后是食用性测试)。如here所述,这也是可行的。