接口自动化测试(三)
一. 定义公共的请求方法
如下图所示,同一个模块,只是请求数据和返回数据不同,http请求的发送过程是完全相同的
对于不同模块,只是请求的url、请求方法、请求数据和返回数据不同,http请求的过程也是完全相同的
这样就可以将发送请求的方法写成一个类或函数,供不同的测试用例调用
具体的实现是
import requests class MyRequests: def send_request(self, method, url, **kwargs): res = requests.request(method, url, **kwargs).text return res
二. 利用excel存储测试数据,实现测试数据和测试脚本的分离
利用excel存储测试数据的好处是,可以实现测试数据和测试脚本的分离,以后一旦数据有变动(添加删除、修改测试数据),不需要修改代码,只在excel中修改就好了
那么,测试数据和脚本是怎么联系在一起的?
可以定义一个读取excel的类,这个类读取到的数据返回给测试用例,测试用例再调用每一条测试数据去发送请求,进行比对。但有一个问题,按照以往的做法,一个test_send_request函数里利用for循环遍历每条测试数据,得到的结果始终是一个测试用例,我们希望每一条测试数据都是一个测试用例,就需要用到ddt
三. ddt
1. 什么是ddt
ddt(data driven tests):数据驱动测试,由外部数据集合来驱动测试用例
核心的思想:数据和测试代码分离
2. 应用场景
一组数据来执行相同的操作
当测试数据发生大量变化的情况下测试代码(或者说测试用例)可以保持不变
3. ddt的安装
pip install ddt
4. 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?
4. 实例
实例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
参考文章
https://www.cnblogs.com/hellowcf/p/6962935.html