如何在python中的不同实现中使用相同的单元测试?

Syl*_*are 5 python tdd automated-tests unit-testing python-unittest

我正在开发回答相同问题但使用不同算法的多个功能。

因此,所有功能的相同输入应生成相同的输出,这就是为什么我不得不使用相同的单元测试,而不必使用相同的逻辑创建多个测试的原因。

我使用的是Python unittest框架,我想使用一个抽象测试类来用函数变量定义泛型测试,以便可以用要在另一个普通测试类中测试的泛型实例化该泛型函数。但是似乎我无法在子类中实例化函数变量。

因此,这里是一个示例抽象类,其中包含针对多个功能的通用测试。

class AbstractTestCase():

    def test_generic_input_one(self):
        result = self.function("input 1")
        self.assertFalse(result)

    def test_generic_input_two(self):
        result = self.function("input 2")
        self.assertTrue(result)
Run Code Online (Sandbox Code Playgroud)

在这里,您将拥有的特定测试类,该类function_a继承了AbstractTestCase该类的通用测试并实现了自己的测试。

class TestsFunctionA(AbstractTestCase, unittest.TestCase):

    def setUp(self):
        self.function = function_a

    def test_specific_input(self):
        result = self.assertTrue(self.function("specific input"))
        self.assertTrue(result)
Run Code Online (Sandbox Code Playgroud)

我很确定它可以完成,但是我似乎找不到一个示例来了解如何实现它。我想避免代码重复。

最简单,最好的方法是什么?

Syl*_*are 8

我一直在寻找它并得到了几个例子,例如:

但是对我帮助最大的是vegard关于制作一个类工厂的回答,该工厂将接受参数并相应地创建 TestCase

该函数采用参数化测试用例的参数,实际的 TestCase 类可以毫无问题地引用它们。

这是一个示例,取一个foo.py文件:

import unittest

def make_test_case(x):
    class MyTestCase(unittest.TestCase):
        def test_foo(self):
            self.assertEquals(x, 1)

    return MyTestCase

class ConcreteTestCase(make_test_case(1)): 
    pass
Run Code Online (Sandbox Code Playgroud)

然后运行测试:

python -m unittest -v foo
Run Code Online (Sandbox Code Playgroud)

基本上,这非常灵活,并且非常适合我的用例。