一、unittest工作原理
unittest最核心的四部分是:TestCase,TestSuite,TestRunner,TestFixture
TestCase:用户自定义的测试case的基类,调用run()方法,会依次调用setUp方法、执行用例的方法、tearDown方法。
TestSuite:测试用例集合,可以通过addTest()方法手动增加Test Case,也可以通过TestLoader自动添加Test Case,TestLoader在添加用例时,会没有顺序。
TestRunner:运行测试用例的驱动类,可以执行TestCase,也可以执行TestSuite,执行后TestCase和TestSuite会自动管理TESTResult。
TestFixture:简单来说就是做一些测试过程中需要准备的东西,比如创建临时的数据库,文件和目录等,其中setUp()和setDown()是最常用的方法
整个的流程就是首先要写好TestCase,然后由TestLoader加载TestCase到TestSuite,然后由TestTestRunner来运行TestSuite,运行的结果保存在TextTestReusult中,整个过程集成在unittest.main模块中。
二、例子如下:
创建一个函数集MathMethod.py
class MathMethod:
def add(a, b):
return a + b
def minus(a, b):
return a - b
def multi(a, b):
return a * b
def divide(a, b):
return a / b
为上序方法写一个测试类TestMathMethod.py
import unittest
#导入待测试的类
from 单元测试.MathMethod import MathMethod
class TestMathMethod(unittest.TestCase):
def test_add_one(self):
res=MathMethod.add(1,2)
print("1+2的结果值是:",res)
def test_add_two(self):
res=MathMethod.add(0,0)
print("0+0的结果值是:",res)
def test_add_three(self):
res=MathMethod.add(-1,-2)
print("-1+-2的结果值是:",res)
class TestMath_Multi(unittest.TestCase):
def test_multi_one(self):
res=MathMethod.multi(1,2)
print("1*2的结果值是:",res)
self.assertEqual(2,res)
def test_multi_two(self):
res=MathMethod.multi(0,0)
print("0*0的结果值是:",res)
try:
self.assertEqual(2, res)
except Exception as e:
print("{}出错了".format(e))
raise e #异常处理完之后 要抛出去
def test_multi_three(self):
res=MathMethod.multi(-1,-2)
print("-1*-2的结果值是:",res)
if __name__ == '__main__':
unittest.main()
收集执行用例
在这里插入代码片
import unittest
from HTMLTestReportCN import HTMLTestRunner
from 单元测试.testMathMethod import TestMathMethod#具体到类名
suite=unittest.TestSuite()#存储用例容器
#方法一:只执行一条用例
#suite.addTest(TestMathMethod('test_add_one'))
#方法二:testloader
loader=unittest.TestLoader()#创建一个加载器
#suite.addTest(loader.loadTestsFromTestCase(TestMathMethod))#某一个类名
#方法三
from 单元测试 import testMathMethod #具体到模块名
suite.addTest(loader.loadTestsFromModule(testMathMethod))
#执行 上下文管理器
# with open ("test.txt",'w+',encoding='utf-8') as fp:
# runner=unittest.TextTestRunner(stream=fp,verbosity=0)
# runner.run(suite)
# print(fp.close())
#生成HTML格式的测试报告
with open('report.html','w',encoding='utf-8') as fp:
runner=HTMLTestRunner(stream=fp, verbosity=2,title='单元测试报告',description='第一次测试报告',tester='刘**')
runner.run(suite)