您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

python unitests通过其声明的执行顺序

python unitests通过其声明的执行顺序

首先,单元测试应该是独立的。因此必须是python-unittest。通过执行的测试python- unittest应该以能够独立运行的方式进行设计。纯单元测试的好处是,当它们失败时,它们通常会描述出确切的错误。我们仍然倾向于使用该unittest框架编写功能测试,集成测试和系统测试,并且如果不对它们进行排序就无法运行这些测试,因为Selenium会自动实现 浏览上下文 。为了实现排序,你,至少使用一个更好的命名约定为testnames,作为一个例子需要:test_1test_2test_3,等等,这是有效的,因为测试是根据字符串的内置顺序进行排序的。

但是,根据您的观察,问题出现test_10在排序顺序似乎中断的地方。作为一个例子,其中3次试验用的名称test_1test_2并且test_10,似乎单元测试执行test_10之前test_2

码:

import unittest

class Test(unittest.TestCase):

@classmethod
def setUp(self):
    print("I'm in setUp")

def test_1(self):
    print("I'm in test 1")

def test_2(self):
    print("I'm in test 2")

def test_10(self):
    print("I'm in test 10")

@classmethod
def tearDown(self):
    print("I'm in tearDown")

if == “”: unittest.main()

控制台输出

Finding files... done.

Importing test modules … done.

I’m in setUp I’m in test 1 I’m in tearDown I’m in setUp I’m in test 10 I’m in tearDown I’m in setUp I’m in test 2 I’m in tearDown

Ran 3 tests in 0.001s

OK

在不同的讨论中提供了不同的解决方案,其中一些如下:

@Max讨论单元测试测试的顺序建议设置sortTestMethodsUsingNone如下:

import unittest

unittest.TestLoader.sortTestMethodsUsing = None

@atomocopter在讨论更改Python中的单元测试顺序时,建议将设置sortTestMethodsUsing为以下值:

import unittest

unittest.TestLoader.sortTestMethodsUsing = lambda _, x, y: cmp(y, x)

@ElmarZander在讨论的单元测试顺序建议中建议使用nose和编写您的测试用例,因为它们是函数(而不是某些TestCase派生类的方法),nose它不会改变顺序,而是使用文件中定义的函数顺序。

@Keiji在讨论控制unittest.TestCases的顺序时提到:

sortTestMethodsUsing希望像Python 2层的一个功能cmp,它在Python 3里没有相应的(我去检查,如果Python 3中有一个<=> 飞船运营商还没有,但显然不是,他们希望你能依靠独立的比较<==,这似乎太大的倒退一步…)。该函数接受两个参数进行比较,如果第一个较小,则必须返回负数。值得注意的是,在这种特殊情况下 ,该函数可以假定参数永远不相等,因为 unittest不会在其测试名称列表中放置重复项。

考虑到这一点,假设您仅使用一个TestCase类,这是我发现的最简单方法

def make_orderer():
    order = {}

    def ordered(f):
        order[f.__name__] = len(order)
        return f

    def compare(a, b):
        return [1, -1][order[a] < order[b]]

    return ordered, compare

ordered, compare = make_orderer()
unittest.defaultTestLoader.sortTestMethodsUsing = compare

然后,用注释每个测试方法@ordered

class TestMyClass(unittest.TestCase):
    @ordered
    def test_run_me_first(self):
        pass

    @ordered
    def test_do_this_second(self):
        pass

    @ordered
    def test_the_final_bits(self):
        pass

if __name__ == '__main__':
    unittest.main()

这依赖于Python调用注释,注释函数文件中出现的顺序。据我所知,这是有意的,如果更改,我会感到惊讶,但实际上我不知道这是否是保证的行为。我认为该解决方案甚至也可以在Python 2中使用,对于那些不幸地坚持使用该解决方案的人,尽管我还没有机会进行测试。

如果您有多个TestCase类,则ordered, compare = make_orderer()每个类都需要在class 定义之前运行一次,尽管如何使用它sortTestMethodsUsing 会更加棘手,而且我也无法对其进行测试。

记录下来,我正在测试的代码 依赖于固定的测试顺序- 我完全理解您不应该依赖于测试顺序,这就是人们避免回答这个问题的原因。我的测试顺序可以是随机的,也可以正常工作。但是,有一个很好的理由,我希望将顺序固定为文件中定义的顺序:一目了然,可以 轻松查看 哪些 测试失败。

python 2022/1/1 18:39:05 有302人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶