是否可以让Nose只运行TestCase或TestSuite的子类测试(如unittest.main())
我现在的测试框架是基于一个测试运行工具,这个工具是从Eclipse的pydev Python测试运行器派生出来的。我正在切换到使用Nose,它有很多我自定义测试运行器的功能,但代码质量似乎更好。
我的测试套件里有一些抽象的测试类,这些类之前从来没有被执行过。标准的Python测试运行器(还有我自定义的那个)只会运行unittest.TestCase和unittest.TestSuite的实例。
我注意到,自从我切换到Nose后,它几乎会运行所有以“test”开头的东西,这让我有点烦恼……因为我们用来命名测试混合类的方式也看起来像是测试类。之前这些类从来没有被当作测试运行,因为它们不是TestCase或TestSuite的实例。
显然,我可以把这些方法的名字改掉,不让它们包含“test”这个词……不过这会花费一些时间,因为测试框架非常庞大,还有很多继承关系。另一方面,如果能让Nose只识别TestCases和TestSuites作为可运行的测试,那就太好了……其他的都不算。
这能做到吗?
5 个回答
你可以使用nose的--attr参数来指定unittest.TestCase所拥有的某个属性。例如,我使用:
nosetests --attr="assertAlmostEqual"
你甚至可以更仔细一点,使用and和or来进行匹配:
nosetests -A "assertAlmostEqual or addTest"
查看unittest的文档,可以找到完整的方法和属性列表,还有Nose的--attr插件的功能说明。
如果你想要一个真正抽象的测试类,你可以直接从一个抽象类继承,然后在后面的测试案例中再继承这个类。
比如说:
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
里的。
你可以尝试使用 -m
这个选项来运行 nosetests
。根据文档的说明:
测试类是指在测试模块中定义的类,它符合
testMatch
的规则,或者是unittest.TestCase
的子类。
-m
用来设置 testMatch
,这样你就可以选择不测试任何以 test 开头的内容。
另外,你还可以在你的测试类声明中添加 __test__ = False
,这样就可以标记这个类为“不是一个测试”。