unittest讲解
unittest核心要素
- TestCase
- TestSuite
- TextTestRunner
- defaultTestLoader
- Fixture
TestCase
说明:(翻译:测试用例)一个TestCase就是一条测试用例;
使用:
1. 导包:import unittest --> 导入unitest框架
2. 继承:unittest.TestCase --> 新建测试类继承unittest.TestCase
提示:
1). 测试用例:在自动化测试中,一条用例就是一个完整的测试流程;
2). 测试方法名称命名必须以test开头;
(原因:unittest.TestCase类批量运行的方法是搜索执行test开头的方法)
TestSuite
说明:(翻译:测试套件)多条测试用例集合在一起,就是一个TestSuite
返回的suite套件原理:suite = unittest.TestSuite(map(UserCase,['testAddUser','testDelUser']))
使用:
1. 实例化: suite=unittest.TestSuite()
(suite:为TestSuite实例化的名称)
2. 添加用例:suite.addTest(ClassName('MethodName')) # 参数可以是tcase.TestCase实例 或者 TestSuite实例
(ClassName:为类名;MethodName:为方法名)
suite.addTests([ClassName('MethodName1'),ClassName('MethodName1')])
3. 添加扩展:suite.addTest(unittest.makeSuite(ClassName)) # 其本质还是TestLoader
(搜索指定ClassName内test开头的方法并添加到测试套件中)
TextTestRunner
说明:(翻译:测试执行)是用来执行测试用例套件(执行上面的测试套件)
使用:
1. 实例化: runner=unittest.TextTestRunner()
(runner:TextTestRunner实例化名称)
2. 执行: runner.run(suite) 返回unittest.TestResult 对象,可以查看成功次数,失败次数等
(suite:为测试套件名称)```
unittest.TextTestRunner(stream=open("./tex.text",'w'),descriptions=True, verbosity=1)
stream : 写入的文件对象
descriptions : 描述信息
verbosity: 写入文件的详细程度(0,1,2)
HTMLTestRunner(生成测试报告)
生成html测试报告
from HTMLTestRunner import HTMLTestRunner
with open(r'test_report.html', 'b') as f: # => 必须以w的方式打开
runner = HTMLTestRunner(
stream=f, # => 可写的文件对象
title='add函数测试报告', # => 测试报告标题
description='win 10, python 3.8', # => 对本次测试的描述
)
runner.run(tests) # => tests是通过discover查找并构建的测试套件
运行报告如下:
Beautiful Report
生成测试报告
from BeautifulReport import BeautifulReport
runner = BeautifulReport(tests) # => tests是通过discover查找并构建的测试套件
runner.report(
description='add函数测试报告', # => 报告描述
filename='bf.html', # => 生成的报告文件名
log_path='.' # => 报告路径
)
实例验证
## test_bb.py
import unittest
class TestCase(unittest.TestCase):
def test_01(self):
print(f'运行用例{self.id()}')
def test_02(self):
print(f'运行用例{self.id()}')
def test_03(self):
print(f'运行用例{self.id()}')
if __name__ == '__main__':
print(dir(TestCase))
## test_login.py
import unittest
class TestLogin(unittest.TestCase):
def test_login1(self):
print(f'运行用例{self.id()}')
pass
def test_login2(self):
print(f'运行用例{self.id()}')
pass
def test_login3(self):
print(f'运行用例{self.id()}')
pass
def test_login4(self):
print(f'运行用例{self.id()}')
pass
## mian.py
from test_bb import TestCase
from test_login import TestLogin
suite = unittest.TestSuite()
suite.addTest(TestCase('test_01'))
suite.addTests([TestCase('test_02'),TestCase('test_03')])
suite.addTest(unittest.makeSuite(TestLogin))
runner = unittest.TextTestRunner()
runner.run(suite)
defaultTestLoader
说明: 本质就是利用TestLoader类的相关方法找到testcase或者suite,并将查找到的测试用例组装到测试套件
- discover方法
用法:
test_dir = './'
disconver = unittest.defaultTestLoader.discover(test_dir, pattern='iweb_*.py')
(test_dir为要指定的目录 ./为当前目录;pattern:为查找的.py文件的格式 )
运行:
runner=unittest.()
runner.run(disconver)
- loadTestsFromTestCase(testCaseClass)
用法:
testCaseClass必须是TestCase的子类(或孙类也行)
运行:
suite = unittest.defaultTestLoader.loadTestsFromTestCase(testCaseClass)
runner=unittest.TextTestRunner()
runner.run(suite)
- loadTestsFromModule(module, pattern=None)
用法:
name是一个string,string需要是是这种格式的“module.class.method”
运行:
suite = unittest.defaultTestLoader.loadTestsFromModule(module, pattern=None)
runner=unittest.TextTestRunner()
runner.run(suite)
- loadTestsFromNames(name, module=None)
用法:
names是一个list,用法与上同
运行:
suite = unittest.defaultTestLoader.loadTestsFromNames(module, pattern=None)
runner=unittest.TextTestRunner()
runner.run(suite)
- loadTestsFromModule(self, module, *args, pattern=None, **kws)
用法:
module是一个module对象不是字符串
运行:
suite = unittest.defaultTestLoader.loadTestsFromNames(module, pattern=None)
runner=unittest.TextTestRunner()
runner.run(suite)