1.概念
1.1 unittest (单元测试)
Python中有一个自带的单元测试框架是unittest
模块,用它来做单元测试,它里面封装好了一些校验返回的结果方法和一些用例执行前的初始化操作。**
1.2 ddt(数据驱动)
DDT
是 “Data-Driven Tests”的缩写,DDT
包含类的装饰器ddt
和两个方法装饰器data
(直接输入测试数据),file_data
(可以从json或者yaml中获取测试数据)
1.3 unittest常见的几个概念:
-
TestCase
也就是测试用例 -
TestSuite
多个测试用例集合在一起,就是TestSuite
-
TestLoader
是用来加载TestCase
到TestSuite
中的 -
TestRunner
是来执行测试用例的,测试的结果会保存到TestResult
实例中,包括运行了多少测试用例,成功了多少,失败了多少等信息
1.4 实例
import unittest,warnings
from ddt import ddt,data
from public.driven.ddtTool import ddtTool
from public.logTool import logTool
@ddt
class test_AD(unittest.TestCase):
dd = ddtTool()
datadict = dd.read_excel('AD')
@classmethod
def setUpClass(cls):
log = logTool()
log.info('{}[AD_START]{}'.format('>' * 30, '<' * 30))
# 取消警告
warnings.simplefilter("ignore", ResourceWarning)
@data(*datadict)
def test_AD(self, data):
'''获取数据类接口'''
dd = ddtTool()
dd.send_requests(data)
@classmethod
def tearDownClass(cls):
log = logTool()
log.info('{}[AD_END]{}'.format('>' * 30, '<' * 30))
if __name__ == '__main__':
unittest.main()
datadict
是一个字典,通过@data
将多个参数解析成单个参数传入函数send_requests(data)中setUpClass
,tearDownClass
是在执行用例之前初始化一遍,所有的用例执行完后再进行清理工作,并且在setUpClass
和tearDownClass
的上面添加@classmethod
装饰器,如果某个用例的元素定位或者其他出错,不影响整个用例的执行工作;但要注意的是不要忽略了用例直接的相互影响,所以用这种模式要考虑到用例之前的耦合,尽可能不要让前个用例的测试环境影响后一个用例的执行
1.5 执行测试用例示例
import unittest,os,time
from public.pathTool import htmlreport_path,cases_path,root_path
from BeautifulReport.BeautifulReport import BeautifulReport
from HTMLTestRunner.HTMLTestRunner import HTMLTestRunner
class reportTool:
def get_dir_cases(self,dir):
'''
根据指定目录获取匹配的测试用例
:param casedir: 测试用例目录
:return: 测试用例集
'''
path = os.path.join(cases_path,'{}/'.format(dir))
suit = unittest.defaultTestLoader.discover(path,pattern='*.py')
return suit
def get_all_cases(self):
'''获取根目录下所有测试用例'''
path = cases_path
suit = unittest.defaultTestLoader.discover(path,pattern='*.py',top_level_dir=None)
return suit
def reportTool(self,suit):
'''初始化报告样式'''
# 用时间作为测试报告文件名的一部分
current_time = time.strftime("%Y%m%d_%H_%M_%S")
BeautifulReport(suit).report(filename='{}'.format(current_time), description='终端接口测试报告',
log_path=htmlreport_path)
网友评论