从单元测试开始应该是独立的。所以必须是python-unittest。通过python-unittest 执行的测试应该以能够独立运行的方式设计。纯单元测试提供了一个好处,即当它们失败时,它们通常会描述究竟出了什么问题。我们仍然倾向于使用unittest 框架编写功能测试、集成测试和系统测试,并且这些测试如果不订购它们就无法运行,因为Selenium 会自动浏览上下文。为了实现排序,您至少需要对测试名称使用更好的命名约定,例如:test_1、test_2、test_3 等,这是因为测试是按照内置的排序的为字符串排序。
但是,根据您的观察,问题出现在test_10 等等,排序顺序似乎中断了。例如,在名称为test_1、test_2 和test_10 的3 个测试中,似乎unittest 在test_2 之前执行test_10:
-
代码:
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 __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
解决方案
在不同的讨论中提出了不同的解决方案,其中一些如下:
sortTestMethodsUsing 需要一个类似于 Python 2 的 cmp 的函数,它
在 Python 3 中没有等价物(我去检查 Python 3 是否有 <=>
宇宙飞船操作员,但显然不是;他们希望你依靠
< 和 == 的单独比较,这似乎是倒退
步...)。该函数需要两个参数进行比较,并且必须返回
如果第一个较小,则为负数。尤其是在这个特殊的
case,函数可以假设参数永远不相等,因为
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 一起使用
会更棘手,我还没有能够测试这个。
郑重声明,我正在测试的代码不依赖于测试
订单已修复 - 我完全理解您不应该依赖
测试顺序,这就是人们用来避免回答这个问题的原因
问题。我的测试顺序可以是随机的,而且可以正常工作
也是。但是,有一个很好的理由我想要订单
被固定为它们在文件中定义的顺序:它使它变得如此之多
一目了然哪些测试失败了。