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