接口自動化測試-初次使用(python/pytest)

簡單的設(shè)計思路
  • 利用pytest對一個接口進(jìn)行各種場景測試并且斷言驗(yàn)證
  • 配置文件獨(dú)立開來(conf文件)炬守,實(shí)現(xiàn)不同環(huán)境下只需要改環(huán)境配置即可
  • 測試的場景讀取excle的測試用例,可支持全量執(zhí)行或者自定義哪條用例執(zhí)行(用例內(nèi)帶加密變量)分预;
  • 接口入?yún)⑦€包含了加密的邏輯沼本,所以需加一層加密處理

用例的樣例:
image.png

應(yīng)用的庫包含:
import pytest
import time, json
import base64, hmac
import hashlib, uuid, re
import requests
import pandas as pd

1. 先定義好conf配置代碼


def config_txt(file_name="config.txt"):
    data_head = list()
    data_tail = list()
    for line in open(file_name, encoding='gb18030', errors='ignore'):
        head, sep, tail = line.partition('=')
        data_head.append(head.strip('\n '))
        if tail.find('#') != -1:
            tail, tail_b, tail_c = tail.partition('#')
        data_tail.append(tail.strip('\n  '))
    txt_data = dict(zip(data_head, data_tail))
    heada, sepa, taila = txt_data["GATEWAY_URL"].partition('/test_a')
    txt_data['HTTP_URI'] = "/test_a" + taila
    return txt_data
conf文件配置樣例:
GATEWAY_URL = https://127.0.0.1:8051/test_a/adk #url鏈接地址
zhu_KEY = test_key  #用戶信息1
zhu_SECRET = test_secret #用戶2
zhu_ID = 18825176013    #用戶ID
zhuLY_ID = 588347220  #用戶信息3

2. 簡單處理一下加密的處理噩峦,給后續(xù)持續(xù)調(diào)用

def md5(data_md5):
    data_md5 = hashlib.md5(data_md5.encode(encoding='UTF-8')).hexdigest()
    return data_md5

def sha256(data_sha256):
    data_sha256 = hashlib.sha256(data_sha256.encode(encoding='UTF-8')).hexdigest()
    return data_sha256

def hash_hmac(app_secret, msg, sha1):
    hmac_code = hmac.new(app_secret.encode(), msg.encode(), sha1).digest()
    return base64.b64encode(hmac_code).decode()

3. 處理用例里面的加密變量,例如:請求參數(shù)md5(18812345678)先進(jìn)行數(shù)據(jù)預(yù)處理

def body_encrypt(data_encrypt):
    if data_encrypt.find("sha256(") != -1:
        sha_ss = re.findall(r"sha256[(](.+?)[)]", data_encrypt)
        for i in range(len(sha_ss)):
            data_encrypt = re.compile("sha256[(]" + str(sha_ss[i]) + '[)]').sub(str(sha256(sha_ss[i])), data_encrypt)
    if data_encrypt.find("md5(") != -1:
        md5_ss = re.findall(r"md5[(](.+?)[)]", data_encrypt)
        for i in range(len(md5_ss)):
            data_encrypt = re.compile("md5[(]" + str(md5_ss[i]) + '[)]').sub(str(md5(md5_ss[i])), data_encrypt)
    return data_encrypt

4. 讀取excel文檔里面的用例數(shù)據(jù)做為測試場景

def excel_case(file_name="case_file2.xlsx", case_id="all"):  # 讀取excel賬號及路由代理信息file_name
    data_excle = pd.read_excel(file_name, sheet_name=0, engine="openpyxl")
    df = pd.DataFrame(data_excle)
    if case_id != "all":
        df_data = df[(df.case_id == case_id)].to_dict('list')
    else:
        df_data = df.to_dict('list')
    case_id, case_name = df_data['case_id'], df_data['case_name']
    case_body, case_assert = df_data['case_body'], df_data['case_assert']
    case_body1 = body_encrypt(str(case_body))
    txt_data = list(zip(case_id, case_name, eval(case_body1), case_assert))
    return txt_data

5. 上主菜,pytest的使用

class Test_zhu(object):
    #類初始化抽兆,此處在測試執(zhí)行中识补,全局只會執(zhí)行一次(讀取配置文件)
    @classmethod
    def setup_class(self):
        self.text_data = config_txt()
   #方法初始化,此處在測試執(zhí)行中郊丛,每條用例都會先執(zhí)行一遍
    def setup_method(self):
        time.sleep(0.4)
        self.time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
   #request接口請求的邏輯
    def request_id(self, GATEWAY_URL, http_body):
        HTTP_BODY = eval(http_body)
        TIME_STAMP = str(int((time.time() + 5) * 1000))
        zhuCE = uuid.uuid1().hex
        msg = self.text_data['zhuLY_ID'] + "\n" + TIME_STAMP + "\n" + zhuCE + "\n" + self.text_data['zhu_KEY'] + "\n" + \
              self.text_data["HTTP_URI"] + "\n" + json.dumps(HTTP_BODY)
        HTTP_HEADER = {
            "zhu_ID": self.text_data['zhu_ID'],
            "zhuLY_ID": self.text_data['zhuLY_ID'],
            "zhuCE": zhuCE,
            "zhu_KEY": self.text_data['zhu_KEY'],
            "TIMESTAMP": TIME_STAMP,
            "SIGNATURE": hash_hmac(self.text_data['zhu_SECRET'], msg, hashlib.sha1)}
        print('**請求參數(shù):{}.'.format(HTTP_BODY))
        response_one = requests.post(GATEWAY_URL, json=HTTP_BODY, headers=HTTP_HEADER, verify=True)
        print('**響應(yīng)結(jié)果:{}.'.format(response_one.text))
        return eval(response_one.text)
    #parametrize為數(shù)據(jù)驅(qū)動李请,此處獲取了excle用例里的數(shù)據(jù)瞧筛;apitest定個標(biāo)簽,后續(xù)冒煙啥的可以選擇性的跑(暫時無用)导盅;
    #excel_case(case_id="all")說明较幌,all為全部用例執(zhí)行或者指定用例執(zhí)行case_0001
    @pytest.mark.parametrize('case_id,case_name, case_body, case_assert', excel_case(case_id="all"))
    @pytest.mark.apitest
    def test_zhu_case(self, case_id, case_name, case_body, case_assert):
        print("**\n執(zhí)行編號:" + case_id + "\n**用例名稱:" + case_name)
        case_assert_a = json.loads(case_assert)
        alertText = self.request_id(self.text_data['GATEWAY_URL'], case_body)
        retcode = case_assert_a.get('code') if case_assert_a.get('retcode') == None else case_assert_a.get('retcode')
        alertText_a = alertText.get('code') if alertText.get('retcode') == None else alertText.get('retcode')
        #此處為斷言,判斷用例通過還是不通過
        assert alertText_a == retcode
if __name__ == '__main__':
    pytest.main(["-sv", 'zhu_testA.py'])

5. 利用pytest-html庫可以生成html報告
命令:pytest zhu_testA.py --html=report.html --self-contained-html

image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末白翻,一起剝皮案震驚了整個濱河市乍炉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌滤馍,老刑警劉巖岛琼,帶你破解...
    沈念sama閱讀 221,406評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異巢株,居然都是意外死亡槐瑞,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評論 3 398
  • 文/潘曉璐 我一進(jìn)店門阁苞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來困檩,“玉大人,你說我怎么就攤上這事那槽〉垦兀” “怎么了?”我有些...
    開封第一講書人閱讀 167,815評論 0 360
  • 文/不壞的土叔 我叫張陵骚灸,是天一觀的道長糟趾。 經(jīng)常有香客問我,道長甚牲,這世上最難降的妖魔是什么义郑? 我笑而不...
    開封第一講書人閱讀 59,537評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮鳖藕,結(jié)果婚禮上魔慷,老公的妹妹穿的比我還像新娘只锭。我一直安慰自己著恩,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,536評論 6 397
  • 文/花漫 我一把揭開白布蜻展。 她就那樣靜靜地躺著喉誊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪纵顾。 梳的紋絲不亂的頭發(fā)上伍茄,一...
    開封第一講書人閱讀 52,184評論 1 308
  • 那天,我揣著相機(jī)與錄音施逾,去河邊找鬼敷矫。 笑死例获,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的曹仗。 我是一名探鬼主播榨汤,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼怎茫!你這毒婦竟也來了收壕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,668評論 0 276
  • 序言:老撾萬榮一對情侶失蹤轨蛤,失蹤者是張志新(化名)和其女友劉穎蜜宪,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體祥山,經(jīng)...
    沈念sama閱讀 46,212評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡圃验,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,299評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了缝呕。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片损谦。...
    茶點(diǎn)故事閱讀 40,438評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖岳颇,靈堂內(nèi)的尸體忽然破棺而出照捡,到底是詐尸還是另有隱情,我是刑警寧澤话侧,帶...
    沈念sama閱讀 36,128評論 5 349
  • 正文 年R本政府宣布栗精,位于F島的核電站,受9級特大地震影響瞻鹏,放射性物質(zhì)發(fā)生泄漏悲立。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,807評論 3 333
  • 文/蒙蒙 一新博、第九天 我趴在偏房一處隱蔽的房頂上張望薪夕。 院中可真熱鬧,春花似錦赫悄、人聲如沸原献。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽姑隅。三九已至,卻和暖如春倔撞,著一層夾襖步出監(jiān)牢的瞬間讲仰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評論 1 272
  • 我被黑心中介騙來泰國打工痪蝇, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鄙陡,地道東北人冕房。 一個月前我還...
    沈念sama閱讀 48,827評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像趁矾,于是被迫代替她去往敵國和親毒费。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,446評論 2 359

推薦閱讀更多精彩內(nèi)容