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

python unitests通过其声明的执行顺序,第1张

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

首先,单元测试应该是独立的。因此必须是python-unittest。通过执行的测试

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

但是,根据您的观察,问题出现

test_10
在排序顺序似乎中断的地方。作为一个例子,其中3次试验用的名称
test_1
test_2
并且
test_10
,似乎单元测试执行
test_10
之前
test_2

  • 码:

    import unittest

    class Test(unittest.TestCase):

    @classmethoddef 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")@classmethoddef tearDown(self):    print("I'm in tearDown")

    if name == “main”:
    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讨论单元测试测试的顺序建议设置

    sortTestMethodsUsing
    None
    如下:

    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, compareordered, 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):        passif __name__ == '__main__':    unittest.main()

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

如果您有多个TestCase类,则

ordered, compare = make_orderer()
每个类都需要在
class

定义之前运行一次,尽管如何使用它
sortTestMethodsUsing
会更加棘手,而且我也无法对其进行测试。

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



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5655549.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存