单元测试顺序
我怎么才能确定单元测试方法的顺序呢?是用字母顺序还是数字前缀比较合适呢?
class TestFoo(TestCase):
def test_1(self):
...
def test_2(self):
...
或者
class TestFoo(TestCase):
def test_a(self):
...
def test_b(self):
...
20 个回答
如果你使用'nose'这个工具,并且把测试用例写成函数(而不是某个TestCase类的方法),那么'nose'就不会改变测试的顺序,而是按照文件中函数的定义顺序来执行。
为了方便使用assert_*这些方法,而不需要去继承TestCase类,我通常会用NumPy的测试模块。举个例子:
from numpy.testing import *
def test_aaa():
assert_equal(1, 1)
def test_zzz():
assert_equal(1, 1)
def test_bbb():
assert_equal(1, 1)
用''nosetest -vv''命令运行这个,就会得到:
test_it.test_aaa ... ok
test_it.test_zzz ... ok
test_it.test_bbb ... ok
----------------------------------------------------------------------
Ran 3 tests in 0.050s
OK
给所有认为单元测试不应该有顺序的人提个醒:虽然单元测试应该是独立的,可以单独运行,但你的函数和类通常不是完全独立的。
它们往往是从简单的低级函数逐步构建到更复杂的高级函数。当你开始优化低级函数时,可能会出现问题(我自己经常这样;如果你不这样,可能根本不需要单元测试;-)),这时候如果简单函数的测试先执行,而依赖于这些简单函数的测试后执行,就更容易找出问题的原因。
如果测试是按字母顺序排列的,真正的原因往往会被一百个失败的断言淹没,而这些失败并不是因为被测试的函数有bug,而是因为它依赖的低级函数出了问题。
这就是我希望我的单元测试按照我指定的顺序排列的原因:不是为了在后面的测试中使用早期测试建立的状态,而是作为诊断问题的一个非常有用的工具。
没有人给出理由说明你不能在之前的测试基础上继续构建,或者说下一个测试就必须从头开始重做。通常没有人提供这样的理由,只是自信地说“你不应该这样做”。这并没有帮助。
总的来说,我对这里太多回答感到厌烦,这些回答基本上都是“你不应该这样做”,而不是给出一些信息,告诉提问者如果他们认为这样做有道理,应该如何更好地去做。如果我想知道某件事是否值得做,我会直接问人们这个事情是否是个好主意。
说完这些,如果你看看loadTestsFromTestCase这个方法,它最终会扫描类中的方法,寻找一些特定名称模式的方法,按照它们在类的方法字典中出现的顺序,也就是按键的顺序。然后它会把这些信息整理成一个测试套件,映射到TestCase类上。给它一个你想要的顺序列表也是一种方法。我不太确定最有效或最简洁的方法是什么,但这样做确实是可行的。
你可以通过把 sortTestMethodsUsing 设置为 None 来禁用它:
import unittest
unittest.TestLoader.sortTestMethodsUsing = None
对于纯粹的单元测试,你们说得对;但对于组件测试和集成测试……我不同意你们的看法,不能假设什么都不知道。
比如说,你的测试是验证一个服务在安装后是否会自动启动。如果在你的设置中,你先启动了这个服务,然后再进行验证,这样你就不是在测试状态,而是在测试“服务启动”的功能。
再比如,当你的设置过程很耗时或者需要很多空间时,频繁地运行这个设置就变得不太实际了。
很多开发者倾向于使用“单元测试”框架来进行组件测试……所以停下来问问自己,我是在做单元测试还是组件测试呢?