Heim >Backend-Entwicklung >Python-Tutorial >Problem beim Testen der API-Schnittstelle von python+requests+unittest

Problem beim Testen der API-Schnittstelle von python+requests+unittest

怪我咯
怪我咯Original
2017-06-23 14:04:132307Durchsuche

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',
                                      }
            }
}

# gongju.py einfach als Toolklasse hinzufügen Berufung. Es realisiert die Kombination von Parametern, erzeugt verschiedene Kombinationen von Dikttypparametern und speichert die Diktatparameter in einer Liste für einen einfachen Zugriff.
#!/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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn