Heixiong suchte im Internet nach Informationen zum Thema Schnittstellentests. Die meisten von ihnen konzentrieren sich auf die Pflege von Anwendungsfällen in Text- oder Tabellenform in datengesteuerter Form, ohne zu erklären, wie die gewünschten Anwendungsfälle generiert werden.
Frage:
Beim Testen der Schnittstelle, z. B. der Parameter a, b, c, muss ich zuerst Parameter a testen, falls vorhanden (nicht übergeben, leer). , Ganzzahl, Gleitkomma, Zeichenfolge, Objekt, zu kurz, zu lang, SQL-Injection. Stellen Sie gleichzeitig sicher, dass b und c korrekt sind, und stellen Sie sicher, dass der Test von a ist nicht von den Fehlern der b- und c-Parameter betroffen.
Lösung:
Parameter, die der Schnittstellenspezifikation entsprechen, können manuell ausgefüllt oder in der Codebasis vorbereitet werden. Diejenigen Parameter, die nicht den Spezifikationen entsprechen (nicht übergeben, leer, Ganzzahl, Gleitkomma, Zeichenfolge, Objekt, zu kurz, zu lang, SQL-Injection), können auch zur wiederholten Verwendung als Konstanten in der Bibliothek vorbereitet werden
Hauptsächlich implementierte Funktionspunkte:
1. API-Parameter in Diktat organisieren, um die Kombination von Parametern zum Generieren von Anwendungsfällen zu erleichtern
2 🎜 >3. Kapseln Sie etwas Code für eine einfache Verwendung und Wartung
Quellcode-Analyse:Die Datei canshuxinxi.py wird zum Speichern von API-Schnittstelleninformationen verwendet. Speichern Sie es in Diktatform, damit Sie es in der Methode API_ALL['Login Interface'][url] abrufen können. Es erscheint intuitiver und Sie wissen, über welche Schnittstelle Sie die Informationen erhalten.
Die Datei changliang.py wird zum Speichern unkonventioneller Parameter verwendet (die zu einer abnormalen Reaktion der Schnittstelle führen können). Ebenso wird sie zur einfachen Wartung auch in dict gespeichert, z Wenn Sie in Zukunft neue Codes hinzufügen, können Sie#!/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', } } }
#!/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'));--"], }
#!/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
Die Datei jiaoben.py wird als Skriptklasse verwendet, um die kombinierten Parameter in einer Schleife auszuführen und die kombinierten Parameteranforderungen einzubringen wiederum. (Nur Antwortinformationen anfordern und drucken. Sie können Aussagen zu den Antwortergebnissen hinzufügen.)
#!/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()
Die Datei tesone.py wird als Anwendungsfallausführung verwendet Datei, vertraut mit Unittest Jeder im Framework kennt die Prinzipien, daher werde ich es nicht im Detail vorstellen. Black Bear wird hauptsächlich zur Steuerung der Ausführung von Skripten verwendet. In Kombination mit dem Unittest-Framework erleichtert es die spätere Erweiterung.
#!/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()
Abschließend ist das Rendering nach Ausführung des Anwendungsfalls beigefügt:
Das obige ist der detaillierte Inhalt vonProblem beim Testen der API-Schnittstelle von python+requests+unittest. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!