Nosetests没有看到单元测试发现的测试类

时间:2016-08-02 18:18:17

标签: python python-2.7 unit-testing nose python-unittest

我有什么我只能考虑一个非常奇怪的问题,nosetests识别有效测试类的类。

我通过使用以下方法将测试类初始化为具有来自基础测试类的特定继承的通用type

def random_test_class(n):
    print "Generating %d random test cases..." % n
    def make_test(genre, ss, ps):
        return lambda self: self.compose(genre, ss, ps)
    return type('TestEverything', (TestBase,),
                { 'test_%d' % i: make_test(genre, ss, ps)
                  for (i, (genre, ss, ps)) in zip(xrange(n), generate_settings())
                })

然后用

初始化课程
class TestEverything(random_test_class(100)):
    pass

现在,当我用python -m unittest discover调用我的标准测试框架时,测试非常高兴,它将TestEverything类视为定义100个测试方法的测试类(test_1test_2等等......)但是,如果我使用nosetests ./ -m "test_*",则拒绝将TestEverything视为有效的测试类,并且不会运行任何测试方法。

我该如何解决这个问题?我真的需要xunit提供的nosetests输出框架,但我非常希望避免使用正确初始化具有特定测试元类的类所需的所有元类faff。

1 个答案:

答案 0 :(得分:1)

在决定是否在测试中包含方法时,Nose会检查实现该方法的函数的名称而不是属性名称。更改您make_test,以便创建的测试具有Nose将选择的名称。

def make_test(genre, ss, ps):
    def test(self):
        self.compose(genre, ss, ps)
    return test

这将匹配您在问题中提供的正则表达式。 test_*匹配其中包含test的任何名称,后跟任意数量的下划线。

请注意,如果您希望函数具有不同的名称,则可以将索引传递给make_test并设置test.__name__

def make_test(i, genre, ss, ps):
    def test(self):
        self.compose(genre, ss, ps)
    test.__name__ = 'test_%d' % i
    return test