是否可以让Nose只运行TestCase或TestSuite的子类测试(如unittest.main())

6 投票
5 回答
2594 浏览
提问于 2025-04-16 00:23

我现在的测试框架是基于一个测试运行工具,这个工具是从Eclipse的pydev Python测试运行器派生出来的。我正在切换到使用Nose,它有很多我自定义测试运行器的功能,但代码质量似乎更好。

我的测试套件里有一些抽象的测试类,这些类之前从来没有被执行过。标准的Python测试运行器(还有我自定义的那个)只会运行unittest.TestCase和unittest.TestSuite的实例。

我注意到,自从我切换到Nose后,它几乎会运行所有以“test”开头的东西,这让我有点烦恼……因为我们用来命名测试混合类的方式也看起来像是测试类。之前这些类从来没有被当作测试运行,因为它们不是TestCase或TestSuite的实例。

显然,我可以把这些方法的名字改掉,不让它们包含“test”这个词……不过这会花费一些时间,因为测试框架非常庞大,还有很多继承关系。另一方面,如果能让Nose只识别TestCases和TestSuites作为可运行的测试,那就太好了……其他的都不算。

这能做到吗?

5 个回答

1

你可以使用nose的--attr参数来指定unittest.TestCase所拥有的某个属性。例如,我使用:

nosetests --attr="assertAlmostEqual"

你甚至可以更仔细一点,使用andor来进行匹配:

nosetests -A "assertAlmostEqual or addTest"

查看unittest的文档,可以找到完整的方法和属性列表,还有Nose的--attr插件的功能说明

2

如果你想要一个真正抽象的测试类,你可以直接从一个抽象类继承,然后在后面的测试案例中再继承这个类。

比如说:

class AbstractTestcases(object):
    def test_my_function_does_something(self):
        self.assertEquals("bar", self.func())

然后可以这样使用:

class TestMyFooFunc(AbstractTestcases, unittest.TestCase):
    def setUp(self):
        self.func = lambda: "foo"

这样的话,nosetests 只会找到 TestMyFooFunc 里的测试案例,而不会去找 AbstractTestCases 里的。

6

你可以尝试使用 -m 这个选项来运行 nosetests。根据文档的说明:

测试类是指在测试模块中定义的类,它符合 testMatch 的规则,或者是 unittest.TestCase 的子类。

-m 用来设置 testMatch,这样你就可以选择不测试任何以 test 开头的内容。

另外,你还可以在你的测试类声明中添加 __test__ = False,这样就可以标记这个类为“不是一个测试”。

撰写回答