开源API资源及ddt数据驱动测试
一、概述:
- 学习整理开源的API相关资源,及对接口数据驱动的简单测试;
- DDT包含类的装饰器ddt和两个方法装饰器data(直接输入测试数据)
- 通常情况下,data中的数据按照一个参数传递给测试用例,如果data中含有多个数据,以元组,列表,字典等数据,需要自行在脚本中对数据进行分解或者使用unpack分解数据。
二、现有开源API:
天气查询-GET: https://qqlykm.cn/api/api/tq.php?city=北京
获取网址标题-GET: https://qqlykm.cn/api/api/tle.php?url=www.taobao.com
ping域名对应ip信息 -GET: https://qqlykm.cn/api/ping/ping.php?host=www.baidu.com
淘宝商品搜索-GET: https://qqlykm.cn/api/tb/api.php?so=连衣裙
维梦平台开源的API: https://api.52vmy.cn/
图片文字识别-POST: https://api.oioweb.cn/api/action.php ...........file=图片名称

开源接口汇总:
https://docs.tenapi.cn/tencent/group-avatar.html
https://blog.csdn.net/weixin_44155115/article/details/105086219
三、场景测试:
#!/usr/bin/env python # -*- coding: utf-8 -*- import unittest import requests from ddt import ddt, data #_________________________使用ddt分别查询北京、广州、武汉天气______________________________ @ddt class FooTestCase(unittest.TestCase): @data({"city":"北京"}, {"city":"广州"}, {"city":"武汉"})#这里传字典 def test_map(self, key1): print('获取key1的值',key1) url="https://qqlykm.cn/api/api/tq.php" r=requests.get(url=url,params=key1) print(r.text) print('\n') if __name__ == '__main__': unittest.main()
四、ddt基本语法:
使用场景:一般进行接口测试时,每个接口的传参都不止一种情况,一般会考虑正向、逆向等多种组合。所以在测试一个接口时通常会编写多条case,而这些case除了传参不同外,其实并没什么区别; 这个时候就可以利用ddt来管理测试数据,提高代码复用率。
#!/usr/bin/env python # encoding: utf-8 import unittest from ddt import ddt,data,unpack ##_________________读数据:整体列表,字典、元组______________________________ @ddt class MyTest(unittest.TestCase): #@data([1,2,3,4,5,6,7]) ##传递list #@data({"a":"1","b":2}) ##传递字典 @data((1,2,3)) ##元组 def test(self,data): print(data) print('data类型:',type(data)) if __name__ == '__main__': unittest.main(verbosity=2) #_____________________________________读数据:整数_________________________________________________ @ddt class Testwork(unittest.TestCase): @data(1,2,3) def test_01(self,value): #value用来接收data的数据 print(value) if __name__ == '__main__': unittest.main() ##__________________________________读数据:嵌套列表、元组、字典的整体传递方式________________________ @ddt class MyTest(unittest.TestCase): #___________________嵌套使用(拆分遍历)____________________ # @data(*[[1,2,3],[1,0,1],[0,0,0],[1,1,3]]) # @data(*[{"a":1}, {"a":2}, {"a":3}, {"a":4}]) @data(*[(1,5), (4,2), (6,7), (5,6)]) def test_01(self,data): print(data) #______________________不加* 直接当成整体_______ #@data([{"a":1}, {"a":2}, {"a":3}, {"a":4}]) @data([(1,5), (4,2), (6,7), (5,6)]) def test_02(self,data): print(data) if __name__ == '__main__': unittest.main(verbosity=2) ##____________________________读数据:使用unpack_多组分解元素_______________________________________________ @ddt class Testwork(unittest.TestCase): # @data([{'name':'lili','age':12},{'sex':'male','job':'teacher'},{'chen':363,'wei':'wowo'}]) #字典 @data((1,2,3),(4,5,6)) #这里可以是元组、list、字典 @unpack #拆分数据 def test_01(self,a,b,c): #每组数据有3个值,所以设置3个形参 print(a) if __name__ == '__main__': unittest.main() ##____________________________________________读文件数据(json和yml)_____________________________________________________________ from ddt import ddt,data,unpack,file_data ###############读取整体文件################### # @ddt # class MyTest(unittest.TestCase): # # @file_data('chen.json') #读取json文件 # #@file_data('wei.yml') #读取yml文件 # def test_data_list(self,value): # print(value) # # if __name__ == '__main__': # unittest.main() ###############推荐:读取文件遍历(图一)################### @ddt class MyTest(unittest.TestCase): #@file_data('chen.json') #读取json文件 @file_data('wei.yml') #读取yml文件 def test_data_list(self,value): #遍历数据 for i in value: name=i.get('username') print(name) if __name__ == '__main__': unittest.main() ###############读取文件遍历(图二)################### @ddt class MyTest(unittest.TestCase): #@file_data('chen.json') #读取json文件 @file_data('wei.yml') #读取yml文件 def test_data_list(self,value): #遍历获取数据 for i in range(len(value)): print(value[i]['case'+str(i)]['username']) if __name__ == '__main__': unittest.main()


5参数化模块parameterized
备注:parameterized模块和ddt差不对,都是数据驱动测试
#!/usr/bin/env python # encoding: utf-8 import unittest from parameterized import parameterized, parameterized_class # 引入parameterized模块 ###________________________________parameterized用于参数化,和ddt类似_______________________________________________ a = [(1,2,3), (4,5,7)] bbb=[{'模块': '获取天气', '请求方式': 'GET', '请求数据': 'city=北京', '预期结果': '车位为陈伟'},{'模块': '测试', '请求方式': 'post', '请求数据': 'city=广州', '预期结果': '2222222'}] class ceshi(unittest.TestCase): def test01(self): self.assertEqual(2,2) @parameterized.expand([(1,2,3),(4,3,7)])#嵌套list def test02(self,a,b,c): print('从0开始打印第1个元素',b) print(a,b,c) s = a+b #self.assertEqual(s,c) self.assertEqual(1,1) ##@parameterized.expand([{'模块': '获取天气', '请求方式': 'GET', '请求数据': 'city=北京', '预期结果': '车位为陈伟'},{'模块': '测试', '请求方式': 'post', '请求数据': 'city=广州', '预期结果': '2222222'}])#列表嵌套字典 @parameterized.expand(bbb)#可以通过变量或函数 def test_03(self,a,b,c,d): print('从0开始打印第1个元素',b) print(a,b,c,d) self.assertEqual(1,1)#断言是否相等 if __name__=='__main__': unittest.main() #_______________________________________________parameterized参数化字典(遍历字典)_______________________________________________ a = [(1,2,3), (4,5,7)] bbb=[{'模块': '获取天气', '请求方式': 'GET', '请求数据': 'city=北京', '预期结果': '车位为陈伟'},{'模块': '测试', '请求方式': 'post', '请求数据': 'city=广州', '预期结果': '2222222'}] @parameterized_class(bbb) class ceshi(unittest.TestCase): def test01(self): self.assertEqual(2,2) def test_02(self): print(self.请求方式)#获取字典的key print('---------------------') self.assertEqual(1,1)#断言是否相等 if __name__=='__main__': unittest.main()
相关链接:
https://blog.csdn.net/lelemom/article/details/83184767 ............................python+requests+excel+unittest+ddt接口自动化数据驱动并生成html报告(普通版)
https://blog.csdn.net/NoamaNelson/article/details/107462355 ..................python+requests+excel+unittest+ddt接口自动化数据驱动并生成html报告(进化版)
https://mp.weixin.qq.com/s/oYTh--x3ngBYYziVU8CUMg ...........................基于Python+requests+Excel数据驱动的接口自动化测试中解决接口间数据依赖
https://blog.csdn.net/lingxiyizhi_ljx/article/details/106279105 ..................ddt 实现数据驱动
https://www.cnblogs.com/lslin/p/12546563.html ......................................ddt的用法
https://www.cnblogs.com/qican/p/13297917.html ...................................ddt读取yml、json文件数据
浙公网安备 33010602011771号