3

我正在使用unittest2onPython2.5来发现测试unittest.TestLoader.discover,如下所示:

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

对于我项目基础的一些test_path人。

我有一个基类,它被许多其他人扩展和重载,但我想测试这些衍生物没有回归。让我们称该基类A及其派生类A1,A2等。

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

class A:
    pass

class A1(A):
    pass

class UT(unittest2.TestCase):
    target = A

class UT2(UT):
    target = A1

现在的诀窍是我正在制作A一个抽象类,并且UT几乎所有可以适当通过的测试用例都将失败UT2,等等。

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

对于上述情况,是否有任何可能合适的解决方案?

我会很感激任何想法和建议。

4

1 回答 1

2

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

这是拥有自己定义测试的基本测试用例的普遍问题。

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

class UT2(get_base_class()):
    target = A1

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

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

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

class UT2(TestCase, UT):
     target = A1
于 2011-06-09T11:04:33.247 回答