目录
1, ddt读取yaml文件
2,ddt读取csv文件
3,ddt式测试报告怎么填用例描述
背景:
对于输入框来言,使用等价类边界值,场景法等进行数据输入,接口相同,输入的内容都非常相似,却有不同的响应结果。如果我们对于每次输入都编写一条接口进行请求,无疑会增大我们的代码量,也不方便维护我们的代码。所以ddt数据驱动就孕育而生了
目的:
更好的管理我们的自动化用例,结构也更清晰些。
login.yaml文件的具体内容
我使用yaml来存储测试用例,其中地址、入参、断言的响应码响应内容都放入了yaml文件中,
其中yaml语法为:
冒号+空格 代表key-value键值对数据,
冒号+换号 代表是一个对象,
杠(-)加数据代表列表,
杠杠(--)加数据代表列表里面的列表
test_user1:
url: http://127.0.0.1:1080/WebTours/
method: post
userSession: 134710.046739571zQcQVtipAcQVzzzHtVfHtpiiiVHf
username: admin1
password: admin1
JSFormSubmit: off
header_state: 200
body_contains: 'Web Tours'
test_user2:
url: http://127.0.0.1:1080/WebTours/
method: post
userSession: 134716.730822195zQcQtQVpitVzzzzHtVfHzpQfVAf
username: admin2
password: admin2
JSFormSubmit: off
header_state: 200
body_contains: 'Web Tours'
test_user3:
url: http://127.0.0.1:1080/WebTours/
method: post
userSession: 134716.739165654zQcQtQcpcHAiDDDDtVfHzpQfDzcf
username: admin3
password: admin3
JSFormSubmit: off
header_state: 200
body_contains: 'Web Tours'
使用步骤:
①导入ddt包
②class类上加上修饰符@ddt,驱动的方法上添加@file_data修饰符。
请求头可看业务情况选择加或者不加
断言方式:
断言方法有python自带的asser 和unittest框架的self.assertXX,这里我使用的是unittst的
一般断言响应码和响应内容,json格式的响应可以层级获取内容进行断言,text格式的响应使用子串in判断就可以了
DDT数据驱动实例 :
#coding:utf-8
import unittest
from ddt import *
import requests
from RequestUnittestDDT.util import operat_config, send_request
@ddt
class Login(unittest.TestCase):
session = requests.session()
# path = operat_config.read_yaml_all(r'api/WebTours/login.yaml')
@file_data(r'D:\software\interface\python_project\RequestUnittestDDT\api\WebTours\login.yaml')
def test_01_login(self,url,method,userSession,username,password,JSFormSubmit,header_state,body_contains):
data={
'username' : username,
'password' : password,
'userSession' : userSession,
'JSFormSubmit' : JSFormSubmit
}
'''
请求头不是每个接口都需要加,等有需要的时候再加(格式为json格式,入参类型为headers),每一个接口都添加一大串请求头,没有必要,也不利于维护
有格式校验的加content-type如:Content-Type: application/x-www-form-urlencoded
有接口请求跳转的加:referer如: Referer: http://127.0.0.1:1080/cgi-bin/nav.pl?in=home
有浏览器校验的加userAgent如: User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36
有权限校验的加cookie如:Cookie: MSO=SID&1663494471
'''
#session_send是自己封装的请求方法,实质是request.post方法
response = send_request.session_send(session=self.session,url=url,method=method,data=data)
self.assertEqual(response.status_code,header_state ,"响应码错误")
self.assertIn(body_contains,response.text,"响应内容错误")
# assert response.status_code == self.user1['header_state'] ,"响应码错误"
# assert self.user1['body_contains'] in response.text ,"响应内容错误"
if __name__ == '__main__':
unittest.main()
补充:
请求头不是每个接口都需要加,等有需要的时候再加(格式为json格式,入参类型为headers),每一个接口都添加一大串请求头,没有必要,也不利于维护
有格式校验的加content-type如:Content-Type: application/x-www-form-urlencoded
有接口请求跳转的加:referer如: Referer: http://127.0.0.1:1080/cgi-bin/nav.pl?in=home
有浏览器校验的加userAgent如: User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36
有权限校验的加cookie如:Cookie: MSO=SID&1663494471
如果读取的不是yaml文件而是csv文件(csv文件用于结构简单得数据)
则会使用以下方式
①先设置一个读取文件的方法
②导入ddt包
③class类上加上修饰符@ddt,
④驱动的方法上添加@data修饰符, 参数为*+获取数据的方法(如果csv里面的不是list类型而是键值对类型则是**+获取数据的方法)和@unpack用于解包的修饰符,用于把csv逗号左边的数据分给参数1,逗号右边的参数分给参数2
请求头可看业务情况选择加或者不加
至此此方法内即可使用csv上的数据了,csv里面的一行数据参与一条测试用例(注:但是第一行不会被读取到,所以第一行可当成注释),有多少行就会有多少个测试用例,可及大程度的精简了我们的代码,方便管理,也可使测试更加全面,覆盖率得到提高。
以下为具体的代码:
#coding:utf-8
import csv
import unittest
from ddt import *
import requests
from RequestUnittestDDT.util import operat_config, send_request
def getCsvData():
# 读取CSV文件
value_rows = []
with open('../../config/user.csv', encoding='UTF-8') as f:
f_csv = csv.reader(f)
next(f_csv)
for r in f_csv:
value_rows.append(r)
return value_rows
@ddt
class Login(unittest.TestCase):
session = requests.session()
@data(*getCsvData())
@unpack
def test_01_login(self,username,password):
data = {
'username':username,
'password':password
}
print(username)
response = send_request.session_send(session=self.session,url='127.0.0.1:8080/WebTours/login',method='post',data=data)
self.assertEqual(response.status_code,200,"响应码错误")
self.assertIn('登录成功',response.text,"响应内容错误")
if __name__ == '__main__':
unittest.main()
不进行任何操作时,测试报告的用例描述和详情都是空的,
这样测试报告的内容就少了些。
我们可以通过添加''''''注释和print()内容进行添加用例描述和详情,如下:
class Login(unittest.TestCase):
session = requests.session()
@data(*getCsvData())
@unpack
def test_01_login(self,username,password):
'''测试用例:{0}'''
print('测试数据:%s'%username)
print('测试数据:%s'%password)
#略,业务操作
self.assertTrue(True,msg='非True')#断言业务
csv里面的测试数据,入参 杨紫,1269532 彦祖,1947563 丽颖,1846372 江云,1273650
其中:
''''’里面的内容即为用例描述的内容,print()打印的内容即为用例详情的内容。
''''’里面如果有{0}{1},则也会被csv的数据填充,{0}代表csv的第一个数据,{1}代表csv的第二个数据
DDT数据驱动篇结束,欢迎观看我主页上的其它篇章