robotframework-自動化測試-實例10(接口加密)

前情介紹:
接口的安全性一向都是開發(fā)過程中比較在意的一件事情。如何測試已經(jīng)加密后的接口是現(xiàn)在測試開發(fā)人員常面對的一個問題。
預習知識:接口加密的測試

測試需求:
測試系統(tǒng)中添加公告的接口,此接口采用了 簽名加密的方式(API_KEY+Time)

Inter.png

測試設計:
測試 加密后的接口的方法其實和一般的接口測試是一致的。只是多了一步對傳輸?shù)臄?shù)據(jù)進行加密的過程。

用擴展庫的方式來完成數(shù)據(jù)的加密。(擴展庫的方式詳情-TBD,簡單的來說就是你可以自己寫Python文件,然后RF可以直接調(diào)用你所寫的Python文件)

Python中有很多庫都可以完成md5加密的功能,此次選取的是hashlib庫(提前自行安裝:pip install hashlib)

1.png

上圖中就是對sign_str進行一個md5加密的形式,md5加密是不可逆的,也就是說當你得到6648e929329e53e7a91c50ae685a88b5那一串東西的時候,你并不知道反編譯回來可以是@signpassword, BUT,你可以猜測啊,如果你猜它的md5原值就是@signpassword,最后你拿到加密后的值為6648e929329e53e7a91c50ae685a88b5,Bingo,恭喜你猜對了。所以呢,md5嚴格意義上來說是一種對稱加密的算法,不算特別安全,不過這里為了讓大家初步了解接口加密測試的方式,我們就從這里開始學習啦~~~

測試實現(xiàn):
1 編寫一個md5Enc.py文件,里面包含兩個函數(shù)

  • get_sign 用來處理接口的簽名加密
  • get_time_Stamp 用來處理把字符串模式的時間轉(zhuǎn)換為時間戳(這里是一個坑,因為RF中的get time本身得出來的時間是類似2017-07-24 11:47:20 格式的,而 此接口需要的time是時間戳格式)
    2 RF中新建一個項目,在TestSuite層級上導入上面的md5Enc.py文件作為擴展庫(記得.py的后綴名需要加上的)
md5Enc_Lib.png

2 編寫一個返回值為200的正向接口測試的Testcase

addEvent_Sign.png

第一行:獲取當前時間,賦值給變量t_now。
第二行:調(diào)用擴展庫中的get_time_Stamp函數(shù),將字符串格式的時間轉(zhuǎn)換成時間戳,賦值給變量t_now_stamp
第三行:打印出來看看值是否正常,主要用于調(diào)試
第四行:調(diào)用擴展庫中的get_sign函數(shù),將API_KEY+time的值進行md5加密
第五行:對報頭content-Type賦值后構(gòu)建為一個字典賦值給變量headers
第六行:將一個常量的時間賦值給變量start_time_str
第七行:將POST需要傳輸?shù)臄?shù)據(jù)構(gòu)造成字典對象賦值給變量payload
第八行:將payload中的sign取出來查看(為了調(diào)試,不必要)
第九行:建立一個Session開始準備發(fā)送請求
第十行:發(fā)送Post請求,所帶參數(shù)為之前所構(gòu)造好的參數(shù)
第十一行:對請求返回的status code進行斷言,正常應為200
第十二行:打印返回的值的json格式的內(nèi)容
第十三行:將返回的json格式值賦值給dict
第十四行到第十九行:對返回的值依據(jù)之前的接口定義文檔來進行斷言

附代碼(Robot TestCase)

*** Settings ***
Documentation     A robot file to test the CryptAPI
Library           RequestsLibrary
Library           Collections
Library           OperatingSystem
Library           md5Enc.py
Library           Signtest.py

*** Test Cases ***
AddEvent_Sign
    ${t_now}    get time    NOW    #獲取當前時間
    ${t_now_stamp}    get_time_Stamp    ${t_now}
    log    ${t_now_stamp}
    ${sign_md5}    get_sign    ${t_now_stamp}    #調(diào)用函數(shù)
    ${headers}    Create Dictionary    Content-Type=application/x-www-form-urlencoded
    ${start_time_str}    set variable    2017-07-20 12:00:00
    ${payload}    Create Dictionary    eid=13    name=iphone8releasemeeting    limit=2000    address=NewYork    start_time=${start_time_str}
    ...    time=${t_now_stamp}    sign=${sign_md5}
    ${sign_log}    Get From Dictionary    ${payload}    sign
    Create Session    event    http://127.0.0.1:8000/api
    ${r}=    Post Request    event    /sec_add_event/    data=${payload}    headers=${headers}
    Should Be Equal As Strings    ${r.status_code}    200
    log    ${r.json()}
    ${dict}    Set variable    ${r.json()}
    #斷言結(jié)果
    ${msg}    Get From Dictionary    ${dict}    message
    Should Be Equal    ${msg}    add event success
    ${sta}    Get From Dictionary    ${dict}    status
    ${status}    Evaluate    int(200)
    Should Be Equal    ${sta}    ${status}

Test
    ${message}    add_event_success
    Log    ${message}

md5Enc.py(導入的文件需要和robot的項目在同一個文件夾內(nèi))

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import hashlib
import json
import time

class md5Enc(object):
    def get_sign(self,t):
        '''
        Examples:
        ${sign_md5}  | Get Sign  |${t_now}
        '''
        keyMd5 = hashlib.md5()
        api_key = "&Guest-Bugmaster"
        sign_str = t + api_key
        sign_bytes_utf8 = sign_str.encode(encoding="utf-8")
        keyMd5.update(sign_bytes_utf8)
        keyMd5 = keyMd5.hexdigest()

        return keyMd5

    def get_time_Stamp(self,t=''):
        timeArray = time.strptime(t, "%Y-%m-%d %H:%M:%S")
        timeStamp = int(time.mktime(timeArray))
        timeStamp_str = str(timeStamp)

        return timeStamp_str
#a=md5Enc.get_sign('sdf','2017-07-20 16:04:30')

CC先生說,擴展庫可以說是RF中非常強大的一個功能,如果想對之前的自動化測試代碼進行重構(gòu),又不想花費太多工夫的情況下,使用RF的擴展庫是再方便不過的功能。不過這里有一個坑是,如果你的Class里面的函數(shù)是以test開頭的可能添加會失敗。(不要問我是怎么知道的。。。一個多小時的時間就耗費在這個上面了。。。。)


圖片發(fā)自簡書App
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,316評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,481評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,241評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,939評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,697評論 6 409
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,182評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,247評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,406評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,933評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,772評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,973評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,516評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,638評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,866評論 1 285
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,644評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,953評論 2 373

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