test:从类中参数化测试用例

2024-04-26 13:19:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在遵循这个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)

如何生成一个测试电池?


Tags: pytestimportself示例pytest测试用例unittest
2条回答

如果从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

不过,在这一点上,它有点回避了为什么要使用类而不是仅仅定义函数的问题,因为测试本质上是相同的,但需要较少的总体样板和代码。

最后,考虑到@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

相关问题 更多 >