自动化测试第十一节---unittest
1、框架的定义:框架就是别人已经封装好的一些代码,它已经有了一些功能,咱们直接用就行了。
2、pycharm自带的测试框架:unittest
3、自动化测试的过程:执行用例、校验结果、产生测试报告
4、测试报告的产生:HTMLTESTrunner这个模块产生的报告,是给咱们自己看的可视化报告,xmlrunner这个模块,产生的报告是给Jenkins的
一、unittest单元测试
测试用例封装在类中,类里的每个函数是一个测试用例,类是一个测试组,执行测试用例的顺序是按照测试用例的名称首字母排序的,非从上到下执行
先安装模块:
pip install nose-parameterized#unittest参数化
pip install xmlrunner#产生xml格式测试报告
再将HTMLTestRunner.py文件加入python的环境变量中:产生html格式的可视化测试报告
1、编写测试用例
import unittest
import HTMLTestRunner,xmlrunner
class My(unittest.TestCase):#定义类,object为unittest.TestCase
def test1(self):#写用例1,用例的名字必须以test开头,如果用例不是以test开头,那么不会运行它
'''用例描述'''#描述的内容会展示在测试报告中,描述测试用例的内容
self.assertEqual(1,2)#校验结果,这个方法是校验左右两个传参是否一致
def test2(self):#写用例2
... ...
2、运行所有的测试用例:
unittest.main()#
3、将指定用例添加到集合,一起运行:
首先定义一个空的测试集合:
suite = unittest.TestSuite()
其次添加用例:
1)添加My中的某个测试用例:suite.addTest(My('test1'))
2)将My中的所有测试用例都添加进来:suite.addTest(unittest.makeSuite(My))用例放在多个文件中时:
3) 找到case目录下所有的test_*.py文件,循环添加case到测试集合里面
all_case = unittest.defaultTestLoader.discover(r'E:\day11\AUTO\case','test_*.py')
for case in all_case:
suite.addTests(case)
4、生成一个html文件的测试报告:
with open('test_new.html','wb') as fw:#新建一个测试报告的文件
runner = HTMLTestRunner.HTMLTestRunner(stream=fw,title='这是测试报告的标题',description='这是测试报告的描述')#新建一个测试报告的模板
runner.run(suite)#执行测试集合并保存到测试报告中
5、生成一个xml格式的测试报告:
runner = xmlrunner.XMLTestRunner(output='report')#输入到report文件夹中
runner.run(suite)#执行成功后,生成格式如TEST-My-20171230132616.xml的xml文件(My为测试组的类名,suite中有多个类时会生成多个xml文件,后缀产生报告的时间)
生成的html测试报告如下:
![](https://images2017.cnblogs.com/blog/1235825/201712/1235825-20171230131833320-625286549.png)
二、unittest参数化
1、用户定义变量参数化
import unittest,HTMLTestRunner
from nose_parameterized import parameterized#导入参数化的模块
def login(username,passwd):#定义一个待测试的模块,如登录
if username=='niuhanyang' and passwd=='123456':
return '138'
return False
class Login(unittest.TestCase):#定义一个测试登录的用例组
@parameterized.expand(#设置n个参数组,每一个列表是一个参数组,代表用例中的传参,执行用例时循环所有参数组,即用例执行n次
[
['niuhanyang','123456','138'],
['niuhanyang','',False],
['','',False],
['ssj','12345',False]
]
)
def test_login(self,username,passwd,hope):#定义一个测试用例,测试登录
'''测试登录模块'''
res = login(username,passwd)#调用登录模块
self.assertEqual(res,hope)#比对测试结果
if __name__ == '__main__':#执行测试
suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(Login))
fw = open('login.html','wb')
runner = HTMLTestRunner.HTMLTestRunner(stream=fw,title='登录测试结果')
runner.run(suite)
2、文件参数化
1)定义一个user.txt文件存放要参数化的内容,如:
nyy,123456,True
wxc,123456,True
2)定义一个函数,将txt中的内容处理为parameterized可处理的列表格式
def readCvs(file, sep=','):
lis = []
with open(file, 'rb') as f:
for line in f:
sub_list = line.decode().strip().split(sep)
lis.append(sub_list)
return lis
3)定义用例时使用参数化的方式,@parameterized.expand中的传参其实还是二维列表,只是之前多了一道从文件读取的结果
class My(unittest.TestCase):
@parameterized.expand(readCvs('users.txt'))
def testa(self,a,b,hope):
三、接口测试
import unittest
class MyTest(unittest.TestCase):
@classmethod
def setUpClass(cls):
print('什么时候运行我呢,我是setUpClass')
#这个类下面所有用例运行之前先运行setUpClass
@classmethod
def tearDownClass(cls):
print('什么时候运行我呢,我是tearDownClass')
#这个类下面所有用例运行完之后运行tearDownClass
def setUp(self):
print('每个用例运行之前都会先运行我,不管用例运行成功或者失败')
def tearDown(self):
print('每个用例运行之后都会再运行我,不管用例运行成功或者失败')
def test_nyy1(self):
self.assertEqual(1,1)
print('第一条用例')
def test_nyy2(self):
print('第二条用例')
self.assertEqual(1,2)
if __name__=='__main__':
unittest.main()
四、获取前一条用例的结果
直接在类中定义一个函数,返回前一条用例的结果,再在用例中内部调用这个函数取得结果即可