首先,单元测试应该是独立的。因此必须是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):
@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讨论单元测试测试的顺序建议设置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, 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
会更加棘手,而且我也无法对其进行测试。
记录下来,我正在测试的代码 不 依赖于固定的测试顺序- 我完全理解您不应该依赖于测试顺序,这就是人们避免回答这个问题的原因。我的测试顺序可以是随机的,也可以正常工作。但是,有一个很好的理由,我希望将顺序固定为文件中定义的顺序:一目了然,可以 轻松查看 哪些 测试失败。