DDT数据驱动+yaml/csv(自动化测试,接口测试)

目录

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数据驱动实例 :

1,ddt读取yaml文件 

#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

2,ddt读取csv文件

如果读取的不是yaml文件而是csv文件(csv文件用于结构简单得数据)
则会使用以下方式
①先设置一个读取文件的方法
DDT数据驱动+yaml/csv(自动化测试,接口测试)_第1张图片
DDT数据驱动+yaml/csv(自动化测试,接口测试)_第2张图片

②导入ddt包
③class类上加上修饰符@ddt,
④驱动的方法上添加@data修饰符, 参数为*+获取数据的方法(如果csv里面的不是list类型而是键值对类型则是**+获取数据的方法)和@unpack用于解包的修饰符,用于把csv逗号左边的数据分给参数1,逗号右边的参数分给参数2
请求头可看业务情况选择加或者不加

DDT数据驱动+yaml/csv(自动化测试,接口测试)_第3张图片

至此此方法内即可使用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()

3,ddt式测试报告怎么填用例描述

不进行任何操作时,测试报告的用例描述和详情都是空的,
这样测试报告的内容就少了些。
DDT数据驱动+yaml/csv(自动化测试,接口测试)_第4张图片

 我们可以通过添加''''''注释和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数据驱动+yaml/csv(自动化测试,接口测试)_第5张图片

DDT数据驱动篇结束,欢迎观看我主页上的其它篇章

你可能感兴趣的:(软件测试,自动化测试,python代码,python,自动化,测试用例)