前言
本次就python unittest单元测试框架的一些基本的、常用的API 进行分享,以便大家后续更深入的熟悉和应用unittest。
TestCase类API
TeseCase类实例化的对象是最小的可测单元颗粒。它维护着一组测试方法以及为测试方法所提供的初始化方法和清理方法。
下面我们一起看一下定义在TestCase类中常用的方法
- setUp()
初始化函数,在所有的测试方法调用之前调用(自动调用)
- tearDown()
清理函数,在所有的测试方法调用之后调用(自动调用)
- setUpClass()
类初始化方法,在单个类中的所有测试方法调用之前调用
- tearDownClass()
类清理方法,在单个类中的所有测试方法调用之后调用
- run(result=None)
运行测试,并返回测试结果(返回值为对象)
- skipTest(reason)
在测试方法或setUp调用该方法可跳过当前测试
- debug()
以不采集测试结果方式运行测试
- shortDescription()
返回一行描述的测试结果信息
TestSuite类API
在python unittest中,提供了一套非常不错的用例组织机制(TestSuite):用来组织系列TestCase构建测试套件。
下面一起看看如何一步步的创建套件并运行它
- 创建TestSuite实例对象
suite = unittest.TestSuite()
- 添加TestCase对象至套件中
suite.addTest(testcase class)
- 添加TestCase对象至套件中方法2
suite = unittest.makeSuite(testcase class)
- 添加测试方法至套件中
suite.addTest(testcaseclass("testmethod"))
- 使用TextTestRunner创建一个运行器
runner = unittest.TextTestRunner()
- 运行
runner.run(suite)
下面看看TestSuite类的API说明,以便进一步理解上述过程的细节。
- addTest()
新增一个测试方法到套件中
- addTests()
新增多个测试方法到套件中
- run()
运行套件中关联的测试方法,并返回测试结果(返回值为测试结果对象)
- debug()
运行套件中关联的测试方法,但不搜集测试结果
- countTestCases()
返回当前测试对象的测试方法数
TestSuite应用示例
下面我用看一个TestSuite应用基本示例
# _*_ coding:utf-8 _*_
__author__ = '苦叶子'
import unittest
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
class suiteTest(unittest.TestCase):
def setUp(self):
self.a = 10
self.b = 20
def testadd(self):
# 验证加法
result = self.a + self.b
self.assertTrue(result == 100)
def testsub(self):
# 验证减法
result = self.a - self.b
self.assertTrue(result == -10)
# 定义suite
def suite():
suite = unittest.TestSuite()
# 添加测试方法
suite.addTest(suiteTest("testadd"))
suite.addTest(suiteTest("testsub"))
## 或用以下方式添加测试方法
# suite.addTest(unittest.makeSuite(suiteTest))
return suite
if __name__ == '__main__':
runner = unittest.TextTestRunner()
test_suite = suite()
runner.run(test_suite)
将上述代码保存至test_suite.py中,在命令行中执行下属命令,运行
python test_suite.py
结果如下图:
TestLoader类API
TestLoader类提供了从类或模块级别来创建test suites的能力。
下面我们看一下简单的代码示例:
# _*_ coding:utf-8 _*_
__author__ = '苦叶子'
import unittest
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
# 测试用例1
class demo1Test(unittest.TestCase):
def setUp(self):
self.a = 10
self.b = 20
def testadd(self):
# 验证加法
result = self.a + self.b
self.assertTrue(result == 100)
def testsub(self):
# 验证减法
result = self.a - self.b
self.assertTrue(result == -10)
# 测试用例2
class demo2Test(unittest.TestCase):
def setUp(self):
self.a = 1
self.b = 2
def testadd(self):
# 验证加法
result = self.a + self.b
self.assertTrue(result == 10)
def testsub(self):
# 验证减法
result = self.a - self.b
self.assertTrue(result == -1)
if __name__ == '__main__':
# 用例列表
testlist = [demo1Test, demo2Test]
testload = unittest.TestLoader()
# 构建test suite
test_Suite = []
for testcase in testlist:
testSuite = testload.loadTestsFromTestCase(testcase)
test_Suite.append(testSuite)
newSuite = unittest.TestSuite(test_Suite)
# 运行测试
runner = unittest.TextTestRunner()
runner.run(newSuite)
其他方式说明,这里就不一一示例说明了。
- loadTestsFromTestCase()
从指定的TestCase构建一个TestSuite对象,该对象包含了TestCase中所有的测试方法
- loadTestsFromModule()
从指定的模块中构建一个TestSuite对象,该对象包含了模块中所有的测试方法
注: 模块,一个个的.py文件,这些.py文件里有一个个继承至unittest.TestCase的类
- loadTestsFromName()
从特定的字符串构建一个TestSuite对象
- discover()
从指定目录,并递归其子目录,查找所有的测试模块,构建TestSuite。
TestResult类
在unittest中通过该类提供了测试结果信息。下面对TestResult的一些常用方法进行说明。
- Errors
返回所有的因异常抛出导致的错误信息
- Failures
返回所有的因断言失败的信息
- Skipped
返回所有因某些原因导致跳过的测试信息
- wasSuccessful()
如果所有测试都passed则返回True,否则返回False
- stop()
取消所有正在执行的测试
- startTestRun()/stopTestRun()
自己去尝试下_
- testsRun
返回截止至当前的执行数
- Buffer
如果设置为True, 控制stdout/stderr信息是否缓存
这里就不写示例,请直接参考标准文档
总结
本次就unittest中的TestCase、TestSuite、TestResult、TestLoader关键类进行了分享,并展示了关键使用实例。