1. 程式人生 > >Python3利用HTTPTestRunner進行介面測試

Python3利用HTTPTestRunner進行介面測試

匯入HTTPTestRunner後,對一些常用方法進行了封裝,之後只要呼叫即可。實現一條語句完成請求

約定:請求的json檔案放在本目錄的特定資料夾下

包含了各種請求條件下的重寫方法,基本滿足需求

import requests
import unittest
import json
import os
from enum import unique
from enum import Enum
import random


#列舉型別,規定方法呼叫,現在只支援get和post
@unique
class Method(Enum):
    get = 1
    post = 2
    delete = 3
    patch = 4


class TestMyTest(unittest.TestCase):
    u""" 自己的測試,HTTPTestRunner 會將次加到註釋裡 """
    # 基礎路徑
    baseurl = "https://域名或ip地址"

    # 從檔案獲取json引數
    def loadParams(self, filename):
        with open(os.getcwd() + os.path.sep + filename, encoding="utf-8", mode="r") as f:
            return json.load(f)

    #從檔案獲取簡單的文字引數
    def loadSimpleParams(self,filename):
        with open(os.getcwd() + os.path.sep + filename, encoding="utf-8", mode="r") as f:
            return f.read()

    #random id用於給建立使用者時,新增一個隨機數
    randomId = str(random.choice(range(100)))


    # 獲取登入cookies
    def loginCookies(self):
        loginuri = "/adminapi/login"
        res = requests.post(url=self.baseurl + loginuri, data=self.loadParams("params\login.json"), verify=False)
        return res.cookies
    # 獲取登入headers
    def loginHeaders(self):
        loginuri = "/adminapi/login"
        res = requests.post(url=self.baseurl + loginuri, data=self.loadParams("params\login.json"), verify=False)
        return res.headers



    #模板方法,需要傳入uri,引數,如果請求方式是method則不需要,post需要制定為post,返回result,如果不要cookie,則cookie="No"
    def myTest(self, testuri=None, data= None, verify=False, cookies="", method=Method.get):
        result = ""
        #如果cookie未賦值,則呼叫登入方法,獲取cookie,否則,使用使用者傳遞的cookie
        if cookies == "":
            cookies = self.loginCookies()
        if method == Method.get:
            result = requests.get(url=self.baseurl + testuri, data=data, verify=verify, cookies=cookies)
        elif method == Method.post:
            result = requests.post(url=self.baseurl + testuri, data=data, verify=verify, cookies=cookies)
        elif method == Method.delete:
            result = requests.delete(url= self.baseurl + testuri, verify = verify, cookies = cookies)
        elif method == Method.patch:
            result = requests.patch(url=self.baseurl + testuri, data = data, verify = verify, cookies = cookies)
        print(result.status_code)
        #print(result.json())
        return result
    #不需要cookie,如login時使用
    def myTestNoCookie(self, testuri=None, data= None, verify=False, method=Method.get):
        result = ""
        #如果規定cookie為No,則請求不新增cookie
        if method == Method.get:
            result = requests.get(url=self.baseurl + testuri, data=data, verify=verify)
        elif method == Method.post:
            result = requests.post(url=self.baseurl + testuri, data=data, verify=verify)
        print(result.status_code)
        #print(result.json())
        return result
    #自定義cookies
    def myTestCookies(self, testuri=None, data= None, verify=False, cookies="", method=Method.get):
        result = ""
        #如果cookie未賦值,則呼叫登入方法,獲取cookie,否則,使用使用者傳遞的cookie
        if cookies == "":
            raise Exception("本方法 cookie 不能為空")
        if method == Method.get:
            result = requests.get(url=self.baseurl + testuri, data=data, verify=verify, cookies=cookies)
        elif method == Method.post:
            result = requests.post(url=self.baseurl + testuri, data=data, verify=verify, cookies=cookies)
        print(result.status_code)
        #print(result.json())
        return result

    #沒有data的請求
    def myTestNoData(self, testuri=None, verify=False, cookies="", method=Method.get):
        result = ""
        #如果cookie未賦值,則呼叫登入方法,獲取cookie,否則,使用使用者傳遞的cookie
        if cookies == "":
            cookies = self.loginCookies()
        if method == Method.get:
            result = requests.get(url=self.baseurl + testuri, verify=verify, cookies=cookies)
        elif method == Method.post:
            result = requests.post(url=self.baseurl + testuri, verify=verify, cookies=cookies)
        print(result.status_code)
        #print(result.json())
        return result

    #模板方法,需要Contet-Type和Cookies的header的方法
    def myTestWithHeader(self, testuri=None, data= None, verify=False, headers= "", method=Method.get):
        result = ""
        #如果cookie未賦值,則呼叫登入方法,獲取cookie,否則,使用使用者傳遞的cookie
        if headers == "":
            headers = {"Content-Type": self.loginHeaders()["Content-Type"], "Cookie": self.loginHeaders()["Set-Cookie"]}
        if method == Method.get:
            result = requests.get(url=self.baseurl + testuri, data=data, verify=verify, headers=headers)
        elif method == Method.post:
            result = requests.post(url=self.baseurl + testuri, data=data, verify=verify, headers=headers)
        elif method == Method.delete:
            result = requests.delete(url= self.baseurl + testuri)
        elif method == Method.patch:
            result = requests.patch(url=self.baseurl + testuri, data = data, verify = verify, headers=headers)
        print(result.status_code)
        #print(result.json())
        return result

    #使用者登入
    def test_login(self):
        result = self.myTestNoCookie(testuri="/adminapi/login",data= self.loadParams("params\login.json"), method=Method.post)
        self.assertEqual(200, result.status_code)
        self.assertEqual("操作成功", result.json()["message"])

    #使用者登出
    def test_logout(self):
        result = self.myTestNoData(testuri="/adminapi/logout", method= Method.post)
        self.assertEqual(200, result.status_code)
        self.assertEqual("操作成功", result.json()["message"])