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

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

在我项目的基础上。
我有一个基类,它被许多其他类扩展和重载,但是我想测试一下这些派生类没有回归。让我们调用基类test_path及其派生类AA1,等等。
我想创建一个A2基类,它可以为unittest2.TestCase的每个派生项重载。换句话说,我想要一个类似这样的层次结构:
class A:
    pass

class A1(A):
    pass

class UT(unittest2.TestCase):
    target = A

class UT2(UT):
    target = A1

现在的诀窍是我将A变成一个抽象类,并且A将在几乎所有适当通过UT的测试用例上失败,等等。
对我来说,最简单的解决方案似乎是让unittest2的UT2以某种方式“跳过”discover。我想这是可能的,把它放到一个文件中,而不是一个匹配的模式'test*.py',虽然这似乎不是这样。
对于上述情况,是否有合适的解决方案?
我很感激你的任何想法和建议。

最佳答案

我猜问题在于UT2继承自UT,所以定义UT2的模块导入UT,从而使其在模块名称空间中可用。因此,即使discovery不查看定义UT的模块,它仍然可以在UT2模块中找到TestCase。
这是一个有自己定义测试的基本测试用例的一般问题。
有一些可能性。一种方法是通过函数公开UT,因此包含UT2的模块导入该函数,而不是直接导入UT:

class UT2(get_base_class()):
    target = A1

可以使用super()访问UT上的属性。
另一个或许更好的解决方案是让UT也更抽象。你可以忽略UT上的目标(因为它似乎没有作用?)如果没有目标(或者目标是一个),则让setUp调用skipTest。
第三种解决方案是让UT不从TestCask继承,而是使用它作为MIXIN:
class UT2(TestCase, UT):
     target = A1

关于python - Python Unittest2-避免在Discover()中包含TestCase,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6286499/

10-11 05:04