问题 Py.test:从类中参数化测试用例


我现在正在关注此事 py.test 例如,当我不使用类时它可以工作,但是当我将测试用例引入类时,我失败了。

我设法编写的最小案例如下:

import unittest

import pytest

class FixtureTestCase(unittest.TestCase):

    @pytest.mark.parametrize("test_input,expected", [
    ("3+5", 8),
    ("2+4", 6),
    ("6*9", 42),
    ])
    def test_1(self, a, b):
        self.assertEqual(a, b)

不幸的是,当我执行

  py.test  test_suite.py

我收到错误消息:

  TypeError: test_1() takes exactly 3 arguments (1 given)

如何生成一系列test_1测试?


5876
2018-02-22 19:08


起源

你的类是否需要成为其子类 TestCase? - Brendan Abel
目前,它不是强制性的,我需要的是参数化定义到类中的测试 - pafede2
至于参数化测试 TestCase 方法,这个旧问题的答案似乎仍然有效: stackoverflow.com/questions/18182251/... 简而言之:混合这两个概念是行不通的。 - Thomas Lotze


答案:


如果你是子类 unittest.TestCase,您的测试方法不能有其他参数。如果你只是从中继承 object,它会工作(虽然你必须使用常规 assert 陈述而不是 TestCase.assertEqual 方法。

import unittest

import pytest

class TestCase(object):

    @pytest.mark.parametrize("test_input,expected", [
    ("3+5", 8),
    ("2+4", 6),
    ("6*9", 42),
    ])
    def test_1(self, a, b):
        assert eval(a) == b

但是,在这一点上,它有点问题为什么你使用类而不仅仅是定义函数,因为测试基本上是相同的,但需要更少的整体样板和代码。


11
2018-02-22 19:42



这个提议已经解决,但pytest没有确定任何测试。它打印出图例“收集的0项”。有什么建议吗? - pafede2
对不起,我还想表明类名需要从头开始 Test 以及pytest来接它。 - Brendan Abel
我刚刚接受了答案,但是我想知道当类继承自unittest.TestCase时是否还会有一个选项? - pafede2
你将无法使用 parametrize。该 文档 来自@ThomasLotze的链接解释了它。它们提供了一些攻击限制的可能性,在您的情况下可能涉及在类上设置测试值,然后在测试函数中循环以运行具有多个测试值的测试。 - Brendan Abel
有一个原因让我想知道,如果不可能,我将需要重新实现一些测试类。 - pafede2


最后,考虑到@Brendan Abel的回复和评论,我成功完成了我打算做的事情:

class TestCase(object):

    @parameterized.expand([
    ("negative", -1.5, -2.0),
    ("integer", 1, 1.0),
    ("large fraction", 1.6, 1),
    ])
    def test_floor(self, name, input, expected):
        assert_equal(math.floor(input), expected)


    @parameterized.expand([
    ("3+5", 8),
    ("2+4", 6),
    ("6*9", 42),
    ])
    def test_1(self, a, b):
        assert_equal(eval(a), b)

然后我就可以通过执行测试了 nosetests 命令:

  nosetests -v --with-id class.py

0
2018-02-23 16:07