17

我希望将 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

此方法按我想要的顺序返回测试,但是当测试由鼻子执行时,它们不是按此顺序执行的吗?

也许我需要将这种订购概念转移到不同的位置?

更新:根据我的评论,该插件实际上按预期工作。我错误地相信了 pycharm 测试报告者。测试按预期运行。而不是删除我认为我会留下它的问题。

4

2 回答 2

20

文档中:

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

因此,一个简单的解决方案可能是重命名测试用例中的测试:

class Foo(unittest.TestCase):

    def test_01_foo(self):
        pass

    def test_02_boo(self):
        pass
于 2013-09-05T02:57:10.490 回答
0

我使用此处提供的 PyTest 订购插件找到了解决方案。

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

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

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

于 2015-05-07T17:52:52.193 回答