自动化测试-6.unittest实战

上篇文章讲了unittest的四大组件,以及组件的日常使用,这篇主要是在四大组件上的扩充,丰富自动化的方法

1.ddt的使用:data-driver-tests

在实际的测试中,有些地方无论是接口还是ui知识参数数据的输入不一样,操作是一样的,比如登录,只是切换了账号,但是登录这个操作是一样的,如果重复编写,无疑是大大增加了工作量,对此,我们可以通过使用ddt来解决这个问题。

ddt属于第三方扩展库,使用之前需要下载: pip install ddt

使用前需要先导入模块:from ddt import 需要的方法

ddt:在类名上面加ddt的装饰器@ddt,表示要使用ddt,然后在用例上面加装饰器@data(),括号里面写需要的参数,写几个就循环几次

上面讲了ddt里面的data()装饰器,这里再讲一下unpack装饰器,unpack:方法装饰器,可以接报,如果需要添加多个参数,这样data(),就没办法实现了,这时候就需要unpack这个装饰器了

用法:首先data()里面的参数,需要同时传的参数用()括起来,比如(("小","天"),("人",'1')),
import unittest
from ddt import ddt,data,unpack
@ddt
class unittes(unittest.TestCase):
#前置条件,每次执行都会先运行这个
def setUp(self) -> None:
pass
@unpack
@data(("sheng123","123456","1111"),("赵","王","李"))
def test_1(self, test1,test2,test3): # 上面一个参数里面有多个参数,这里需要根据参数添加对应的参数
print(test1)
print(test2)
print(test3)
def tearDown(self) -> None:
pass
if __name__=="__main__":
unittes.main()

data:用于设定参数

unpack:用于解析参数

也可以用于读取文件中的内容,来实现批量运算,如下图

1.先定义一个函数,函数里面去读取我们需要的文件,把文件里的数据保存到列表里面,再返回这个列表

2.data(*列表名),去获取这个列表中的数据,*意思数据不是固定的,有可能很大

 #注:文件里面是5个名字
import unittest
from ddt import ddt,data,unpack
def func():
a=[]
cc=open(r"F:\要读取的文件.txt","r",encoding="utf-8")
for i in cc:
      #这里必须要加上.split("|"),不加上的话解析包解析出来就是 贾巴尔 杜兰特 约翰逊 乔丹 张伯伦,data无法识别,运行后会报add_test() argument after ** must be a mapping, not str的错误
#当加上分隔符后,解析出来就是['贾巴尔'] ['杜兰特'] ['约翰逊'] ['乔丹'] ['张伯伦']这样就能正常使用了
a.append(i.strip("\n").split("|"))
cc.close()
return a

@ddt
class unittes(unittest.TestCase):
#前置条件,每次执行都会先运行这个
def setUp(self) -> None:
pass

@data(*func())
@unpack
def test_1(self,name):
print(name)

def tearDown(self) -> None:
pass
if __name__=="__main__":
unittes.main()
 

file_data:装饰测试方法,参数是文件名。文件可以是 json 或者 yaml 类型,这里用json文件举例

import unittest
from ddt import ddt, data, unpack, file_data
@ddt
class unittes(unittest.TestCase):
#前置条件,每次执行都会先运行这个
def setUp(self) -> None:
pass

@file_data("F:\json.json")
def test_1(self,name):
print(name)

def tearDown(self) -> None:
pass
if __name__=="__main__":
unittes.main()
根据下图得知,json文件指挥读取value的数据,当value的数据有两个的时候,如"name1":{"username":"科比","password":123456}这种写法,用例只需要传入两个参数即可

 

 如果使用yaml文件要先导入yaml:import yaml  这里我就不演示了,因为暂时没有对应的文件,和json一样的操作

2. unintest.skip():在case中对于不需要运行的用例或者特定条件下不执行的用例,可以用skip()的方法来实现有条件执行,或者绝对性跳过。用于对指定用例进行不执行操作
skip通过装饰器使用,有四种,如下图

@unittest.skip(reason):强制跳转。reason是跳转原因

@unittest.skipIf(condition, reason):condition为True的时候跳转

@unittest.skipUnless(condition, reason):condition为False的时候跳转

@unittest.expectedFailure:如果test失败了,这个test不计入失败的case数目

import unittest
from ddt import ddt, data, unpack, file_data

class unittes(unittest.TestCase):
def setUp(self) -> None:
pass
#无条件的跳过这条用例,括号里面可以写说明
@unittest.skip("不会执行这条")
def test_1(self):
print(1)
#如果条件为真,则跳过这条用例,括号里面两个字段,第一个字段是条件,第二个是说明
@unittest.skipIf(1<3,'这个条件为真,不会执行')
def test_2(self):
print(2)
#跳过测试,除非条件为真才执行,第一个字段是条件,第二个是说明
@unittest.skipUnless(1<3,"这个条件为真,要执行")
def test_3(self):
print(3)
#如果test失败了,这个test不计入失败的case数目
@unittest.expectedFailure
def test_111(self):
print(1)

def tearDown(self) -> None:
pass
if __name__=="__main__":
unittes.main()
 
3.测试报告HTMLtestrunner的使用
1.导入环境
下载HTMLtestRunner包,导入到python中的lib\site-packages文件中或者到python中的lib
打开显示是一段话,这里需要注意右击另存为pycharm的Lib\site-packages目录下(不然是没有用滴)
HtmlTestRunner网上下载的模块仅支持python2,若使用python3及以上的版本时需要做以下修改
总结:
第94行,将import StringIO修改成import io;
第539行,将self.outputBuffer = StringIO.StringIO()修改成self.outputBuffer = io.StringIO();
第642行,将if not rmap.has_key(cls):修改成if not cls in rmap:
第766行,将uo = o.decode(‘latin-1‘)修改成uo = e;
第772行,将ue = e.decode(‘latin-1‘)修改成ue = e;
第631行,将print >> sys.stderr, ‘\nTime Elapsed: %s‘ % (self.stopTime-self.startTime)修改成print(sys.stderr, ‘\nTime Elapsed: %s‘ % (self.stopTime-self.startTime))
2.导入包  from HTMLTestRunner import HTMLTestRunnrt
3.使用方法
使用后会生成一个report.html格式的文件,在使用前,进行路径设置,先导入os的方法
#把uni页面导入进来
import uni
from uni import unittes

#导入htmltestrunner包
from HTMLTestRunner import HTMLTestRunner

report_name="测试报告名称"
report_title="测试报告标题"
report_desc="测试报告描述"
#首先生成一个报告的文件路径
report_path="./report/"
#把生成的html文件保存在这个路径下面
report_file=report_path+"report.html"
#导入os方法,去判断这个路径里面存在,存在就说明这个文件存在,如果不存在,我们就生成一个这个文件存在就跳过
if not os.path.exists(report_path):
os.mkdir(report_path)
else:
pass

#‘wb’:表示以二进制写方式打开,只能写文件, 如果文件不存在,创建该文件;如果文件已存在,则覆盖写。
with open(report_file,"wb") as report:
suite = unittest.TestSuite()
suite.addTests(unittest.TestLoader().loadTestsFromName("uni.unittes"))
#套件通过testtestrunner对象进行运行
runner=HTMLTestRunner(stream=report,title=report_title,description=report_desc)
runner.run(suite)
执行后,在对应的目录下就会生成文件
 

 

 打开如下

 

 

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 
 

posted @ 2022-06-28 18:07  另眼看尘世  阅读(345)  评论(0)    收藏  举报