单元测试框架: unittest pytest
uniittest:
unittest是python内置的单元测试框架,具有编写用例,组织用例,执行用例,输出测试报告等自动化框架的条件。
unittest中的5个重要概念:test Fixture,TestCase,TestSuite,TestLoder,TextTestRunner
Test Fixture:搭建测试环境的准备及清理工作,准备执行测试需要的数据,环境等;使用方法setUp(),tearDown(),setUpClass(),tearDownClass();什么时候使用呢?比如说在这个测试用例中需要访问数据库,那么可以在setUp() 中建立数据库连接以及进行一些初始化,在tearDown()中清除在数据库中产生的数据,然后关闭连接。注意tearDown的过程很重要,要为以后的 TestCase留下一个干净的环境。
TestCase:一个TestCase的实例就是一个测试用例。什么是测试用例呢?就是一个完整的测试流程,包括测试前准备环境的搭建(setUp),执行测试 代码 (run),以及测试后环境的还原(tearDown)。unittest中测试用例方法都是以test开头的,且执行顺序会按照方法名的ASCII值排序。
TestSuite:将多个测试用例集合到一起,可以是多个test case,也可以是testSuite,甚至可以test case和 test suite一起。
TestLoder:加载test case到test suite中
TextTestRunner:用来执行测试用例
TextTestResult:存储测试用例的执行结果
工作原理:
1.写好测试用例TestCase;注意测试类需要继承unittest.TestCase,一个函数一条测试用例,不能传参,只支持self参数,函数名必须用test 开头
2.将测试用例通过testLoder加载到TestSuit存储
3.通过TextTestRunner()来运行testSuit
4.通过TextTestResult()生成测试报告
5.整个过程集成在unittest.main()模块中
注:TestCase和TestSuit 可以是一个或多个
常见断言方法:
例:对MathMethod进行单元测试 MathMethod.py class MathMethod: def __init__(self,a,b): self.a=a self.b=b def add(self): return self.a+self.b def sub(self): return self.a-self.b def multi(self): return self.a*self.b testMathMethod.py import unittest import os,sys current_dir=os.path.dirname(os.path.abspath(__file__)) #print(current_dir) sys.path.append(current_dir) #print(sys.path) from MathMethod import MathMethod class testMathMethod(unittest.TestCase): def test_add_integer(self): res=MathMethod(3,5).add() self.assertEqual(8,res) def test_add_zero(self): res=MathMethod(0,0).add() self.assertEqual(0,res) 执行测试用例: runTest.py import unittest,os,sys dir_path=os.path.dirname(os.path.abspath(__file__)) sys.path.append(dir_path) from testMathMethod import testMathMethod import testMathMethod #方法一,使用testSuit添加测试用例执行 suit=unittest.TestSuite() #创建一个suit集 存储测试用例 suit.addTest(testMathMethod('test_add_integer')) #添加测试用例 suit.addTest(testMathMethod('test_add_zero')) run=unittest.TextTestRunner() #实例 TextTestRunner() run.run(suit) #执行测试 #方法二 ,使用testLoder加载测试用例到testSuit执行 loder=unittest.TestLoader() #创建一个加载器 #suit.addTest(loder.loadTestsFromTestCase(testMathMethod)) #通过测试用例名加载测试用例 suit.addTest(loder.loadTestsFromModule(testMathMethod)) #通过模块名加载 测试用例,导入时直接导入模块 run=unittest.TextTestRunner() run.run(suit) #生成测试报告 with open('test_result.txt','w+') as file: loder=unittest.TestLoader() #创建一个加载器 suit.addTest(loder.loadTestsFromModule(testMathMethod)) runner=unittest.TextTestRunner(file,verbosity=2,descriptions='测试报告') #verbosity 默认为1,0输出测试执行结果,1 输出测试失败的详细信息 2 输出详细测试执行结果 runner.run(suit)
#自动根据测试用例路径匹配查找测试用例文件(test*.py),并将查找到的测试用例添加到测试套件 suit2=unittest.defaultTestLoader.discover(filepath,pattern='test*.py')