对同一函数分组多个pytest案例

时间:2018-01-14 04:22:58

标签: python pytest

如何为同一个函数分组多个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)

2 个答案:

答案 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所述,这也是可行的。