指定单元测试执行顺序的Nose插件



我希望使用Nose作为在线集成测试套件。然而,其中一些测试的执行顺序很重要。

也就是说,我想我会把一个快速的插件放在一起,用我想要执行的顺序来装饰一个测试:https://gist.github.com/Redsz/5736166

def Foo(unittest.TestCase):
    @step(number=1)
    def test_foo(self):
        pass
    @step(number=2)
    def test_boo(self):
        pass

从审查内置的插件,我曾想过,我可以简单地覆盖loadTestsFromTestCase和顺序的装饰'步骤数'的测试。:

def loadTestsFromTestCase(self, cls):
    """
    Return tests in this test case class. Ordered by the step definitions.
    """
    l = loader.TestLoader()
    tmp = l.loadTestsFromTestCase(cls)
    test_order = []
    for test in tmp._tests:
        order = test.test._testMethodName
        func = getattr(cls, test.test._testMethodName)
        if hasattr(func, 'number'):
            order = getattr(func, 'number')
        test_order.append((test, order))
    test_order.sort(key=lambda tup: tup[1])
    tmp._tests = (t[0] for t in test_order)
    return tmp

这个方法按照我想要的顺序返回测试,但是当测试被执行时,它们不是按照这个顺序执行的吗?

也许我需要把这个排序的概念移到一个不同的位置?

UPDATE:根据我所做的评论,插件实际上是按预期工作的。我错误地相信了pycharm测试记者。测试按预期运行。与其把这个问题去掉,我想还是让它留着吧。

来自文档:

[…nose按照功能测试在模块文件中出现的顺序运行。testcase派生的测试和其他测试类按字母顺序运行。

因此,一个简单的解决方案可能是重命名测试用例中的测试:
class Foo(unittest.TestCase):
    def test_01_foo(self):
        pass
    def test_02_boo(self):
        pass

我找到了一个使用PyTest排序插件的解决方案。

在CLI中尝试py.test YourModuleName.py -vv,测试将按照它们在模块中出现的顺序运行(首先是test_foo,然后是test_bar)

我做了同样的事情,对我来说效果很好。

注意:您需要安装PyTest包并导入它

相关内容

  • 没有找到相关文章

最新更新