Unittest+requests+mock+HTMLTestRunner+DDT接口自動(dòng)化框架

概述:

(what)接口自動(dòng)化是指模擬接口層面的自動(dòng)化。(why)因?yàn)槌杀镜涂删S護(hù)性高逐漸成為自動(dòng)化測(cè)試的主流方向之一疗杉。

一、簡(jiǎn)要說(shuō)明

環(huán)境:Python3.6,Unittest,Requests,Mock,DDT

ParamUnittest =  0.2
configparser  =  5.0.0
ddt           =  1.4.1
jsonpath      =  0.82
mock          =  4.0.2
openpyxl      =  3.0.4
requests      =  2.24.0
HTMLTestRunner=  0.9.1

流程說(shuō)明:讀取EXCEL測(cè)試數(shù)據(jù)->生成測(cè)試用例->執(zhí)行測(cè)試用例->結(jié)果寫(xiě)入EXCEL->生成HTMLTestRunner報(bào)告

模塊昭伸、類(lèi)胀滚、包的設(shè)計(jì)說(shuō)明:

baserequest.py 封裝requests方法,支持(post\get\put)多協(xié)議擴(kuò)展
handle_ini.py  讀取配置文件戴差,包括:域名的配置送爸,email的配置,數(shù)據(jù)庫(kù)的配置,取值規(guī)則的配置
mockvalue.py   封裝mock響應(yīng)值的方法暖释,如依賴(lài)數(shù)據(jù)
Util/handl*.py token處理袭厂,json處理,封裝用來(lái)assert的斷言數(shù)據(jù)處理
RunCase.py     核心代碼球匕。聚合用例集并執(zhí)行纹磺,最后生成報(bào)告

Excel測(cè)試數(shù)據(jù)格式如下圖所示:


Excel用例.png

二、框架結(jié)構(gòu)與流程

1.框架結(jié)構(gòu)如下圖所示:

框架結(jié)構(gòu).png

2.框架流程圖如下圖所示:

代碼流程圖.jpg

三亮曹、代碼功能分析

1橄杨、Config.ini配置文件

此文件中[server]為域名相關(guān)配置秘症,[json]為json處理規(guī)則相關(guān)配置

[server]
host=測(cè)試
username=測(cè)試
password=測(cè)試

[database]
database=測(cè)試
username=測(cè)試
password=測(cè)試


[json]
token_rule = $..token

2、openpyxl讀取excel數(shù)據(jù)

一個(gè)接口可以定義多條case,get_excel_data為封裝了讀取所有excel中case的方法讥珍,最終存儲(chǔ)到一個(gè)嵌套list中历极。

class HandExcel():

    def get_excel_data(self):
        """exccel里面所有的case數(shù)據(jù)以列表嵌套list存儲(chǔ))"""
        data_list = []
        for i in range(self.get_rows()):
            data_list.append(self.get_rows_value(i + 2))

        return data_list[:-1]   

3、ddt數(shù)據(jù)驅(qū)動(dòng)獲取所有case

在執(zhí)行函數(shù)內(nèi)獲取所有的case衷佃,原理和for循環(huán)相似

@ddt.ddt
class Test_Index(unittest.TestCase)

    @ddt.data(*data)
    def test_mainindex(self, data):
        """執(zhí)行case主流程"""
        case_id = data[0]
        i = excel_data.get_rows_number(case_id)  # 行號(hào)
        is_run = data[2]
        if is_run == "yes":
            data1 = json.loads(data[7])
            is_depend = data[3]

4趟卸、編寫(xiě)測(cè)試用例

@ddt.ddt
class Test_Index(unittest.TestCase):

    @ddt.data(*data)
    def test_mainindex(self, data):
        # 用例描述:調(diào)用商品分類(lèi)接口拿到并根據(jù)依賴(lài)數(shù)據(jù)查詢(xún)商品詳情列表
        header = None
        get_token = None
        is_run = data[2]
        if is_run == "yes":
            url = data[5]
            method = data[6]
            expected_method = data[10]
            res = BaseRequest.run(method, url, data1, get_token, header)
            code = res['meta']["status"]
            message = res['meta']["msg"]
            if expected_method == "mec":
                configmes = handle_result_msg(url, code)
                self.assertEqual(configmes, message)

5、運(yùn)行框架的主程序

class RunCase():
    def runcase(self):  # unittest discover管理case

        case_path = os.path.join(base_path, "testCase")

        discover = unittest.defaultTestLoader.discover(case_path, pattern="test*.py")

        result_path = os.path.join(base_path, "Report", "report.html")
        with open(result_path, "wb") as f:
            runner = HTTPTestRunner.HTMLTestRunner(stream=f, title="測(cè)試報(bào)告", description="測(cè)試人員:ysz")
            runner.run(discover)

6氏义、logs INFO示例

2020-08-13 18:13:06,111 - logs… - INFO - D:\untitled\untitled\shopvinterface\Report\report.html
2020-08-13 18:13:06,112 - logs… - INFO - D:\untitled\untitled\shopvinterface\Run\testcase1_ddt.py

7锄列、Mock部分代碼

def mock_depend():
    """mock依賴(lài)數(shù)據(jù)"""
    data = {
        "data": {
            "id": 1
            
        }
    }

    depend_value = data.get('data').get('id')
    get_data = mock.Mock(return_value=depend_value)
    res = get_data
    return res()

8、baserequest部分代碼

class BaseRE():
    """基礎(chǔ)請(qǐng)求"""
    def send_post(self, url, data, get_token=None, header=None):
        """post請(qǐng)求"""
        request = requests.Session()  # 自動(dòng)關(guān)聯(lián)session
        res = request.post(url=url, data=data, headers=header).json()

        if get_token is not None:
            """token寫(xiě)入"""
            token = ' '.join(jsonpath.jsonpath(res, '$..token'))
            header2 = {"Authorization": token}
            write_token(header2, get_token["is_token"])

        return res

四惯悠、HTMLTestRunner報(bào)告總覽及Excel結(jié)果

1.HTMLTestRunner報(bào)告總覽如下圖所示:


HTMLTestRunner報(bào)告.png

2.Excel結(jié)果如下圖所示:


excel結(jié)果.png

五邻邮、jenkins集成

使用jenkins插件生成HTMLTestRunner報(bào)告


jenkins輸出報(bào)告.png

六、框架擴(kuò)展優(yōu)化

進(jìn)行中...

七克婶、shell腳本自動(dòng)執(zhí)行框架

使用了shell腳本自動(dòng)執(zhí)行框架筒严,每次執(zhí)行前清空日志,并輸出最新日志到控制臺(tái):


shell腳本-用于跑自動(dòng)化框架輸出日志.png

項(xiàng)目Github地址:https://github.com/Keith-Yong/pyapiservice


客官請(qǐng)留步情萤!
點(diǎn)個(gè)贊??再走~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鸭蛙,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子筋岛,更是在濱河造成了極大的恐慌娶视,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件睁宰,死亡現(xiàn)場(chǎng)離奇詭異肪获,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)柒傻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)孝赫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人红符,你說(shuō)我怎么就攤上這事寒锚。” “怎么了违孝?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵刹前,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我雌桑,道長(zhǎng)喇喉,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任校坑,我火速辦了婚禮拣技,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘膏斤。我一直安慰自己徐绑,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布莫辨。 她就那樣靜靜地躺著盘榨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪山憨。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,255評(píng)論 1 308
  • 那天拒担,我揣著相機(jī)與錄音,去河邊找鬼低零。 笑死,一個(gè)胖子當(dāng)著我的面吹牛啃奴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播醋拧,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼逛尚!你這毒婦竟也來(lái)了绰寞?” 一聲冷哼從身側(cè)響起件缸,我...
    開(kāi)封第一講書(shū)人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤哩掺,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后飒筑,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绽昏,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年协屡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片全谤。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡肤晓,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出认然,到底是詐尸還是另有隱情补憾,我是刑警寧澤,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布卷员,位于F島的核電站盈匾,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏毕骡。R本人自食惡果不足惜削饵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望未巫。 院中可真熱鬧窿撬,春花似錦、人聲如沸橱赠。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)狭姨。三九已至,卻和暖如春苏遥,著一層夾襖步出監(jiān)牢的瞬間饼拍,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工田炭, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留师抄,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓教硫,卻偏偏與公主長(zhǎng)得像叨吮,于是被迫代替她去往敵國(guó)和親辆布。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359