前言:
做過接口測試的都知道,接口的參數(shù)化是接口測試中非常普遍的測試模式,那么在HttpRuner3.x中,怎么實現(xiàn)參數(shù)化呢?因為HttpRunner3是在pytest的單元測試框架的基礎上做的封裝檩赢,所以基本能套用pytest的參數(shù)化模式,目前HttpRunner3.x支持3中參數(shù)化規(guī)則违寞,從:自己定義的變量數(shù)組贞瞒,debugtalk.py函數(shù)返回值中,以及外部文件中趁曼。
因為HttpRunner3.x支持.py格式的用例军浆,所以這三類還是可以有更多的拓展,留給讀者自己去思考吧~
代碼示例
先來看一份官網(wǎng)的示例代碼
# NOTE: Generated By HttpRunner v3.1.4
# FROM: request_methods/request_with_parameters.yml
import pytest
from httprunner import Parameters
from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase
class TestCaseRequestWithParameters(HttpRunner):
@pytest.mark.parametrize(
"param",
Parameters(
{
"user_agent": ["iOS/10.1", "iOS/10.2"],
"username-password": "${parameterize(request_methods/account.csv)}",
"app_version": "${get_app_version()}",
}
),
)
def test_start(self, param):
super().test_start(param)
config = (
Config("request methods testcase: validate with parameters")
.variables(**{"app_version": "f1"})
.base_url("https://postman-echo.com")
.verify(False)
)
teststeps = [
Step(
RunRequest("get with params")
.with_variables(
**{
"foo1": "$username",
"foo2": "$password",
"sum_v": "${sum_two(1, $app_version)}",
}
)
.get("/get")
.with_params(**{"foo1": "$foo1", "foo2": "$foo2", "sum_v": "$sum_v"})
.with_headers(**{"User-Agent": "$user_agent,$app_version"})
.extract()
.with_jmespath("body.args.foo2", "session_foo2")
.validate()
.assert_equal("status_code", 200)
.assert_string_equals("body.args.sum_v", "${sum_two(1, $app_version)}")
),
]
if __name__ == "__main__":
TestCaseRequestWithParameters().test_start()
- 文件中挡闰,先在需要參數(shù)化測試類名下定義參數(shù)化字段
@pytest.mark.parametrize(
"param",
Parameters(
{
"user_agent": ["iOS/10.1", "iOS/10.2"],
"username-password": "${parameterize(request_methods/account.csv)}",
"app_version": "${get_app_version()}",
}
),
)
- 重寫父類的方法test_start乒融,將參數(shù)化變量傳入
def test_start(self, param):
super().test_start(param)
自定義數(shù)組變量
"user_agent": ["iOS/10.1", "iOS/10.2"],
將數(shù)組內的兩個值分別付給了變量user_agent掰盘,此時用例引用變量時$user_agent
,就會循環(huán)帶入兩個值執(zhí)行兩個測試用例
debugtalk.py函數(shù)的返回值
"app_version": "${get_app_version()}",
和自定義變量類似赞季,把函數(shù)get_app_version()
的返回值賦值給了變量app_version愧捕,用例執(zhí)行時,就會帶入函數(shù)返回值申钩,返回值一般是列表或者元組類型的次绘。容器內有幾個值,就會執(zhí)行幾次用例撒遣,用函數(shù)返回值作用參數(shù)化變量的好處是邮偎,可以動態(tài)計算參數(shù),留給使用者更多的可能性
外部文件
"username-password": "${parameterize(request_methods/account.csv)}"
外部文件中定義的參數(shù)通過${parameterize(file/path)}
固定寫法讀取愉舔。以上的例子中每一次要參數(shù)化的值實際上是多個,將每一行讀取出來的變量分別賦值給了username和password,文件有多少行伙菜,就會執(zhí)行幾遍用例
獨立參數(shù)和組合參數(shù)
在上面的例子中user_agent和app_version都是獨立參數(shù)轩缤,每個遍歷出來值只有一個,而username-password則是組合參數(shù)贩绕,每次遍歷出來是一組值火的,分別賦值給對應變量。
如果參數(shù)在用例中是單獨定義的淑倾,沒有出現(xiàn)組合的情況馏鹤,那么遍歷出來幾個值,用例就會執(zhí)行幾次娇哆。
而如果不同的參數(shù)需要組合使用湃累,但是又各自定義了參數(shù)化,那么此時用例執(zhí)行的次數(shù)呈現(xiàn)笛卡爾積的碍讨,假設上面的例子中user_agent有2個值治力,app_version 有3個值,username-password也3組值勃黍,組合在一起宵统,用例就會累計執(zhí)行** 2x3x3 **次,也許這并不是我們想要的覆获。所以設計好我們的參數(shù)化組合在HttpRunner接口參數(shù)化實踐中是非常重要的马澈。