Python Unittest2 - 避免在discover()中包含TestCase

时间:2011-06-08 23:32:39

标签: python unit-testing unittest2

我在unittest2上使用Python2.5来发现unittest.TestLoader.discover的测试,如下所示:

suite = unittest2.loader.TestLoader().discover(test_path)
unittest2.TextTestRunner(verbosity=2,
        resultclass=ColorTestResult).run(suite)

对于项目基础上的某些test_path

我有一个基类被许多其他人扩展和超载,但我想测试那些衍生物没有回归。我们称之为基类A及其派生A1A2等。

我想创建一个unittest2.TestCase基类,可以为A的每个导数重载。换句话说,我希望有一个像这样的层次结构:

class A:
    pass

class A1(A):
    pass

class UT(unittest2.TestCase):
    target = A

class UT2(UT):
    target = A1

现在的诀窍是我将A变成了一个抽象类,UT几乎会在UT2等适当传递的所有测试用例中失败。

对我来说最简单的解决方案似乎是让unittest2的discover以某种方式“跳过”UT。我认为这可以通过将其放入一个匹配模式'test * .py'以外的文件中来实现,尽管情况似乎并非如此。

上述方案是否有适当的解决方案?

我对任何想法和建议表示感谢。

1 个答案:

答案 0 :(得分:2)

我猜测问题是UT2继承自UT,因此定义UT2的模块会导入UT - 因此可以在模块命名空间中使用它。因此,即使发现没有查看定义了UT的模块,它仍然可以在UT2模块中找到TestCase。

这是一个基本TestCase本身定义测试的一般问题。

有几种可能性。一种是通过函数公开UT,因此包含UT2的模块直接导入函数而不是UT:

class UT2(get_base_class()):
    target = A1

可以使用super()访问UT上的属性。

另一个也许更好的解决方案是让UT更加抽象。您可以省略UT上的目标(因为它似乎没有用处?)并且如果没有目标(或者如果目标是A),则setUp调用skipTest。

第三个​​解决方案是让UT 从TestCase继承,但将其用作mixin:

class UT2(TestCase, UT):
     target = A1