含有token鑑權的介面專案使用unittest框架設計測試登入,充值的介面

傑森斯坦森1150發表於2020-10-23

專案需求:根據介面文件要求:
登入 伺服器會返回token值
充值 充值時需要傳入token值進行鑑權處理,才能充值成功
在用unittest框架測試時,若要設計充值的用例,充值的請求引數一定要先拿到登入時的token值以及id,才能進行充值處理,(充值要依賴登入時token值,和id值)
在這裡插入圖片描述

處理思路
1.首先把公共資料單獨抽出來,用一個檔案去管理,如yaml檔案
2.寫一個讀yaml檔案的get_token()函式放到re_token.py,去讀取需要的資料
3.其它指令碼全部呼叫re_token.py裡面的get_token()函式,然後傳參
4.token動態獲取可以寫個登入函式放到run.py,獲取到之後把token值寫入到yaml檔案,這樣保證每次token都是最新的
5.run.py裡面在執行所有用例之前先登入一次並寫入token到yaml,然後執行所有用例,出報告結果
設計結構如下:
在這裡插入圖片描述

讀取token,程式碼re_token.py

# coding:utf-8
import yaml
import os
cur = os.path.dirname(os.path.realpath(__file__))

def get_token(value):
    '''
    從token.yaml讀取token值
    :param yamlName: 配置檔名稱
    :return: token值
    '''
    p = os.path.join(cur, "token.yaml")
    f = open(p)
    a = f.read()
    t = yaml.load(a)
    f.close()
    return t[value]

if __name__ =="__main__":
    print(get_token())

充值用例
test_recharge.py


from class_18_report.common.re_token import get_token
import unittest
import requests

class TestRecharge(unittest.TestCase):

    def test_recharge_success(self):
        recharge_url = "http://120.78.128.25:8766/futureloan/member/recharge"
        headers = {"X-Lemonban-Media-Type": "lemonban.v2", "Authorization": "Bearer {}".format(get_token("token"))}
        data = {
            "member_id": get_token("id"),
            "amount": 100
        }
        res = requests.post(recharge_url, json=data, headers=headers)
        print(res.json())
        print("充值成功!。。。。。。。")
        expect ={'code':0}
        self.assertEqual(res.json()['code'],expect['code'])

一次性執行多個用例指令碼,都呼叫同一個token值,run_test.py指令碼參考如下


import os
import unittest
import requests
import yaml
#1, 初始化 testloader
import time
from ruamel import yaml
from class_18_report.HTMLTestRunnerNew import HTMLTestRunner
from class_18_report.test_cases import test_login, test_register
from class_18_report.test_cases.test_login import TestLogin
from class_18_report.test_cases.test_rechage import TestRecharge
from class_18_report.test_cases.test_register import TestRegister

curpath = os.path.dirname(os.path.realpath(__file__))



# def write_yaml(value):
#     '''
#     把獲取到的token值寫入到yaml檔案
#     :param value:
#     :return:
#     '''
url = 'http://120.78.128.25:8766/futureloan/member/login'
headers = {"X-Lemonban-Media-Type": "lemonban.v2"}
data = {"mobile_phone": "13712341280", "pwd": "12345678"}
res = requests.post(url, json=data, headers=headers)
print(res.json())
token = res.json()["data"]["token_info"]["token"]
id = res.json()["data"]["id"]
ypath = os.path.join(curpath, "common", "token.yaml")
print(ypath)
# 需寫入的內容
t = {"token": token,"id":id}
# 寫入到yaml檔案
with open(ypath, "w", encoding="utf-8") as f:
    yaml.dump(t, f, Dumper=yaml.RoundTripDumper)


testloader = unittest.TestLoader()

# 2, 查詢測試用例,載入
dir_path = os.path.dirname(os.path.abspath(__file__))
case_path = os.path.join(dir_path, 'test_cases')

# suite = testloader.discover(case_path)


# 載入兩個模組當中的測試用例,儲存到測試套件當中
# suite = testloader.loadTestsFromModule(test_login)
# suite2 = testloader.loadTestsFromModule(test_register)


# 新增指定的測試類
suite = testloader.loadTestsFromTestCase(TestLogin)
suite2 = testloader.loadTestsFromTestCase(TestRecharge)

# 講這兩個測試套件合併新增到一個總的測試套件套件
suite_total = unittest.TestSuite()
suite_total.addTests(suite)
suite_total.addTests(suite2)


# suite = testloader.loadTestsFromName()

print(suite)

# report
report_path = os.path.join(dir_path, 'report')
if not os.path.exists(report_path):
    os.mkdir(report_path)


# 什麼格式??加進去時間戳,可以動態生成測試報告time.time()是float型
ts = str(int(time.time()))  # test_result_234.56.html

file_name = 'test_result_{}.html'.format(ts)


file_path = os.path.join(report_path, file_name)
# text.

# TODO: 一定要使用二進位制的方式開啟
with open(file_path, 'wb') as f:
    # 使用 HTMLTestRunner
    runner = HTMLTestRunner(f,
                            title="HTML格式的測試報告",
                            description='自動化生成的HTML測試報告',
                            tester='testing')
    runner.run(suite_total)


相關文章