1. unittest 简介
这是标准库也是最常见的Python单元测试框架,它基于Java的JUnit框架,最初由Steve Purcell编写(以前称为PyUnit)
unittest基本上提供了Java中的Junit框架的功能。它提供了一个名为TestCase的基类,它有一组广泛的方法来验证函数调用和语句的输出。
该模块是为编写单元测试而创建的,但是只要测试使用用户接口,验收测试也可以用它来编写。例如,一些测试框架提供帮助,在unittest之上驱动工具,如Selenium。
2. unittest 使用
使用unittest为一个模块编写一个简单的单元测试,这是通过继承TestCase类并且使用test前缀来编写方法来完成的。测试驱动开发原则部分的最后一个例子
import unittest
class MyTests(unittest.TestCase):
def test_print(self):
print("test1")
def test_print2(self):
print("test2")
def atest_print2(self):
print("test3")
if __name__ == "__main__":
unittest.main()
运行结果:
============================= test session starts ==============================
platform darwin -- Python 3.7.4, pytest-4.6.3, py-1.8.0, pluggy-0.12.0
rootdir: collected 2 items
test2.py .test1
.test2 [100%]
=========================== 2 passed in 0.02 seconds ===========================
Process finished with exit code 0
unittest.main()函数是一个通用程序,它允许将整个模块作为一个测试套件执行
unittest.main()函数扫描当前模块的上下文,并查找TestCase类的子类。它实例化这些子类,然后运行所有以test作为前缀开头的方法。
如果单独调用某个测试任务可以执行: python test.py MyTests.test_print (修改为实际对应的函数就可以)
3. unittest 的 TestSuite类
unittest提供了一个TestSuite类,可以聚合测试并将它们作为测试活动运行,只要它们都是TestCase或TestSuite的实例。
在以往的Python中,有这样一个约定,测试模块提供一个test_suite函数,该函数返回一个TestSuite实例,当模块被命令提示符调用或被测试运行器使用时,在__main__部分会调用它
# -*- coding: utf-8 -*-
import unittest
class MyTests(unittest.TestCase):
def test_print(self):
print("test1")
def test_print2(self):
print("test2")
def atest_print2(self):
print("test3")
class OtherTests(unittest.TestCase):
def test_print(self):
print("test4")
def test_print2(self):
print("test5")
def atest_print2(self):
print("test6")
def test_suite():
# 构建测试套件
suite = unittest.TestSuite()
suite.addTests(unittest.makeSuite(MyTests))
suite.addTests(unittest.makeSuite(OtherTests))
return suite
if __name__ == "__main__":
unittest.main(defaultTest='test_suite')
4. 其他三方测试工具
- nose
- py.test