接口自动化测试(三)

1|0一. 定义公共的请求方法


如下图所示,同一个模块,只是请求数据和返回数据不同,http请求的发送过程是完全相同的

对于不同模块,只是请求的url、请求方法、请求数据和返回数据不同,http请求的过程也是完全相同的

这样就可以将发送请求的方法写成一个类或函数,供不同的测试用例调用

具体的实现是

import requests class MyRequests: def send_request(self, method, url, **kwargs): res = requests.request(method, url, **kwargs).text return res

2|0二. 利用excel存储测试数据,实现测试数据和测试脚本的分离


利用excel存储测试数据的好处是,可以实现测试数据和测试脚本的分离,以后一旦数据有变动(添加删除、修改测试数据),不需要修改代码,只在excel中修改就好了

那么,测试数据和脚本是怎么联系在一起的?

可以定义一个读取excel的类,这个类读取到的数据返回给测试用例,测试用例再调用每一条测试数据去发送请求,进行比对。但有一个问题,按照以往的做法,一个test_send_request函数里利用for循环遍历每条测试数据,得到的结果始终是一个测试用例,我们希望每一条测试数据都是一个测试用例,就需要用到ddt

3|0三. ddt


3|11. 什么是ddt


ddt(data driven tests):数据驱动测试,由外部数据集合来驱动测试用例

核心的思想:数据和测试代码分离

 

3|22. 应用场景


一组数据来执行相同的操作

当测试数据发生大量变化的情况下测试代码(或者说测试用例)可以保持不变

 

3|33. ddt的安装


pip install ddt

 

3|44. ddt的用法


使用之前先导入ddt:

import ddt

 

ddt结合单元测试来使用

1). 在测试类定义之前使用:@ddt

2). 在测试用例定义之前使用:@ddt.data(测试数据),测试数据之间用逗号隔开

3). 在2的基础上定义测试用例时,参数接收2中的测试数据

 

例:

@ddt.ddt

class DemoTest(unittest.TestCase):

  @ddt.data(2,3,4)

  def test_print(self, a):

    print("简单调用@data查看输出的值是什么?", a)

 

一组数据之间用逗号隔开

data的参数可以为如下几种:

1) 一组数据中,每个数据为单个值

2) 一组数据中,每个数据为一个列表或者一个字典

3) 文件对象:json、yaml

 

一组数据中的数据为列表或者字典:

@data([a,b],[c,d])

 

如何从以上数据中获取到列表中每一项值?

@unpack

 

若变量A=[{a:b, a1:b1},{c:d, c1:d1}]

如何将变量A中的每一组元素作为测试数据?

@data(*A)

 

数据为文件对象:json、yaml

{"name":"nick","gender":"male","age","29"}

 

@ddt.file_data(json文件路径)

 

思考:如何结合excel来使用ddt?

 

3|54. 实例


实例1

import ddt import unittest @ddt.ddt class test_ddt(unittest.TestCase): @ddt.data(1,2,3,4,5,6,7) def test_print(self, a): print(a) 运行结果: Launching unittests with arguments python -m unittest class_ddt.test_ddt in D:\python_workshop\python6\revise\futureloan_API_framework 1 2 3 4 5 6 7 Ran 7 tests in 0.006s OK

实例2

import ddt import unittest @ddt.ddt class test_ddt(unittest.TestCase): @ddt.data([1,2],[10,11]) def test_print(self, a): print(a) 运行结果: Launching unittests with arguments python -m unittest D:/python_workshop/python6/revise/futureloan_API_framework/class_ddt.py in D:\python_workshop\python6\revise\futureloan_API_framework Ran 2 tests in 0.001s OK [1, 2] [10, 11]

实例3

import ddt import unittest @ddt.ddt class test_ddt(unittest.TestCase): @ddt.data([1,2],[10,11]) @ddt.unpack def test_add_print(self,a,b): print(a+b) 运行结果: Launching unittests with arguments python -m unittest class_ddt.test_ddt in D:\python_workshop\python6\revise\futureloan_API_framework 3 21 Ran 2 tests in 0.002s OK

实例4

import ddt import unittest data = [1,2,3,4,5,6,7,8,9,10] @ddt.ddt class test_ddt(unittest.TestCase): #从一个变量当中取值,变量是字典或者列表:表达式:*变量名 @ddt.data(*data) def test_print(self, a): print(a) 运行结果: Launching unittests with arguments python -m unittest D:/python_workshop/python6/revise/futureloan_API_framework/class_ddt.py in D:\python_workshop\python6\revise\futureloan_API_framework 1 2 3 4 5 6 7 8 9 10 Ran 10 tests in 0.005s OK

实例5

创建一个json文件my.json,内容为

{"name":"nick","gender":"male","age":"29"}

测试用例类为

import ddt import unittest @ddt.ddt class test_ddt(unittest.TestCase): @ddt.file_data(r"D:\python_workshop\python6\revise\futureloan_API_framework\my.json") def test_readData_fromJsonFile(self, a): """In case of a dict, keys will be used as suffixes to the name of the test case, and values will be fed as test data. 如果文件的内容是一个字典,键名将作为测试用例的后缀,值将作为测试数据""" print("从文件读取数据") print(a) 运行结果: Launching unittests with arguments python -m unittest D:/python_workshop/python6/revise/futureloan_API_framework/class_ddt.py in D:\python_workshop\python6\revise\futureloan_API_framework 从文件读取数据 29 从文件读取数据 nick 从文件读取数据 male Ran 3 tests in 0.002s OK

 

 

 

4|0参考文章


https://www.cnblogs.com/hellowcf/p/6962935.html

 


__EOF__

本文作者cnhkzyy
本文链接https://www.cnblogs.com/my_captain/p/9317100.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   cnhkzyy  阅读(414)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示