原文地址:https://sutune.me/2018/08/05/httprunner/
HttpRunner
簡介
HttpRunner 是一款面向 HTTP(S) 協議的通用測驗框架,只需撰寫維護一份 YAML/JSON 腳本,即可實作自動化測驗、性能測驗、線上監控、持續集成等多種測驗需求,
- 專案地址:https://github.com/HttpRunner/HttpRunner
- 中文手冊:http://cn.httprunner.org
框架流程

核心特性
- 繼承 Requests 的全部特性,輕松實作 HTTP(S) 的各種測驗需求
- 測驗用例與代碼分離,采用YAML/JSON的形式描述測驗場景,保障測驗用例具備可維護性
- 測驗用例支持分層機制,充分實作測驗用例的復用
- 測驗用例支持引數化和資料驅動機制
- 使用 skip 機制實作對測驗用例的分組執行控制
- 測驗請求支持完善的 hook 機制
- 支持熱加載機制,在文本測驗用例中輕松實作復雜的動態計算邏輯
- 基于 HAR 實作介面錄制和用例生成功能(har2case)
- 結合 Locust 框架,無需額外的作業即可實作分布式性能測驗
- 執行方式采用 CLI 呼叫,可與 Jenkins 等持續集成工具完美結合
- 測驗結果統計報告簡潔清晰,附帶詳盡統計資訊和日志記錄
- 具有可擴展性,便于擴展實作 Web 平臺化(HttpRunnerManager)
下載安裝
使用pip命令進行安裝
pip install httprunner
安裝后校驗是否安裝成功,可以使用如下命令進行校驗
hrun -V 1.4.2 har2case -V 0.1.8
若版本號正常顯示,則說明安裝正常,
入門使用
測驗場景
- 測驗介面:http://httpbin.org/get
- 介面型別:GET
用例設計
HttpRunner 的測驗用例支持兩種檔案格式:YAML 和 JSON,這里以YAML為例,
test_httpbin.yml
- config: name: httpbin api test request: base_url: http://www.httpbin.org - test: name: get request request: url: /get method: GET validate: - eq: [status_code,200]
config:作為整個測驗用例集的全域配置項test:對應單個測驗用例name這個test的名字request這個test具體發送http請求的各種資訊, 如下:url請求的路徑 (若config中有定義base_url, 則完整路徑是base_url + url)method請求方法 POST, GET等等validate完成請求后, 所要進行的驗證內容. 所有驗證內容均通過該test才算通過,否則失敗.
運行測驗
使用hrun執行測驗,如下所示:
C:\Users\Shuqing>hrun D:\api_test\HttpRunner_test\test_httpbin.yml get request INFO GET /get INFO status_code: 200, response_time(ms): 1967.35 ms, response_length: 273 bytes INFO start to validate. . ---------------------------------------------------------------------- Ran 1 test in 1.976s OK INFO Start to render Html report ... INFO Generated Html report: C:\Users\Shuqing\reports\1533092144.html
查看測驗報告
打開html報告如下:

HttpRunnerManager
簡介
HttpRunnerManager是基于HttpRunner的介面自動化測驗平臺,該工具是對 HttpRunner的包裝和Web圖形化, 另外還增加了一些新概念(專案/模塊)用來組織用例,
如果對yaml語法格式不熟悉,以及對于httprunner命令不熟悉的可以使用該平臺執行介面自動化測驗,
專案地址:https://github.com/HttpRunner/HttpRunnerManager
核心特性
- 專案管理:新增專案、串列展示及相關操作,支持用例批量上傳(標準化的HttpRunner json和yaml用例腳本)
- 模塊管理:為專案新增模塊,用例和配置都歸屬于module,module和project支持同步和異步方式
- 用例管理:分為添加config與test子功能,config定義全部變數和request等相關資訊 request可以為公共引數和請求頭,也可定義全部變數
- 場景管理:可以動態加載可參考的用例,跨專案、跨模塊,依賴用例串列支持拖拽排序和洗掉
- 運行方式:可單個test,單個module,單個project,也可選擇多個批量運行,支持自定義測驗計劃,運行時可以靈活選擇配置和環境,
- 分布執行:單個用例和批量執行結果會直接在前端展示,模塊和專案執行可選擇為同步或者異步方式,
- 環境管理:可添加運行環境,運行用例時可以一鍵切換環境
- 報告查看:所有異步執行的用例均可在線查看報告,可自主命名,為空默認時間戳保存,
- 定時任務:可設定定時任務,遵循
crontab運算式,可在線開啟、關閉,完畢后支持郵件通知 - 持續集成:jenkins對接,開發中,,,
下載安裝
-
安裝mysql資料庫服務端(推薦5.7+),并設定為utf-8編碼,創建相應
HttpRunnerManager資料庫,設定好相應用戶名、密碼,啟動mysql, -
將HttpRunnerManager下載下來,解壓放在任意盤符位置,例如我放在D盤根目錄,并重命名為
HttpRunnerManager
環境配置
HttpRunnerManager支持分布式執行,模塊和專案執行可選擇為同步或者異步方式,因此需要安裝相關依賴工具,
erlang
Erlang是一種通用的面向并發的編程語言,它由瑞典電信設備制造商愛立信所轄的CS-Lab開發,目的是創造一種可以應對大規模并發活動的編程語言和運行環境,
下載地址:http://www.erlang.org/downloads
Rabbitmq
RabbitMQ 是一個由 Erlang 語言開發的 AMQP(高級訊息佇列協議)的開源實作,它支持多個訊息傳遞協議,RabbitMQ可以部署在分布式和聯合配置中,以滿足高規模、高可用性的需求,另外安裝rabbitmq需要先安裝erlang,
下載地址:http://www.rabbitmq.com/download.html 下載后雙擊rabbitmq-server-3.7.7.exe檔案進行安裝,
安裝完成后如下圖如所示,選中RabbitMQ Service -start 然后以管理員身份運行,

可以通過訪問 http://localhost:15672 進行測驗,默認的登陸賬號為:guest,密碼為:guest,

相關資料:RabbitMQ Windows環境安裝官方手冊
資料庫配置
打開HttpRunnerManager專案的setting.py檔案,進行如下配置
if DEBUG: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'HttpRunnerManager', # 新建資料庫名 'USER': 'root', # 資料庫登錄名 'PASSWORD': '', # 資料庫登錄密碼 'HOST': '127.0.0.1', # 資料庫所在服務器ip地址 'PORT': '3306', # 監聽埠 默認3306即可 } } STATICFILES_DIRS = ( os.path.join(BASE_DIR, 'static'), # 靜態檔案額外目錄 ) else: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'HttpRunnerManager', # 新建資料庫名 'USER': 'root', # 資料庫登錄名 'PASSWORD': '', # 資料庫登錄密碼 'HOST': '127.0.0.1', # 資料庫所在服務器ip地址 'PORT': '3306', # 監聽埠 默認3306即可 } } STATIC_ROOT = os.path.join(BASE_DIR, 'static')
work配置
修改work配置
djcelery.setup_loader() CELERY_ENABLE_UTC = True CELERY_TIMEZONE = 'Asia/Shanghai' BROKER_URL = 'amqp://guest:[email protected]:5672//' if DEBUG else 'amqp://guest:[email protected]:5672//' CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler' CELERY_RESULT_BACKEND = 'djcelery.backends.database:DatabaseBackend' CELERY_ACCEPT_CONTENT = ['application/json'] CELERY_TASK_SERIALIZER = 'json' CELERY_RESULT_SERIALIZER = 'json' CELERY_TASK_RESULT_EXPIRES = 7200 # celery任務執行結果的超時時間, CELERYD_CONCURRENCY = 1 if DEBUG else 10 # celery worker的并發數 也是命令列-c指定的數目 根據服務器配置實際更改 一般25即可 CELERYD_MAX_TASKS_PER_CHILD = 100 # 每個worker執行了多少任務就會死掉,我建議數量可以大一些,比如200 EMAIL_SEND_USERNAME = '[email protected]' # 定時任務報告發送郵箱,支持163,qq,sina,企業qq郵箱等,注意需要開通smtp服務 EMAIL_SEND_PASSWORD = 'XXX' # 郵箱密碼
樣式檔案更新
由于該專案已經停止更新維護,導致部分樣式css檔案地址失效,
修改HttpRunnerManager\templates 下的base.html檔案
第23行,需要修改一下
#將這行代碼進行更新 <link rel="stylesheet" href=https://www.cnblogs.com/software-test-Python/p/"http://cdn.amazeui.org/amazeui/2.7.2/css/amazeui.min.css"/> #更新后的代碼 <link rel="stylesheet" href=https://www.cnblogs.com/software-test-Python/p/"http://cdn.bootcss.com/amazeui/2.7.2/css/amazeui.min.css"/>
安裝依賴庫檔案
打開cmd命令視窗,切換到HttpRunnerManager目錄,然后執行下面命令,自動安裝需要的依賴庫檔案,
pip install -r requirements.txt
資料庫遷移
python manage.py makemigrations ApiManager #生成資料遷移腳本 python manage.py migrate #應用到db生成資料表
創建超級用戶,用戶后臺管理資料庫,并按提示輸入相應用戶名,密碼,郵箱,
python manage.py createsuperuser
啟動服務
輸入下面命令啟動服務
python manage.py runserver
服務啟動成功之后,打開如下地址,可以進入到不同的頁面,
- 注冊: http://127.0.0.1:8000/api/register/

- 登錄: http://127.0.0.1:8000/api/login/

- 后臺資料庫管理:http://127.0.0.1:8000/admin/

注冊登錄之后就可以看到平臺的界面,接下來就可以創建介面測驗的專案和用例了,

HttpRunnerManager 入門使用
創建專案
在首頁點擊左側選單欄新增專案,然后輸入專案相關資訊,我們接下來將會以httpbin里面的介面來進行測驗,所以專案名稱命名為:httpbin介面測驗

創建模塊
一個專案會一般分為多個功能模塊,我們可以創建不同模塊,然后基于不同模塊創建測驗用例,
在左側選單選擇模塊管理 然后點擊新增模塊,接下來輸入模塊資訊, 這里我們創建一個模塊:HTTP_Methods

創建環境
在介面測驗程序中,我們有時需要設定base_url來提高用例撰寫執行效率,我們可以在系統設定中的運行環境來創建,例如我們創建一個base_url操作程序如下圖所示:

創建用例
這里以下面介面為例創建用例:
http://www.httpbin.org/get #請求方式為GET
點擊頂部快捷入口新增用例 然后在用例編輯視窗切換到request來編輯用例,操作步驟如下:

如上圖演示所示,用例名稱為test_get_request 用例要歸屬到專案和具體的模塊
運行測驗
如下圖所示,點擊用例測驗的運行圖示,然后選擇運行環境即可執行用例,執行完成之后會自動生成測驗報告,可以查看運行的結果,

以上我們就完成了單個介面的簡單測驗,接下來我們要進一步完善用例,
HttpRunnerManager 用例配置
header設定
如果想自定義header資訊,則可以在用例編輯界面點擊add headers,然后配置header資訊,操作如下圖所示:

請求引數
URL引數
在GET請求中,經常會有在URL中的引數,也就是Query String Parameters 比如在用例 test_get_request 增加一個引數 user=51zxw 操作程序如下:

body引數
在Post請求中,請求引數一般放在請求體Request body中,HttpRunner支持form-data和json兩種資料格式來傳遞引數,
這里我們的測驗介面如下:請求型別為POST
http://httpbin.org/post
form-data
首先創建用例名稱為test_post_formdata 用例編輯界面Type選擇data,然后點擊add data按鈕,在下面表單中輸入引數名稱和值即可,操作程序如下:

json
傳遞Json引數與form-data方法類似,選擇Type時選Json 創建用例test_post_jsondata操作流程如下:

獲取回傳結果
HttpRunnerManager提供了extract功能來從回傳結果中提取我們需要的內容,例如前面用例test_get_request執行之后回傳結果如下:
{ "args": { "user": "51zxw" }, "headers": { "Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Connection": "close", "Host": "httpbin.org", "User-Agent": "python-requests/2.18.4", "User-Headers": "zxw2018" }, "origin": "110.52.4.234", "url": "http://httpbin.org/get?user=51zxw" }
如果我們想提取user值放在一個變數里面,那么可以使用extract來提取,在用例編輯界面點擊extract/validate標簽,然后點擊add extract按鈕,進行如下配置即可:

其中Key的值response_user就是將回傳值存盤的變數名,content.args.user表示從回傳內容中提取args屬性中的user值,下一步在斷言設定中,我們可以驗證是否獲取正確,
斷言設定
結合前面提取回傳值的內容,我們設定斷言驗證回傳的user值是否和我們預期的一樣,首先點擊add validate 然后可以進行如下設定:

上面的$response_user表示參考我們之前設定的獲取回傳值的變數,Comparator表示匹配規則,匹配規則有很多可以點擊下拉選單查看 Expected值表示我們的期望值,
執行用例之后,我們可以看到在測驗報告中,斷言驗證是通過的,

當然如果還想添加其他斷言規則,就繼續點擊add validate 例如設定驗證回應狀態碼為200可以進行如下設定

注意:200數值型別為int
用例組合
有時候我們想把一些單個的介面按照指定順序組合成為一個業務邏輯模塊,比如用戶模塊,把用戶注冊、用戶登錄,用戶退出幾個用例封裝成一個業務邏輯模塊,從而形成接分層測驗,
實踐案例:
將之前的三個用例test_get_request,test_post_formdata、test_post_jsondata封裝為一個用例test_method_group 然后執行test_method_group,具體操作如下:

從圖中我們可以看出新建一個用例test_method_group,然后可以自由添加單個介面用例,并且可以自由調整用例執行順序,以及刪減用例,
注意:新建組裝的用例時, 只能選擇單請求的用例進行拼接, 不可選擇已組裝過的用例,例如再新建一個用例,把
test_method_group放進去是不行的,
只能選擇包含”不包含別的用例的用例”,
測驗計劃
測驗套件
測驗套件(test suite)和我們上面講的組合用例類似,我們可以把單個用例按照業務邏輯進行組合運行,和組合用例不同的是:測驗套件可以包含組合用例,但是組合用例不能包含組合用例,
測驗套件是對測驗用例的更高一層的封裝,
實踐案例
創建測驗用例集suite_test_methods 包含測驗用例test_get_request和組合用例test_method_group 然后執行查看結果,
操作程序如下:

從上圖中我們可以看到創建的測驗套件成功執行,加載的測驗套件也可以任意調整執行順序,相關的資料配置會自動從用例的配置中讀取,無需再單獨配置引數,
上面我們選擇的是同步執行方式,我們可以選擇異步執行方式,可以在后臺執行,然后生成測驗報告,

在異步執行之前我們需要先啟動支持異步的相關服務:
1.啟動RabbitMQ Server
2.進入到HttpRunnerManager目錄,啟動worker
1
|
python manage.py celery -A HttpRunnerManager worker --loglevel=info
|
3.啟動任務監控后臺
1
|
celery flower
|
celery簡介
Celery是一個異步任務佇列/基于分布式訊息傳遞的作業佇列,它側重于實時操作,但對調度支持也很好,Celery用于生產系統每天處理數以百萬計的任務,Celery是用Python撰寫的,但該協議可以在任何語言實作,它也可以與其他語言通過webhooks實作,
執行完成之后我們可以在【報告管理】——【查看報告】中看到生成的測驗報告,

擴展資料:Python 并行分布式框架 Celery
定時任務
測驗套件還支持定時任務,這樣方便進行回歸測驗,
定時任務需要啟動定時任務監聽器,具體如下:
1
|
python manage.py celery beat --loglevel=info
|
平臺界面設定步驟為:點擊選單欄左側【測驗計劃】-【定時任務】 進入到【系統設定】界面,可以進行如下設定:

上面定時配置 */10 * * * * 表示每10分鐘執行一次,使用的是crontab運算式
執行結果如下圖所示,可以看到是每隔10分鐘執行一次,

crontab格式
通過crontab 命令,我們可以在固定的間隔時間執行指定的系統指令或 shell script腳本,時間間隔的單位可以是分鐘、小時、日、月、周及以上的任意組合,
分 時 日 月 星期
- 第1列分鐘0~59
- 第2列小時0~23(0表示子夜)
- 第3列日1~31
- 第4列月1~12
- 第5列星期0~7(0和7表示星期天)
crontab設定案例
每隔1分鐘執行一次
1
|
* * * * *
|
每30分鐘運行一次:
1
|
*/30 * * * *
|
每隔1小時執行一次
1
|
* */1 * * *
|
每周一到周五早上八點運行
1
|
* 8 * * 1-5
|
相關資料:crontab運算式
注意
如果遇到如下報錯:
1
|
D:\HttpRunnerManager>python manage.py celery beat --loglevel=info
|
進入到HttpRunnerManager目錄,然后洗掉celerybeat.pid檔案,重啟命令即可,
配置管理
前面我們用例的各個引數都是配置在各自用例之中的,如果引數有變化則需要打開對應請求用例來修改,當用例數量較多時,這樣操作會比較低效,那么該如何有效解決這個問題呢?
使用HttpRunnerManager的配置管理工具就可以比較好的解決這個問題,我們可以將一些公共的變數,引數、方法、請求頭資訊都存盤在一個配置模塊中,這樣維護和使用就非常便利,
支持的配置型別包括以下幾類:
Variables變數型別Parameters引數型別Hooks方法型別Request請求型別
點擊選單欄左側的配置管理 然后點擊新增配置 或者直接頂部新增配置快捷入口,就可以創建配置,
這里演示Variables和Parameters配置
variable配置
如下圖所示:創建公共變數com_user 值設為zxw2018 操作程序如下:

變數創建完成之后,接下來要參考這個公共變數,在用例test_get_request和test_post_formdata分別添加公共變數com_user,配置如下:

最后開始參考配置,在用例test_method_group中參考該配置,然后運行即可,操作程序如下:

從上圖可以看出,我們設定的配置變數已經在用例生效,下次想修改變數值,只需要修改配置就可以了,
注意:
當用例1關聯了配置(config)1, 用例2關聯了配置(config)2 時,
現在新建一個用例3, 將用例1和用例2都組合進用例3中, 并且用例3關聯配置(config)3,
此時執行用例3, 配置(config)1 和 配置(config)2 會被使用么?
答案是不會, 執行用例3時, 只有配置(config)3 會被使用. 在執行的程序中, 用例1和用例2所要參考的變數, 都只會去配置(config)3中找,
Parameters配置
對用例中的某些請求引數, 有時想要測驗多種輸入情況, 可以為每種情況都撰寫獨立的用例或配置. 但是這樣會比較麻煩, 另一種方式是將原來的variables變數定義改為Parameters引數串列來定義. 這個串列中定義需要傳入的引數. 然后使用這些引數分別執行一次,也就是引數化,
案例1——單個引數設定
針對用例test_get_request 設定引數para_user 分別取值為[‘zxw2016’,'zxw2017','zxw2018']針對這三個不同的引數來進行介面測驗,

配置好之后,接下來點擊用例test_get_request 然后添加引數配置,操作如下所示:

從上圖我們可以看出,用例遍歷執行了我們設定的三個引數,
案例2——多個引數
對于同時存在多個引數串列, 則需要對其排列組合的每一種情況都執行一次,也就是笛卡爾乘積
例如有xx和yy兩組引數,對應的變數分別如下
1
|
xx : [xxvalue1, xxvalue2]
|
那么最侄訓按以下六種情況各執行一次用例:
1
|
xx=xxvalue1, yy=yyvalue1
|
所以, 當對多個變數使用parameters引數串列時, 特別需要事先考慮清楚用例將會被回圈的次數. 避免不必要的測驗時間的消耗.
例如在配置表中我們再增加一個引數para_pwd 取值為['666', '888']

然后在用例中參考變數para_pwd

最后執行的結果為6次,

引陣列合為:
1
|
zxw2016,666
|
配置引數的作用域
當組合用例中的單個用例參考了配置引數,那么該組合用例下所有的用例都會按照引陣列合來執行對應的次數,
例如在test_method_group中用例test_get_request參考了配置引數,那么所有的用例都會執行6次(上面案例中para_user和para_pwd的笛卡爾積),總共為3*6=18次,

這樣帶來一個問題也就是有些沒有設定引數的用例也會重復運行,這對整體運行效率會有比較大的影響,
如果只想針對指定的用例遍歷設定的引數,那么需要將引數配置在用例中,而不是在公共配置模塊中,
例如在用例test_get_request配置引數para_user 取值為['zxw2016', 'zxw2017', 'zxw2018'] 同時洗掉之前配置模塊的對應的引數,以及參考的引數,

然后執行用例集test_method_group,那么test_get_request會根據設定的三個不同引數運行3次,其他兩個介面運行1次,
鍵值對引數
對于引數間有對應關系的(如用戶名:密碼)可以按如下方式定義, 這樣就避免了無效的排列組合:
1
|
xx-yy: [[xxvalue1,yyvaule1], [xxvalue2,yyvalue2]]
|
組合結果:
1
|
xx=xxvalue1, yy=yyvalue1
|
在使用多個賬戶/密碼進行測驗時, 常用這種方式.
例如在用例test_post_formdata中配置如下引數
1
|
#用戶名密碼組合
|
在用例中進行如下配置


運行測驗用例:

從運行的報告中我們可以看到,引數按照我們設定的運行,
HttpRunnerManager進階應用
自定義輔助函式
在一些比較特殊的介面測驗程序中,有時需要做一些比較復雜的邏輯處理,比如加解密,針對這些介面我們需要撰寫一些輔助函式來完成測驗,
案例:介面引數md5加密
測驗登錄介面:http://httpbin.org/post,引數除了user和passwd還需要一個sign引數sign生成規則為用戶名+密碼然后進行md5加密,
在專案管理選單欄中點擊debugtalk.py 然后編輯如下代碼:
1
|
# debugtalk.py
|
上面代碼代表根據用戶名密碼生成md5摘要資訊,并回傳結果,
創建用例test_getSign 配置如下:


從上面的配置可以看出,方法參考格式為:${function($para)}
運行結果如下:

從上面的報告可以看出,sign的值引數為md5演算法生成的結果,
Hook
有些介面測驗前后需要進行一些特殊的處理,比如初始化操作或者執行完成之后等待操作,
相當于unittest中的setUp和tearDown方法,HttpRunner也支持類似于這樣的方法,其中Hook功能就支持這樣的操作,
setup_hooks: 在 HTTP 請求發送前執行 hook 函式,主要用于準備作業;也可以實作對請求的 request 內容進行預處理,teardown_hooks: 在 HTTP 請求發送后執行 hook 函式,主要用于測驗后的清理作業;也可以實現對回應的 response 進行修改,例如進行加解密等處理,
實踐案例
設定介面請求之后如果回應狀態碼為200就等待0.1s 否則就按照設定的時間等待,
在 debugtalk.py 創建輔助函式sleep() 定義如下:
1
|
import time
|
然后在用例test_get_request中進行設定${time($response,2)}即可,
任務監控
任務監控可以查看節點的狀況(包括處理的佇列資訊等)和task的執行情況
Tips:這里需要做一個小小的修改,因為作者把地址配置按照他自己的運行環境寫死了,修改方式為:打開檔案D:\HttpRunnerManager\templates\base.html
將192.168.91.45修改為:127.0.0.1
1
|
<!-- <li><a href="http://192.168.91.45:5555/dashboard">任 務 監 控</a></li>-->
|
設定好之后打開即可看到如下頁面:

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/262822.html
標籤:其他
下一篇:一分鐘了解自動化測驗
