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 測試報告
使用概述
使用步驟
- 根據(jù)接口和測試目的編寫用例描述文件(推薦yaml), like "get_nodes.yml"
- 執(zhí)行 yaml 文件
hrun /path/to/get_nodes.yml
- 拿到測試報告
每次運行完后,在當(dāng)前目錄的 reports 目錄下找到最新的 html 報告
- 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)鍵字肴焊,并且只能從前往后傳遞
錄制生成測試套件
- 安裝 har2case;
# install
$ pip install har2case
# check
$ har2case -V
>>>0.2.1
-
將抓包工具拿到的數(shù)據(jù)包導(dǎo)出為 HAR 格式的文件前联,like: login.har。
markdown-img-paste-20200421172254366.png 通過 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ǔ)概念:
- 測試套件
- 測試用例
- 測試步驟
三者的關(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)}