test-express

test-express

接口自動化測試框架抛虏。采用 python3,基于 httprunner 開發(fā)芳悲。

特性

  • 繼承 Requests 的全部特性榛丢,輕松實現(xiàn) HTTP(S) 的各種測試需求
  • 測試用例與代碼分離,采用 YAML(推薦)/JSON 的形式描述測試場景彻况,保障測試用例具備可維護(hù)性
  • 測試用例支持分層機(jī)制谁尸,充分實現(xiàn)測試用例的復(fù)用
  • 測試用例支持參數(shù)化和數(shù)據(jù)驅(qū)動機(jī)制
  • 支持熱加載機(jī)制,在文本測試用例中輕松實現(xiàn)復(fù)雜的動態(tài)計算邏輯
  • 測試結(jié)果統(tǒng)計報告簡潔清晰纽甘,附帶詳盡統(tǒng)計信息和日志記錄

安裝

使用前良蛮,請先安裝相關(guān)依賴庫

pip3 install -r [項目根目錄]/requirments.txt

安裝檢驗

運行如下命令,若正常顯示版本號悍赢,則說明 HttpRunner 安裝成功决瞳。

$ hrun -V
>>> 2.5.7

約定

工作空間/項目 結(jié)構(gòu)

推薦結(jié)構(gòu)

- api # 接口描述文件
  - login_api.yml
  - get_nodes_api.yml
- testcases # 用例描述文件
  - get_nodes.yml
- testsuites # 套件描述文件
- debugtalk.py # 用于存放自定義函數(shù)
- .env # 用于配置環(huán)境變量
- data # 用于存放用例數(shù)據(jù)
  - account.csv
- reports # 存儲 html 測試報告

使用概述

使用步驟

  1. 根據(jù)接口和測試目的編寫用例描述文件(推薦yaml), like "get_nodes.yml"
  2. 執(zhí)行 yaml 文件
hrun /path/to/get_nodes.yml
  1. 拿到測試報告

每次運行完后,在當(dāng)前目錄的 reports 目錄下找到最新的 html 報告

  1. done.

如何編寫用例描述文件是重點

概念

開始編寫用例描述文件之前左权,有必要對相關(guān)概念作簡要說明皮胡。

  • 測試步驟
  • 測試用例
  • 測試套件

測試步驟(teststep)

對于接口測試來說,每一個測試步驟就對應(yīng)一個 API 的請求描述赏迟。

have a look

login_api.yml屡贺,登錄接口

name: login
base_url: ${ENV(BASE_URL)}
variables:
    expected_status_code: 200
    content_code: 0
    username: "visitor"
    password: "v123456"

request:
    method: POST
    url: /user/login/
    headers:
        Content-Type: "application/json"
    json:
        username: $username
        password: $password
validate:
    - eq: [status_code, $expected_status_code]
    - eq: [headers.Content-Type, application/json]
    - eq: [content.code, $content_code]
#    - len_eq: [content.token, 5]
    - contains: [content.data, "token"]
extract:
    token: content.data.token

測試步驟關(guān)鍵字說明

key required format description
name Yes string 測試步驟的名稱,在測試報告中將作為測試步驟的名稱
request Yes dict HTTP 請求的詳細(xì)內(nèi)容锌杀;可用參數(shù)詳見 python-requests 官方文檔
variables No list of dict 測試步驟中定義的變量甩栈,作用域為當(dāng)前測試步驟
extract No list 從當(dāng)前 HTTP 請求的響應(yīng)結(jié)果中提取參數(shù),并保存到參數(shù)變量中(例如token)糕再,后續(xù)測試用例可通過$token的形式進(jìn)行引用
validate No list 測試用例中定義的結(jié)果校驗項量没,作用域為當(dāng)前測試用例,用于實現(xiàn)對當(dāng)前測試用例運行結(jié)果的校驗
setup_hooks No list 在 HTTP 請求發(fā)送前執(zhí)行 hook 函數(shù)亿鲜,主要用于準(zhǔn)備工作
teardown_hooks No list 在 HTTP 請求發(fā)送后執(zhí)行 hook 函數(shù)允蜈,主要用戶測試后的清理工作

extract

支持多種提取方式

  • 響應(yīng)結(jié)果為 JSON 結(jié)構(gòu)冤吨,可采用.運算符的方式,例如headers.Content-Type饶套、content.success漩蟆;
  • 響應(yīng)結(jié)果為 text/html 結(jié)構(gòu),可采用正則表達(dá)式的方式妓蛮,例如blog-motto">(.*)</h2>

validate

斷言/驗證

"comparator_name": [check_item, expect_value]
short comparator description
eq equals 判斷實際結(jié)果和期望結(jié)果是否相等
lt less_than 判斷實際結(jié)果小于期望結(jié)果
le less_than_or_equals 判斷實際結(jié)果小于等于期望結(jié)果
gt greater_than 判斷實際結(jié)果大于期望結(jié)果
ge greater_than_or_equals 判斷實際結(jié)果大于等于期望結(jié)果
ne not_equals 判斷實際結(jié)果和期望結(jié)果不相等
str_eq string_equals 判斷轉(zhuǎn)字符串后對比 實際結(jié)果和期望結(jié)果是否相等
len_eq length_equals 判斷字符串或list長度
len_gt length_greater_than 判斷實際結(jié)果的長度大于和期望結(jié)果
len_ge length_greater_than_or_equals 實際結(jié)果的長度大于等于期望結(jié)果
len_lt length_less_than 實際結(jié)果的長度小于期望結(jié)果
len_le length_less_than_or_equals 實際結(jié)果的長度小于等于期望結(jié)果

hooks

  • setup_hooks 函數(shù)放置于 debugtalk.py 中怠李,并且必須包含三個參數(shù):
    • method: 請求方法,e.g. GET, POST, PUT
    • url: 請求 URL
    • kwargs: request 的參數(shù)字典
  • teardown_hooks 函數(shù)放置于 debugtalk.py 中蛤克,并且必須包含一個參數(shù):
    • resp_obj: requests.Response 實例

request 關(guān)鍵字

key required format description
base_url No string 測試用例請求 URL 的公共 host捺癞,指定該參數(shù)后,test 中的 url 可以只描述 path 部分
headers No dict request 中 headers 的公共參數(shù)构挤,作用域為整個用例
export No list 整個用例輸出的參數(shù)列表髓介,可輸出的參數(shù)包括公共的 variable 和 extract 的參數(shù); 在 log-level 為 debug 模式下,會在 terminal 中打印出參數(shù)內(nèi)

測試用例(testcase)

引用來自 wiki 的定義:

測試用例(testcase)應(yīng)該是為了測試某個特定的功能邏輯而精心設(shè)計的筋现,并且至少包含如下幾點:

  • 明確的測試目的(achieve a particular software testing objective)
  • 明確的輸入(inputs)
  • 明確的運行環(huán)境(execution conditions)
  • 明確的測試步驟描述(testing procedure)
  • 明確的預(yù)期結(jié)果(expected results)

在本框架中唐础,測試用例是測試步驟的 有序 集合。

get_nodes.yml矾飞,獲取 node 列表的用例

config:
    name: "get nodes"
    variables:
        username: "visitor"
        password: "v123456"
    base_url: ${ENV(BASE_URL)}

teststeps:
    - name: 第一步一膨,登錄
      api: api/maseeper/login_api.yml
      variables:
          expected_status_code: 200
          content_code: 0
      validate:
          - eq: ["status_code", $expected_status_code]
          - eq: [content.code, $content_code]
      extract:
          - token: content.data.token

    - name: 第二步,獲取 nodes
      api: api/maseeper/get_nodes_api.yml
      variables:
          token: $token
          username: $username
  • teststeps洒沦,測試步驟的有序集合
  • config豹绪,為文件內(nèi)的全局配置項

config 關(guān)鍵字說明

key required format description
name Yes string 用例名稱,作為報告中的標(biāo)題
parameters No list of dict 用于實現(xiàn)數(shù)據(jù)化驅(qū)動
variables No list of dict 定義的全局變量申眼,作用域為整個用例
request No dict request 的公共參數(shù)瞒津,常用參數(shù)包括 base_url 和 headers

變量空間作用域

  • 測試步驟的變量空間(context)會繼承或覆蓋 config 中定義的內(nèi)容;
    • 若某變量在 config 中定義了豺型,在某 test 中沒有定義仲智,則該 test 會繼承該變量
    • 若某變量在 config 和某 test 中都定義了,則該 test 中使用自己定義的變量值
  • 各個測試步驟(test)的變量空間相互獨立姻氨,互不影響钓辆;
  • 如需在多個測試步驟(test)中傳遞參數(shù)值,則需要使用 extract 關(guān)鍵字肴焊,并且只能從前往后傳遞

錄制生成測試套件

  1. 安裝 har2case;
# install
$ pip install har2case
# check
$ har2case -V
>>>0.2.1
  1. 將抓包工具拿到的數(shù)據(jù)包導(dǎo)出為 HAR 格式的文件前联,like: login.har。


    markdown-img-paste-20200421172254366.png
  2. 通過 har2case 將 har 文件 轉(zhuǎn)為 測試用例文件娶眷。

$ har2case docs/data/demo-quickstart.har -2y
INFO:root:Start to generate testcase.
INFO:root:dump testcase to YAML format.
INFO:root:Generate YAML testcase successfully: docs/data/demo-quickstart.yml

測試套件(testsuite)

測試用例集 是 測試用例 的 無序 集合似嗤,集合中的測試用例應(yīng)該都是相互獨立,不存在先后依賴關(guān)系的届宠。

config:
    name: "maseeper testsuite"
    variables:
        username: "visitor"
        password: "v123456
    base_url: ${ENV(BASE_URL)}

testcases:
    - name: "獲取 nodes"
      testcase: testcases/maseeper/get_nodes.yml
      variables:
          device_sn: $device_sn

    - name: "獲取 envs"
      testcase: testcases/maseeper/get_envs.yml
      variables:
          expected_status_code: 200
          content_code: 0
      parameters:
          expected_status_code: [200, 201]
          content_code: [0, 1, 2]
  • testcases烁落,測試用例的無序集合

parameters

參數(shù)化場景

當(dāng)前版本只支持 testsuite 層乘粒。

參數(shù)化后,parameters 中的變量將采用笛卡爾積組合形成參數(shù)列表伤塌,依次覆蓋 variables 中的參數(shù)灯萍,驅(qū)動測試用例的運行。

組織結(jié)構(gòu)

組織結(jié)構(gòu)涉及三個基礎(chǔ)概念:

  • 測試套件
  • 測試用例
  • 測試步驟
測試用例結(jié)構(gòu)

三者的關(guān)系

  • 測試套件包含多個/一個測試用例(YAML/JSON)
  • 一個測試用例包含多個/一個測試步驟(STEP)
  • 測試步驟對應(yīng)YMAL/JSON文件中的 teststeps 子項每聪,包含單個接口的全部內(nèi)容旦棉,包括發(fā)起請求,解析響應(yīng)結(jié)果药薯,校驗結(jié)果绑洛。

環(huán)境變量

終端環(huán)境變量

set

使用環(huán)境變量之前,需要先在系統(tǒng)中設(shè)置環(huán)境變量名稱和值童本,傳統(tǒng)的方式為使用 export 命令(Windows系統(tǒng)中使用 set 命令)

$ export UserName=admin
$ echo $UserName
admin

get

在程序中就可以對系統(tǒng)中的環(huán)境變量進(jìn)行讀取真屯。

$ python
>>> import os
>>> os.environ["UserName"]
'admin'

.env 環(huán)境變量

默認(rèn)情況下,在自動化測試項目的根目錄中巾陕,創(chuàng)建 .env 文件讨跟,并將敏感數(shù)據(jù)信息放置到其中,存儲采用 name=value 的格式鄙煤。

set

$ cat .env
UserName=admin
Password=123456
PROJECT_KEY=ABCDEFGH

get

在用例描述文件中 引用 .env文件中的變量。

${ENV(UserName)}

附錄

httprunner 手冊

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末茶袒,一起剝皮案震驚了整個濱河市梯刚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌薪寓,老刑警劉巖亡资,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異向叉,居然都是意外死亡锥腻,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進(jìn)店門母谎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瘦黑,“玉大人,你說我怎么就攤上這事奇唤⌒页猓” “怎么了?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵咬扇,是天一觀的道長甲葬。 經(jīng)常有香客問我,道長懈贺,這世上最難降的妖魔是什么经窖? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任坡垫,我火速辦了婚禮,結(jié)果婚禮上画侣,老公的妹妹穿的比我還像新娘冰悠。我一直安慰自己,他們只是感情好棉钧,可當(dāng)我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布屿脐。 她就那樣靜靜地躺著,像睡著了一般宪卿。 火紅的嫁衣襯著肌膚如雪的诵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天佑钾,我揣著相機(jī)與錄音西疤,去河邊找鬼。 笑死休溶,一個胖子當(dāng)著我的面吹牛代赁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播兽掰,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼芭碍,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了孽尽?” 一聲冷哼從身側(cè)響起窖壕,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎杉女,沒想到半個月后瞻讽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡熏挎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年速勇,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坎拐。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡烦磁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出廉白,到底是詐尸還是另有隱情个初,我是刑警寧澤,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布猴蹂,位于F島的核電站院溺,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏磅轻。R本人自食惡果不足惜珍逸,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一逐虚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧谆膳,春花似錦叭爱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至杨帽,卻和暖如春漓穿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背注盈。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工晃危, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人老客。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓僚饭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親胧砰。 傳聞我的和親對象是個殘疾皇子鳍鸵,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,851評論 2 361