文章来源:http://my.oschina.net/lionets/blog/268704
unittest 是 Python 发行版自带的包。如果你听说过 PyUnit(OSC 开源项目页面中就有 PyUnit 的页面),那么这俩其实是同一个东西——PyUnit 是 unittest 的曾用名,因为 PyUnit 最早也是来源于 Kent 和 Erich 的 JUnit(xUnit 测试框架系列的 Java 版本)
import unittest
from unnecessary_math import multiply
class TestUM(unittest.TestCase):
def setUp(self):
pass
def test_number_3_4(self):
self.assertEqual(multiply(3,4),12)
def test_string_a_3(self):
self.assertEqual(multiply('a',3),'aaa')
if __name__ == '__main__':
unittest.main()
$ python test_um_test.py
..
--------------------------------------
Ran 2 tests in 0.01s
OK
同样 -v 参数是可选的,也可以在 unittest.main() 函数里直接指定:verbosity=1。
$ cd project_directory
$ python -m unittest discover
discover 可用的参数有 4 个(-v -s -p -t),其中 -s 和 -t 都与路径有关,如上例中提前 cd 到项目路径的话这俩参数都可以无视;-v 喜闻乐见;-p 是 --pattern 的缩写,可用于匹配某一类文件名。
import unittest
class simple_test(unittest.TestCase):
def setUp(self):
self.foo = list(range(10))
def test_1st(self):
self.assertEqual(self.foo.pop(),9)
def test_2nd(self):
self.assertEqual(self.foo.pop(),9)
if __name__ == '__main__':
unittest.main()
注意这里两次测试均对同一个实例属性 self.foo 进行了 pop() 调用,但测试结果均为 pass,即说明,test_1st 和 test_2nd 在调用前都分别调用了一次 setUp()。
import unittest
class simple_test(unittest.TestCase):
@classmethod
def setUpClass(self):
self.foo = list(range(10))
def test_1st(self):
self.assertEqual(self.foo.pop(),9)
def test_2nd(self):
self.assertEqual(self.foo.pop(),8)
if __name__ == '__main__':
unittest.main()
这个例子里我们使用了一个类级别的 setUpClass() 类方法,并修改了第二次 pop() 调用的预期返回值。运行结果显示依然是全部通过,即说明这次在全部测试项被调用前只调用了一次 setUpClass()。
import unittest
def setUpModule():
pass
class simple_test(inittest.TestCase):
...
一般 assert*() 方法如果抛出了未被捕获的异常,那么这条测试用例会被记为 fail,测试继续进行。但如果异常发生在 setUp() 里,就会认为测试程序自身存在错误,后面的测试用例和 tearDown() 都不会再执行。即,tearDown() 仅在 setUp() 成功执行的情况下才会执行,并一定会被执行。