一:Httprunner簡介
Httprunner是一款面向Http和HTTPS協議的通用測試框架,只需編寫維護一份YAML/JSON腳本即可實現自動化測試、性能測試、線上監控、持續集成等多種測試需求,是基於關鍵字驅動的框架,基於Har實現接口錄制和用例生成公告。
Httprunner支持python3.5及以上的所有版本,雖然Httprunner暫時保留了對python2.7的兼容支持,但是強烈推薦使用python3.6及以上版本。
二:Httprunner安裝
2.1 安裝指令
pip install httprunner
2.2檢查是否安裝成功
查看httprunner版本
hrun -V
3.1.6
顯示出版本號,說明安裝成功。
你也可以通過輸入:hrun -h,查看命令幫助說明。
除此之外,httprunner系統還有4個常用的指令:
- httprunner:核心命令,用於所有函數
- hrun:是httprunner的縮寫,功能與httprunner完全相同,用於運行YAML/Json/pytest測試用例
- hmake:是httprunner make的別名,用於將yaml和json測試用例轉換成pytest文件
- har2case:輔助工具,可以將HAR格式(HTTP Archive)文件轉換成yaml或者json格式的測試用例
三:快速創建Httprunner項目
3.1 快速生成項目
輸入httprunner startproject -h查看基本的幫助命令
httprunner startproject -h
創建項目命令
httprunner startporject 項目名稱
項目生成完畢,是不是非常的簡單
如果你輸入的項目名稱已經存在,httprunner會給出warning提示。
3.2 項目結構梳理
- har:是用於存放錄制導出的.har文件
- reports:存放html測試報告
- testcases:是用於存放測試用例
- .env:項目的全局環境變量的管理文件
- .gitignore:git版本管理文件配置
- debugtaik.py:存儲項目中邏輯運算輔助函數,該文件存在時,將作為項目根目錄定位標記,其所在目錄即被視為項目工程根目錄,該文件不存在時,運行測試的所在路徑(CWD)將被視為項目工程根目錄
四:生成測試用例
使用Google瀏覽器導出HAR
以https://postman-echo.com/get?test=123為例,我們使用Google瀏覽器F12(開發者工具導出HAR)
1,使用瀏覽器打開上面的網址,然后按F12打開瀏覽器的開發者工具:
2,點擊網絡(Network),選擇下面的全部(All),就可找到當前的請求信息,如果沒法發現,請刷新頁面,請求就會出現在列表中
3,右擊目標請求,選擇全部另存為HAR
4.1 har2case轉為yml格式文件
har2case 文件名.har -2y
4.2 har2case轉為json格式文件
har2case baidu.har -2j
4.3 har2case轉為pytest格式文件
#轉換為pytest格式文件 har2case 文件名.har
4.4 httprunner make轉為pytest格式文件
make 是把 YAML/JSON 測試用例轉成 pytest用例, 需指定 yaml 文件路徑或文件夾路徑
hmake 文件名 #或者 httprunner make 文件名
五:運行測試用例
#運行整個項目的用例,需要在目錄的上級路徑進行運行 hrun 項目名
hurn + case路徑
#指定運行某個路徑下的用例,-s可以查看請求的詳細信息 hrun ./testcases/test_har.yml -s #運行並生成html報告 hrun ./testcases/test_har.yml --html=report.html #也可以生成pytest的allure報告,需要下載allure-pytest庫以及allure插件並配置環境變量,具體可以百度 pip install allure-pytest #步驟一,運行用例生成allure報告內容 hrun ./testcases/test_har.yml --alluredir=./reports/tmp #步驟二,根據收集的內容再生成allure報告html文件 allure generate ./reports/tmp -o allure-report --clean # --clean是為了清空已有的測試報告; -o allure-report 是指定清空測試報告的文件allure-report
5.1運行多個測試用例
hrun 項目名稱
#或者
hrun 后面多個case路徑,case之間用空格隔開
hrun 項目名稱:命令等價於httprunner run 項目名稱,其中先進行httprunner make json/yml,會將json/yml文件先轉換為pytest文件,之后再執行hrun(httprunner run),如果pytest文件是已經存在的(直接編寫的pytest文件,而不是yml或者json),httprunner會直接運行你的pytest腳本,不需要進行轉換,官方推薦:直接使用pytest腳本編寫。
在tacecases目錄下生成了三個py文件,生成的py文件會加上_test后綴,如果yml或者json文件有修改,需要再次http make scriptPath一下,或者直接修改py文件。
還生成了logs日志文件,每一個yml都會對應生成一個日志文件,每一個testcase腳本都會又要給唯一的id,對應了日志文件的文件名。
5.2 運行單個測試用例
5.3 使用pytest命令運行測試用例
pytest 項目名稱(前提,已經使用hrun 項目寧名稱生成了yml或json對應的pytest文件,否則不生效)
六:測試用例解析以及配置config
import sys from pathlib import Path sys.path.insert(0, str(Path(__file__).parent.parent)) from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase from httprunner_demo.testcases.demo_testcase_request_test import ( TestCaseDemoTestcaseRequest as DemoTestcaseRequest, ) class TestCaseDemoTestcaseRef(HttpRunner): config = ( Config("request methods testcase: reference testcase") .variables( **{ "foo1": "testsuite_config_bar1", "expect_foo1": "testsuite_config_bar1", "expect_foo2": "config_bar2", } ) .base_url("https://postman-echo.com") .verify(False) ) teststeps = [ Step( RunTestCase("request with functions") .with_variables( **{"foo1": "testcase_ref_bar1", "expect_foo1": "testcase_ref_bar1"} ) .call(DemoTestcaseRequest) .export(*["foo3"]) ), Step( RunRequest("post form data") .with_variables(**{"foo1": "bar1"}) .post("/post") .with_headers( **{ "User-Agent": "HttpRunner/${get_httprunner_version()}", "Content-Type": "application/x-www-form-urlencoded", } ) .with_data("foo1=$foo1&foo2=$foo3") .validate() .assert_equal("status_code", 200) .assert_equal("body.form.foo1", "bar1") .assert_equal("body.form.foo2", "bar21") ), ] if __name__ == "__main__": TestCaseDemoTestcaseRef().test_start()
每個測試用例都是Httprunner的子類,並且必須包含config和teststeps兩個屬性。
6.1 config屬性
配置testcas級別的config,它包含base_url
、name
、verify
、variables
、export
;
- name(必需):testcase的一部分,會顯示在測試報告以及運行的日志中;
- base_url((可選):功能路徑,url的一部分,比如:http//www.woshipm.com/,如果設置了base_url的話,在testcase中的url中只能設置相對路徑。如果需要切換不同的環境的話,該功能是很有用的;
- variables(可選):testcase通用變量,每個step中都可以引用沒有在step中設置的變量。換句話說,step中設置的變量的級別比在config中設置的變量級別更高;
- verify(可選):指定是否驗證服務器的TLS證書,如果想要記錄testcase中的http數據特別有用,如果不設置或者設置為True則會產生SSLError錯誤
- export(可選):提取testcase的session變量,測試用例是為黑盒,config中的variables是輸入部分,export則為輸出部分,特別是當一個測試用例在另一個測試用例的步驟中被引用,並且將被提取一些會話變量用於后續測試步驟中,則提取的會話變量應在配置export部分中進行配置。將測試用例的某些變量指定為全局變量。(PS:不配置export,在另一個引用類中進行該類的變量調用時,直接export也是可以的,不過最好還是配置一下)。
6.2 teststeps屬性
每一個testcase中包括一個或者多個排序的steps
列表(List[Step]
),每個step
相當於一個api
請求(request
)或者testcase
的引用,step的先后順序,有step的前后控制,由step所處的位置由上到下執行。此外還支持variables/extract/validate/hooks
機制實現更為復雜的場景。
RunRequest(名稱)
RunRequest在一個測試步驟中用於向API發送請求,並為一些響應作出一些提取和驗證。
name
RunRequest的參數name作為step的名字,將會在測試報告和運行的日志中顯示。
.with_variables()
指定測試步驟中所需的變量,每個測試步驟中的測試變量都是相互獨立的。因此,如果要在多個測試步驟中共享變量,則需要在配置變量config中定義變量。此外,步驟變量將會覆蓋配置變量中具有相同名稱的變量。(PS:參數的傳遞格式使用**{},同時需要關鍵字參數解包的方式進行參數傳遞給.with_variables),參數引用使用“$變量名稱”,如果是函數引用使用“${函數名稱()}”
method(url)
指定http請求方法的url,它對應於requests.request的方法和URL參數。如果配置中設置了base_url,則此處只能設置相對路徑,可選參數為get/post/put/delete/等。
.with_params()
指定request url的參數,相當於requests.request中的params參數的數據
.with_headers()
為請求指定http的請求頭,相當於requests.request中的headers參數的數據
.with_cookies()
為請求指定hettp的cookie的值,相當於requests.request中的cookies參數的數據
.with_data()
指定request的http body。相當於requests.request的data參數部分。
.with_json()
指定request的http json。相當於requests.request的json參數部分。
.extract()
使用jmespath提取json 應答數據:
.with_jmespath(jmes_path:Text, var_name:Text)-->jmes_path: jmespath表達式,可以參考https://jmespath.org/tutorial.html做詳細了解;var_name: 存儲提取值的變量名,該變量可以被后續的steps中直接使用。
注意:由此可見httprunner在提取返回對象時,都是使用關鍵字.extract(),在提取返回對象有兩種方法分別是通過content.key和content.int提取。httprunner里面的content實際上就是request里面的r.content,返回的是一個byte類型。
如果返回的json數據類型,用content.key取出對應的values:
{ "code":0, "msg": "login success!", "username": "test", "token": "b3f7e8e12d23591ea671374dee818c63b1599d4d" }
上面的json數據,可以轉成python里面對應的dict類型,extract提取方法:
- content.code 取出code后面對應的值 0
- content.msg 取出msg后面的對應值“login success!”
- content.username 取出username后面的值"test"
- content.token 取出token值
如果返回的是list數據類型,用content.int方式取出對應下標的數據
[{ "age":18, "name":"zhangsan" }, { "age":20, "name":"lisi" }]
上面這種轉化成python里面的list對象,可以用content.int 方法取出對應下標的數據,對應的extract提取方法
- content.0 取出第一組數據{"age":18, "name":"zhangsan"}
- content.0.name 取出第一組數據name的對應值 "zhangsan"
- content.1 取出第二組數據{"age":20, "name":"lisi"}
- content.1.age 取出第二組數據age的對應值 20
.validate()
使用jmespath提取json應答數據,並使用.assert_xxx(jmes_path:Text, expected_value:Any)驗證期望值。其中jmes_path表示jmespath表達式; expected_value為預期值,變量或者函數表示。如下圖:
RunTestCase()
在step中用RuntestCase來調用另一個testcase。
name
參數name是用來表示testcase的名稱,會在測試報告和測試運行的日志中顯示
.with_variable()
指定測試步驟變量。每個步驟的變量都是獨立的,因此,如果要在多個步驟中共享變量,則應在配置變量中定義變量。此外,步驟變量將覆蓋配置變量中具有相同名稱的變量。
.call()
指定引用測試用例的類,在引用另一個測試用例的step中的參數時,需要先指定引用的測試用例類
.export ()
指定會話變量名稱以從引用的測試用例中導出,導出的變量可以在后續的測試步驟step中引用,導出的是step中jmespath提取的變量。export導出后,該變量是全局變量,但是不能在config中進行設置,因為測試類的引用是在step中進行的,而類的初始化是先在config中進行初始化的,然后再在teststeps中初始化,所以參數的傳遞在step之間進行
七:.env文件介紹
.env文件中可以存放全局變量文件,在config和teststeps中都可以調用
7.1 httprunner腳手架會默認創建.env文件,並將需要設置為環境變量或者是全局變量的數據存放在.env文件中(推薦變量名需要大寫)
7.2 使用${ENV(變量名)}調用環境變量
八:debugtalk.py介紹
debugtalk.py和pytest中的conftest.py文件還是有區別的,首先在conftest.py文件中的定義對當前文件同級目錄下以及同級目錄下的子目錄下的腳本生效,而debugtalk.py文件是按照httprunner腳手架默認自動生成的,只對同級testcases目錄下的腳本生效,如果需要把testcases目錄下腳本細分,並創建新的模塊目錄,然后在里面添加測試腳本,此時debutalk.py是無法生效的(ps:Httprunner版本3.1.6是同樣生效的)
8.1 創建debugtalk.py文件,編寫好腳本
8.2 將腳本中的方法引用到其他處,格式"${方法名}",即能實現參數化
執行結果:
九:httprunner的setup和teardown及hook
unittest框架里面有個非常好的概念:前置( setup
)和后置( tearDown
)處理器。
HttpRunner 實際上也是從用的unittest框架,里面也有前置 setup_hooks
和后置 teardown_hooks
的概念。
- setup_hooks: 在整個用例開始執行前觸發 hook 函數,主要用於准備工作。
- teardown_hooks: 在整個用例結束執行后觸發 hook 函數,主要用於測試后的清理工作。
hook 機制分為兩個層級:測試用例層面(testcase)、測試步驟層面(teststep)
9.1 測試步驟層面
#hooks_test.py from httprunner import HttpRunner,Config,RunRequest,Step class TestCaseHooks(HttpRunner): config = ( Config("測試步驟層面執行hook鈎子函數") .base_url("${ENV(BASE_URL)}") .verify(False) ) teststeps = [ Step( RunRequest("測試步驟層面執行hook鈎子函數") .with_variables( **{"foo1": "bar11", "foo2": "bar21", "sum_v": "${sum_two(3, 2)}"} ) #setup_hooks: 在整個用例開始執行前觸發 hook 函數,主要用於准備工作, # 傳入參數$request獲取請求信息詳情 .setup_hook("${setup_hook_prepare_kwargs($request)}") .get("/get") #teardown_hooks: 在整個用例結束執行后觸發 hook 函數,主要用於測試后的清理工作 #傳入參數$reponse 可以接收到響信息詳情 .teardown_hook("${teardown_hook_sleep_N_secs($response,1)}") .with_headers(**{"User-Agent": "HttpRunner/${get_httprunner_version()}"}) .with_params(**{"foo1": "$foo1", "foo2": "$foo2", "sum_v": "$sum_v"}) .extract() .with_jmespath("body.args.foo2", "foo3") .validate() .assert_equal("status_code", 200) .assert_equal("body.args.foo1", "bar11") .assert_equal("body.args.sum_v", "5") .assert_equal("$foo3", "bar21") ) ] if __name__ == '__main__': TestCaseHooks().test_start()
#debugtalk.py import time from httprunner import __version__ #可以實現根據請求方法和請求的content-Type,來對請求的 data 進行重新加工 def setup_hook_prepare_kwargs(requesr): ''' :param requesr: 接口的請求信息 :param paramas: 傳入是參數 :return: ''' # print(f'參數data:{data}') print(f'發送請求前信息:{requesr}') # 根據接口響應的狀態碼來進行不同時間的延遲等待。 def teardown_hook_sleep_N_secs(response, n_secs): """ sleep n seconds after request """ print(f'獲取響應信息:{response.text}') if response.status_code == 200: time.sleep(0.1) # 修改返回信息 response_data = response.text print(type(response_data)) else: time.sleep(n_secs) # 當我們需要先對響應內容進行處理(例如加解密、參數運算),再進行參數提取(extract)和校驗(validate)時尤其有用 # 將響應結果的狀態碼和 headers 進行了修改,然后再進行了校驗。 def alter_response(response): response.status_code = 500 response.headers["Content-Type"] = "html/text" def get_httprunner_version(): return __version__ def sum_two(m, n): return m + n def sleep(n_secs): time.sleep(n_secs)
由以上運行可以看出:
setup_hook:前置函數中傳入參數"$request",能獲取http的請求詳情信息
teardown_hook:后置函數中傳入參數"$response",能夠獲取http的響應信息詳情,同時也可以對響應信息重新進行加工
9.2 用例級別的測試前置
from httprunner import HttpRunner,Config,RunRequest,Step class TestCaseBaiduRequest(HttpRunner): def setup(self): print("====運行於測試用例之前=====") def teardown(self): print("====運行於測試用例之后====") config = ( Config('用例級別的測試前置setup和teardown') .base_url("https://www.baidu.com") .verify(False) ) teststeps = [ Step( RunRequest("測試setup和teardown") .get("/") .validate() .assert_equal("status_code",200) ) ] if __name__ == '__main__': TestCaseBaiduRequest().test_start() #執行結果: /Users/testin/PycharmProjects/hrun_scripts/venv/bin/python /Users/testin/PycharmProjects/hrun_scripts/httprunner_demo/testcases/baidu_request_test.py ====運行於測試用例之前===== 2022-04-02 13:41:02.698 | INFO | httprunner.loader:load_dot_env_file:127 - Loading environment variables from /Users/testin/PycharmProjects/hrun_scripts/httprunner_demo/.env 2022-04-02 13:41:02.698 | DEBUG | httprunner.utils:set_os_environ:33 - Set OS environment variable: BASE_URL 2022-04-02 13:41:02.698 | DEBUG | httprunner.utils:set_os_environ:33 - Set OS environment variable: USERNAME 2022-04-02 13:41:02.698 | DEBUG | httprunner.utils:set_os_environ:33 - Set OS environment variable: PASSWORD 2022-04-02 13:41:02.705 | INFO | httprunner.runner:test_start:451 - Start to run testcase: 用例級別的測試前置setup和teardown, TestCase ID: ccac1224-17fa- 2022-04-02 13:41:03.136 | INFO | httprunner.runner:__run_step:304 - run step end: 測試setup和teardown <<<<<< 2022-04-02 13:41:03.137 | INFO | httprunner.runner:test_start:460 - generate testcase log: /Users/testin/PycharmProjects/hrun_scripts/httprunner_demo/logs/ccac1224-17fa-401d-9b92-2e8042c0a082.run.log ====運行於測試用例之后===== Process finished with exit code 0
由運行結果可以看出:
setup:只是在所有測試用例之前運行,而teardown:是在所有的測試用例執行結果后運行
十: 參數化數據驅動
httprunner3.x中的參數化我們需要引入pytest和處理參數化的函數:
import pytest from httprunner import Parameters
源碼介紹 Parameters 中的使用方法:
def parse_parameters(parameters: Dict,) -> List[Dict]: """ parse parameters and generate cartesian product. Args: parameters (Dict) parameters: parameter name and value mapping parameter value may be in three types: (1) data list, e.g. ["iOS/10.1", "iOS/10.2", "iOS/10.3"] (2) call built-in parameterize function, "${parameterize(account.csv)}" (3) call custom function in debugtalk.py, "${gen_app_version()}" Returns: list: cartesian product list Examples: >>> parameters = { "user_agent": ["iOS/10.1", "iOS/10.2", "iOS/10.3"], "username-password": "${parameterize(account.csv)}", "app_version": "${gen_app_version()}", } >>> parse_parameters(parameters) """ parsed_parameters_list: List[List[Dict]] = []
10.1第一種是直接獲取數據列表的信息
方式一:笛卡爾積組合
class TestCaseList(HttpRunner): config = ( Config("參數化數據驅動-列表類型") .base_url("https://www.baidu.com") .verify(False) ) @pytest.mark.parametrize('param', Parameters({'username': ['admin1', 'admin2'], 'password': [31, 32]})) def test_start(self, param): print(f'參數param={param}') super().test_start(param) teststeps = [ Step( RunRequest("列表類型的數據驅動") .get('/') .with_params( **{ "username":"$username" , "password":"$password" } ) .validate() .assert_equal("status_code",200) ) ] if __name__ == "__main__": TestCaseList().test_start()
執行結果:
============================= test session starts ============================= platform win32 -- Python 3.7.8, pytest-5.4.3, py-1.10.0, pluggy-0.13.1 rootdir: E:\PycharmScripts\API\httprunner_demo\testcases plugins: allure-pytest-2.9.43, assume-2.4.3, forked-1.4.0, html-2.1.1, metadata-1.11.0, xdist-2.5.0collected 4 items 數據驅動list_test.py [100%] ============================== warnings summary =============================== 數據驅動list_test.py::TestCaseList::test_start[param0] 數據驅動list_test.py::TestCaseList::test_start[param1] 數據驅動list_test.py::TestCaseList::test_start[param2] 數據驅動list_test.py::TestCaseList::test_start[param3] C:\Python37\lib\site-packages\urllib3\connectionpool.py:1020: InsecureRequestWarning: Unverified HTTPS request is being made to host 'www.baidu.com'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings InsecureRequestWarning, -- Docs: https://docs.pytest.org/en/latest/warnings.html ======================== 4 passed, 4 warnings in 3.89s ========================.參數param={'username': 'admin1', 'password': 31} 2022-04-02 21:39:47.583 | INFO | httprunner.runner:test_start:451 - Start to run testcase: 參數化數據驅動-列表類型, TestCase ID: 970331f1-60e3-44a6-8ac5-a4a7025d7176 2022-04-02 21:39:47.584 | INFO | httprunner.runner:__run_step:292 - run step begin: 列表類型的數據驅動 >>>>>> ================== request details ================== method : GET url : https://www.baidu.com/?username=admin1&password=31 2022-04-02 21:39:48.311 | INFO | httprunner.runner:__run_step:304 - run step end: 列表類型的數據驅動 <<<<<< 2022-04-02 21:39:48.312 | INFO | httprunner.runner:test_start:460 - generate testcase log: E:\PycharmScripts\API\httprunner_demo\logs\970331f1-60e3-44a6-8ac5-a4a7025d7176.run.log .參數param={'username': 'admin1', 'password': 32} 2022-04-02 21:39:48.345 | INFO | httprunner.runner:test_start:451 - Start to run testcase: 參數化數據驅動-列表類型, TestCase ID: 9610def9-ffc4-4245-a122-fb9ed2765a2b 2022-04-02 21:39:48.346 | INFO | httprunner.runner:__run_step:292 - run step begin: 列表類型的數據驅動 >>>>>> httprunner.client:log_print:40 - ================== request details ================== method : GET url : https://www.baidu.com/?username=admin1&password=32 2022-04-02 21:39:48.815 | INFO | httprunner.runner:__run_step:304 - run step end: 列表類型的數據驅動 <<<<<< 2022-04-02 21:39:48.819 | INFO | httprunner.runner:test_start:460 - generate testcase log: E:\PycharmScripts\API\httprunner_demo\logs\9610def9-ffc4-4245-a122-fb9ed2765a2b.run.log .參數param={'username': 'admin2', 'password': 31} 2022-04-02 21:39:48.856 | INFO | httprunner.runner:test_start:451 - Start to run testcase: 參數化數據驅動-列表類型, TestCase ID: 496e0d18-58b4-436f-b3b2-912c2e94f7f2 2022-04-02 21:39:48.857 | INFO | httprunner.runner:__run_step:292 - run step begin: 列表類型的數據驅動 >>>>>> 2022-04-02 21:39:49.779 | DEBUG | httprunner.client:log_print:40 - ================== request details ================== method : GET url : https://www.baidu.com/?username=admin2&password=31
httprunner.runner:__run_step:304 - run step end: 列表類型的數據驅動 <<<<<< 2022-04-02 21:39:49.785 | INFO | httprunner.runner:test_start:460 - generate testcase log: E:\PycharmScripts\API\httprunner_demo\logs\496e0d18-58b4-436f-b3b2-912c2e94f7f2.run.log .參數param={'username': 'admin2', 'password': 32} 2022-04-02 21:39:49.807 | INFO | httprunner.runner:test_start:451 - Start to run testcase: 參數化數據驅動-列表類型, TestCase ID: 275adbf4-eedd-49a4-88ef-20dc4931eca4 2022-04-02 21:39:49.808 | INFO | httprunner.runner:__run_step:292 - run step begin: 列表類型的數據驅動 >>>>>> 2022-04-02 21:39:50.494 | DEBUG | 2022-04-02 21:39:50.496 | DEBUG | httprunner.client:log_print:40 - ================== request details ================== method : GET url : https://www.baidu.com/?username=admin2&password=32
有上面執行結果可知,該測試用例執行了四次 用笛卡爾積組合的話,就是2*2=4種組合執行。
方式二:
from httprunner import HttpRunner,Config,Step,RunRequest import pytest from httprunner import Parameters class TestCaseListOne(HttpRunner): config = ( Config("參數化數據驅動列表類型") .base_url("https://www.baidu.com") .verify(False) ) @pytest.mark.parametrize('param',Parameters({"username":[111,222,333],"password":["admin"]})) def test_start(self,param): super().test_start(param) teststeps = [ Step( RunRequest("列表類型的數據驅動") .get('/') .with_params( **{ "username":"$username", "password":"$password" } ) .validate() .assert_equal('status_code',200) ) ] if __name__ == "__main__": TestCaseListOne().test_start()
執行結果;
由執行結果可以,只執行了三次 應為每次密碼是一個,不符合笛卡爾積組合
10.2第二種調用內置parameterize函數讀取.csv中的測試數據
username和password就是我們要引用的變量,${parameterize(文件路徑)} 就是我們讀取的.csv文件的數據源,內置的 parameterize(可簡寫為P)函數引用 CSV 文件
值得注意的是,通常來說,一個CSV文件中會放多列數值,那么這個時候,各列參數通過“-”連接來讀取參數,如:要傳postid1、name兩列參數,這樣寫就可以postid1-name: ${P(data/name_password.csv)}csv的路徑要使用相對路徑,不支持絕對路徑不支持\\符號的路徑
from httprunner import HttpRunner,Config,Step,RunRequest import pytest from httprunner import Parameters class TestCaseCSV(HttpRunner): config = ( Config("參數化數據驅動CSV類型") .base_url("https://www.baidu.com") .verify(False) ) @pytest.mark.parametrize('param',Parameters({"name-pwd":"${parameterize(data/name_password.csv)}"})) def test_start(self,param): super().test_start(param) teststeps = [ Step( RunRequest("CSV類型的數據驅動") .get('/') .with_params( **{ "username":"$name", "pwd":"$pwd" } ) .validate() .assert_equal('status_code',200) ) ] if __name__ == "__main__": TestCaseCSV().test_start()
第三種是在debugtalk中調用自定義函數
from httprunner import HttpRunner,Config,Step,RunRequest import pytest from httprunner import Parameters class TestCaseDebugtalk(HttpRunner): config = ( Config("參數化數據驅動debugtalk回調") .base_url("https://www.baidu.com") .verify(False) ) @pytest.mark.parametrize('param',Parameters({"username":"${get_username()}"})) def test_start(self,param): super().test_start(param) teststeps = [ Step( RunRequest("debugtalk回調類型的數據驅動") .get('/') .with_params(**{"username":"$username"}) .validate() .assert_equal('status_code',200) ) ] if __name__ == "__main__": TestCaseDebugtalk().test_start()