看到這里,對於httprunner已經有了一個大概的了解,現在想對於一些比較重要或者常用的功能,進行一些實踐操作。
畢竟那誰說過,“紙上得來終覺淺,絕知此事要躬行。”
上一篇提到了RunTestCase,里面有2個重要的特征:
一個是在一個用例中引用另一個測試用例,另一個則是變量的導出與引用。
那就先來實踐一下這2個貨。
我用flask快速寫了2個接口,以供在本地調用:
from flask import Flask
from flask import request
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
@app.route('/getUserName', methods=['GET'])
def get_user_name():
if request.method == 'GET':
return {
"username": "wesson",
"age": "27",
"from": "China",
}
@app.route('/joinStr', methods=['GET'])
def str_join():
if request.method == 'GET':
str1 = request.args.get("str1")
str2 = request.args.get("str2")
after_join = str1 + " " + str2
return {
"result": after_join
}
if __name__ == '__main__':
app.run()
一共有2個接口:
- /getUserName,查詢用戶名,返回是我寫死的字典。
- /joinStr,兩個字符串拼接,返回的是拼接后的結果。
一、編寫測試用例
根據之前學習過的,直接編寫case,因為這個接口沒有傳參,cookie之類的,就省掉了,只是demo用。
1. 接口:/getUserName
from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase
class TestCaseRequestWithGetUserName(HttpRunner):
config = (
Config("test /getUserName")
.base_url("http://localhost:5000")
.verify(False)
)
teststeps = [
Step(
RunRequest("getUserName")
.get("/getUserName")
.validate()
.assert_equal("body.username", "wesson")
),
]
if __name__ == "__main__":
TestCaseRequestWithGetUserName().test_start()
這里呢,步驟都有了,斷言是驗證返回的username字段值是不是“wesson”,運行一下,可以看到測試通過。
2. 接口:/joinStr
這個接口就需要2個傳參了,那么在Step里通過.with_params()來傳參。
from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase
class TestCaseRequestWithJoinStr(HttpRunner):
config = (
Config("test /joinStr")
.base_url("http://localhost:5000")
.verify(False)
)
teststeps = [
Step(
RunRequest("joinStr")
.get("/joinStr")
.with_params(**{"str1": "hello", "str2": "wesson"})
.validate()
.assert_equal("body.result", "hello wesson")
),
]
if __name__ == "__main__":
TestCaseRequestWithJoinStr().test_start()
這里傳入的參數分別是“hello”、“wesson”,這個字符串在拼接的時候是加了一個空格的,所以斷言的時候我預期的值是"hello wesson"。
運行測試,可以看的測試通過。
二、testcase引用&變量傳遞
以上是2個分開的case,都可以分別正常運行。
假設,/joinStr接口的第二個參數,是依賴/getUserName接口的返回,那么現在這2個testcase之間就有了依賴關系。
那么在寫/getUserName接口用例的時候,就需要去引用/joinStr的測試用例了,並且需要把/getUserName用例的變量導出來,/joinStr的測試用例傳參時候使用。
1. 首先,先修改/getUserName接口的case:
from httprunner import HttpRunner, Config, Step, RunRequest
class TestCaseRequestWithGetUserName(HttpRunner):
config = (
Config("test /getUserName")
.base_url("http://localhost:5000")
.verify(False)
.export(*["username"])#這里定義出要導出的變量
)
teststeps = [
Step(
RunRequest("getUserName")
.get("/getUserName")
.extract()
.with_jmespath("body.username", "username")#提取出目標值,賦值給username變量
.validate()
.assert_equal("body.username", "wesson")
),
]
if __name__ == "__main__":
TestCaseRequestWithGetUserName().test_start()
關注注釋部分的代碼,一個是config里定義了這個要導出的變量,另一個是在Step中,講目標值提取出來,賦值給這個變量。
2. 接下來,修改/joinStr接口的測試用例:
from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase
from .get_user_name_test import TestCaseRequestWithGetUserName #記得要導入引用的類
class TestCaseRequestWithJoinStr(HttpRunner):
config = (
Config("test /joinStr")
.base_url("http://localhost:5000")
.verify(False)
)
teststeps = [
Step(
RunTestCase("setUp getUserName")
.call(TestCaseRequestWithGetUserName)#導入后就可以調用了
.export(*["username"])#在RunTestCase步驟中定義這個變量的導出
),
Step(
RunRequest("joinStr")
.get("/joinStr")
.with_params(**{"str1": "hello", "str2": "$username"})#在第二個傳參中引用導出的變量
.validate()
.assert_equal("body.result", "hello $username")#斷言的預期值也引用變量
),
]
if __name__ == "__main__":
TestCaseRequestWithJoinStr().test_start()
按照直接學習的內容,case已經修改好,現在運行/joinStr接口的測試用例,可以看到運行通過。
剛接觸httprunner的這個pytest格式的語法時候,感覺還不習慣,但是你跟着實踐走下來,發現習慣的還是很快的,快動手試試吧。