Heixiong searched for information related to interface testing on the Internet. Most of them focus on maintaining use cases in text or tables in a data-driven form, without explaining how to generate the desired use cases.
Question:
When testing the interface, for example, parameters a, b, c, I need to test parameter a first, if there is (not passed, empty, integer, Floating point, string, object, too short, too long, SQL injection). One of these situations is a use case. At the same time, ensure that b and c are correct, and ensure that the test of a is not affected by the errors of b and c parameters.
Solution idea:
Parameters that comply with the interface specification can be filled in manually or prepared in the code base. Those parameters that do not meet the specifications (not passed, empty, integer, floating point, string, object, too short, too long, SQL injection) can also be prepared to be used repeatedly as constants in the library
Mainly implemented function points:
1. The api parameters are organized into dict to facilitate the combination of parameters to generate use cases
2. Loop execution of the generated use cases
3. Encapsulate some code for easy use and maintenance
Source code analysis:
canshuxinxi.py file is used to store api interface information. Store it in dict form, so you can retrieve it in the API_ALL['Login Interface'][url] method. It seems more intuitive and you know which interface you are getting the information about.
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2017-06-09 14:09 # canshuxinxi.py # 接口信息 API_ALL = { '登录接口': { 'number': '1', 'url': 'http://www.baidu.com', 'leixing': 'post', 'head': { 'aa': 'bb', 'cc': 'dd', }, 'canshu': { 'username': 'Wbfxs001', 'password': '111111Qq', 'grant_type': 'password', }, 'qiwang': { 'code': 200, 'name': 'Wbfxs001', }, }, '退出接口': { 'number': '1', 'url': 'http://www.baidu.com', 'leixing': 'get', 'canshu': { 'username': 'Wbfxs001', 'password': '111111Qq', 'grant_type': 'password', } } }
changliang.py file is used to store unconventional parameters (which may cause the interface to respond abnormally). Similarly, it is also stored in dict for easy maintenance, such as adding new sql in the future. To inject a code segment, you can directly add
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2017-06-09 14:09 # changliang.py # 常用参数不传,为空,整形,浮点,字符串,object,过短,超长,sql注入 objects1 = 'xxxx' objects2 = 'ssss' ZHCS = { '为空': [''], '整形': [10, 23, 44, 88, 99], '浮点': [1.11, 2.342, -1.03], '字符串': ['aaaa', 'bbbb', 'cccc','dddd'], 'object': [objects1, objects2], '过短': ['1', '0'], '超长': ['11111111111111111111111111111111111111111111111'], 'sql注入': [';and 1=1 ;and 1=2', ";and (select count(*) from sysobjects)>0 mssql", ";and 1=(select IS_SRVROLEMEMBER('sysadmin'));--"], }
# gongju.py as a tool class at the end. The following method is encapsulated for easy calling. It realizes the combination of parameters, produces different combinations of dict type parameters, and saves the dict parameters into a list for easy access.
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2017-06-09 14:11 # gongju.py # 生成不同组合的参数 class gj(): def listalls(self, csTrue, csFalse): fzgcs = [] # 得到cycanshu的key,将所有非正规参数放在一个list中 listall = [] # 保存参数dict 为 list zhcs = dict(csTrue) listall.append(csTrue) aaa = list(csFalse.keys()) for i in aaa: bbb = csFalse[i] # 得到具体参数list for k in bbb: fzgcs.append(k) # 便利每一个参数加入fzgcs列表 zhcskey = list(zhcs.keys()) # 拿到将要进行组合的参数 for i in zhcskey: a = zhcs[i] # 保留原有的参数值,下面替换完后复原正确参数 for k in fzgcs: zhcs[i] = k listall.append(str(zhcs)) # 循环完后复原正确参数 zhcs[i] = a return listall
The jiaoben.py file is used as a script class to execute the combined parameters in a loop and bring in the combined parameter requests in turn. (Only request and print response information, you can add assertions about the response results)
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2017-06-09 14:22 # jiaoben.py from changliang import ZHCS from canshuxinxi import API_ALL from gongju import gj import requests # 脚本类,组合工具参数进行请求 gj = gj() def jball(): apikeys = API_ALL.keys() print(apikeys) for key in apikeys: apiname = key url = API_ALL[key]['url'] number = API_ALL[key]['number'] leixin = API_ALL[key]['leixing'] canshus = gj.listalls(API_ALL[key]['canshu'], ZHCS) if leixin == 'post': print("======="+" api名称:"+apiname+"=======") for cs in canshus: mp = requests.post(url=url, data=cs) fhcode = str(mp.status_code) xysj = str(mp.elapsed.microseconds) print("=响应=api编号:"+number+" 响应code:"+fhcode+" 响应时间:"+xysj) if leixin == 'get': print("======="+" api名称:"+apiname+"=======") for cs in canshus: mp = requests.get(url=url, data=cs) fhcode = str(mp.status_code) xysj = str(mp.elapsed.microseconds) print("=响应=api编号:"+number+" 响应code:"+fhcode+" 响应时间:"+xysj) jball()
The tesone.py file is used as a use case execution file, familiar with the unittest framework Everyone knows the principle, so I won’t introduce it in detail. Black Bear is mainly used to control the execution of scripts. When combined with the unittest framework, it facilitates subsequent expansion.
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2017-06-09 8:53 # tesone.py import requests import unittest import time from jiaoben import jball class testclassone(unittest.TestCase): def setUp(self): print(111) pass def test_1(self): jball() # 执行脚本 pass def tearDown(self): print(333) pass if __name__ == '__main__': unittest.main()
Finally, here is the rendering of the use case after execution:
The above is the detailed content of python+requests+unittest API interface testing problem. For more information, please follow other related articles on the PHP Chinese website!