一、unittest概念
核心: TestCase, TestSuite, TestLoder,TextTestRunner,TextTestResult, TestFixture
TestCase(测试用例): 所有测试用例的基类,它是软件测试中最基本的组成单元。
一个test case 就是一个测试用例,是一个完整的测试流程,包括测试前环境的搭建setUp,执行测试代码(run),以及测试后环境的还原(tearDown)。测试用例是一个完整的测试单元,可以对某一问题进行验证
TestFixture(测试脚手): 测试代码的运行环境,指测试准备前和执行后要做的工作,包括setUp和tearDown方法。
TestSuite(测试套件): 将多个测试用例test case集合就是TestSuite,TestSuite也可以嵌套TestSuite。
TestLoder:是用来加载 TestCase到TestSuite中,其中几个loadTestsFrom_()方法,就是从几个地方寻找TestCase,创建他们的实例,然后add到TestSuite中,再返回一个TestSuite实例。
TextTestRunner: 是来执行测试用例的,其中的run(test)会执行TestSuite/TestCase中的run(result)方法。
TextTestResult: 测试结果会保存到TextTestResult实例中,包括运行了多少用例,成功与失败多少等信息。
二、测试流程
- 编写TestCase:一个class继承unittest.TestCase,就是一个测试用例,对每一个以test开头的方法,系统都为其构建了一个TestCase对象,系统也只执行TestCast对象的方法。如果一个class中有四个test开头的方法,最后load到suite中时则有四个测试用例。
- 由TestLoder加载TestCase到TestSuite
- 然后由TextTestRunner来运行TestSuite,运行的结果保存在TextTestResult中
三、unittest框架执行方式
import unittest
class TestCase1(unittest.TestCase):
def testCase1(self):
print("test1_1_step_start")
def testCase2(self):
print("test1_2_step_start")
class TestCase2(unittest.TestCase):
def testCase1(self):
print("test2_1_step_start")
def testCase2(self):
print("test2_2_step_start")
(1)unittest.main()方法
使用它可以方便的将一个单元测试模块变为可直接运行的测试脚本,main()方法使用TestLoader类来搜索所有包含在该模块中以“test”命名开头的测试方法,并自动执行他们。
执行方法的默认顺序是:根据ASCII码的顺序加载测试用例,数字与字母的顺序为:0-9,A-Z,a-z。所以以A开头的测试用例方法会优先执行,以a开头会后执行。
if __name__ == "__main__":
unittest.main()
test1_1_step_start
test1_2_step_start
test2_1_step_start
test2_2_step_start
Ran 4 tests in 4.003s
(2)通过testsuite来执行测试用例的方式
使用先实例化测试套件,将用例加载进去,再用TextTestRunner去执行用例
可自己指定添加哪条用例进行执行,执行的顺序是用例的加载顺序,比如这里是先执行2后执行1。
if __name__ == "__main__":
suite = unittest.TestSuite()
suite.addTest(TestCase1('testCase2'))
suite.addTest(TestCase1('testCase1'))
# 运行测试用例
runner = unittest.TextTestRunner()
runner.run(suite)
test1_2_step_start
test1_1_step_start
Ran 2 tests in 0.000s
OK
(3)通过TestLoader 类中提供的discover来执行测试用例的方式
如果我们有很成千上百条用例时,一个一个add进去,是不太现实的,那么我们可以用defaultTestLoader来加载。
该结构简化了一些步骤,即不用先创建测试套件,然后通过添加测试用例的方式,将测试用例逐条加载,TestLoader下的discover方法可以递归查询其指定路径下的子目录下符合条件的测试用例加载。
- 执行测试用例
- 实例化TextTestRunner类
- 使用run()方法运行测试套件(即运行测试套件中的所有用例)
if __name__ == "__main__":
test_dir = './'
discover = unittest.defaultTestLoader.discover(test_dir, pattern='Test*.py')
runner = unittest.TextTestRunner()
runner.run(discover)
或者新建一个run .py
import unittest
# 测试用例存放路径
case_path = './Testcase'
# 获取所有测试用例
def get_allcase():
discover = unittest.defaultTestLoader.discover(case_path, pattern="Test*.py")
suite = unittest.TestSuite()
suite.addTest(discover)
return suite
if __name__ == '__main__':
# 运行测试用例
runner = unittest.TextTestRunner()
runner.run(get_allcase())
test1_1_step_start
test1_2_step_start
test2_1_step_start
test2_2_step_start
Ran 4 tests in 4.000s
OK