通过子类化TestCas实现Python参数化unittest

2024-09-27 21:33:14 发布

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

如何创建多个测试用例并以编程方式运行它们?我尝试在一个公共测试用例上测试一个集合的多个实现。在

我更喜欢使用普通的unittest,避免依赖关系。在

以下是我查看的一些资源,这些资源并不完全符合我的需求:

下面是一个最小(非)工作示例。在

import unittest

MyCollection = set
AnotherCollection = set
# ... many more collections


def maximise(collection, array):
    return 2


class TestSubClass(unittest.TestCase):

    def __init__(self, collection_class):
        unittest.TestCase.__init__(self)
        self.collection_class = collection_class
        self.maximise_fn = lambda array: maximise(collection_class, array)


    def test_single(self):
        self.assertEqual(self.maximise_fn([1]), 1)


    def test_overflow(self):
        self.assertEqual(self.maximise_fn([3]), 1)

    # ... many more tests


def run_suite():
    suite = unittest.defaultTestLoader
    for collection in [MyCollection, AnotherCollection]:
        suite.loadTestsFromTestCase(TestSubClass(collection))
    unittest.TextTestRunner().run(suite)


def main():
    run_suite()


if __name__ == '__main__':
    main()

上述方法在loadTestsFromTestCase中出现错误:

TypeError: issubclass() arg 1 must be a class


Tags: runselfinitmaindef测试用例unittestarray
1条回答
网友
1楼 · 发布于 2024-09-27 21:33:14

使用^{} with to parametrize fixture如何:

import pytest

MyCollection = set
AnotherCollection = set


def maximise(collection, array):
    return 1

@pytest.fixture(scope='module', params=[MyCollection, AnotherCollection])
def maximise_fn(request):
    return lambda array: maximise(request.param, array)

def test_single(maximise_fn):
    assert maximise_fn([1]) == 1

def test_overflow(maximise_fn):
    assert maximise_fn([3]) == 1

如果这不是一个选项,您可以创建一个mixin来包含测试函数,并创建子类来提供maximise_fns:

^{pr2}$

相关问题 更多 >

    热门问题