首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Python中生成动态(参数化)单元测试?

如何在Python中生成动态(参数化)单元测试?
EN

Stack Overflow用户
提问于 2008-08-28 17:49:02
回答 15查看 149.7K关注 0票数 312

我有一些测试数据,并希望为每个项目创建一个单元测试。我的第一个想法是这样做:

代码语言:javascript
复制
import unittest

l = [["foo", "a", "a",], ["bar", "a", "b"], ["lee", "b", "b"]]

class TestSequence(unittest.TestCase):
    def testsample(self):
        for name, a,b in l:
            print "test", name
            self.assertEqual(a,b)

if __name__ == '__main__':
    unittest.main()

这样做的缺点是它在一次测试中处理所有数据。我想在飞行中为每个项目生成一个测试。有什么建议吗?

EN

回答 15

Stack Overflow用户

发布于 2014-01-02 00:52:25

使用元类可以很好地解决这个问题:

代码语言:javascript
复制
import unittest

l = [["foo", "a", "a",], ["bar", "a", "b"], ["lee", "b", "b"]]

class TestSequenceMeta(type):
    def __new__(mcs, name, bases, dict):

        def gen_test(a, b):
            def test(self):
                self.assertEqual(a, b)
            return test

        for tname, a, b in l:
            test_name = "test_%s" % tname
            dict[test_name] = gen_test(a,b)
        return type.__new__(mcs, name, bases, dict)

class TestSequence(unittest.TestCase):
    __metaclass__ = TestSequenceMeta

if __name__ == '__main__':
    unittest.main()
票数 87
EN

Stack Overflow用户

发布于 2014-05-07 11:55:21

load_tests是2.7中引入的一种鲜为人知的动态创建TestSuite的机制。使用它,您可以轻松地创建参数化测试。

例如:

代码语言:javascript
复制
import unittest

class GeneralTestCase(unittest.TestCase):
    def __init__(self, methodName, param1=None, param2=None):
        super(GeneralTestCase, self).__init__(methodName)

        self.param1 = param1
        self.param2 = param2

    def runTest(self):
        pass  # Test that depends on param 1 and 2.


def load_tests(loader, tests, pattern):
    test_cases = unittest.TestSuite()
    for p1, p2 in [(1, 2), (3, 4)]:
        test_cases.addTest(GeneralTestCase('runTest', p1, p2))
    return test_cases

该代码将运行load_tests返回的TestSuite中的所有TestCases。发现机制不会自动运行任何其他测试。

或者,您也可以使用继承,如此票证所示:http://bugs.python.org/msg151444

票数 41
EN

Stack Overflow用户

发布于 2014-09-02 23:08:02

这可以通过使用pytest来完成。只需编写包含内容的文件test_me.py

代码语言:javascript
复制
import pytest

@pytest.mark.parametrize('name, left, right', [['foo', 'a', 'a'],
                                               ['bar', 'a', 'b'],
                                               ['baz', 'b', 'b']])
def test_me(name, left, right):
    assert left == right, name

并使用命令py.test --tb=short test_me.py运行测试。然后输出将如下所示:

代码语言:javascript
复制
=========================== test session starts ============================
platform darwin -- Python 2.7.6 -- py-1.4.23 -- pytest-2.6.1
collected 3 items

test_me.py .F.

================================= FAILURES =================================
_____________________________ test_me[bar-a-b] _____________________________
test_me.py:8: in test_me
    assert left == right, name
E   AssertionError: bar
==================== 1 failed, 2 passed in 0.01 seconds ====================

这很简单!此外,pytest还具有更多功能,如fixturesmarkassert等。

票数 35
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档