【HttpRunner v3.x】筆記 ——4. 測試用例-結構解析


一、官方首推pytest格式

上篇文章我們知道了,httprunner可以支持三種格式的用例,分別是pytest、yaml和json。yaml和json是以前的版本所使用的用例格式,但是在3.x版本上,官方強烈建議使用的是pytest格式的用例。

上圖是來自官方的用例格式關系圖,可以看出來,httprunner再對於第三方導出的har文件進行了轉換處理,有的人喜歡轉換成json,有的人喜歡轉換成yaml。但是最終,還是通過解析json格式的文件,生成pytest的python文件。
既然最后都是要生成pytest,那何不一步到位呢?哈哈,我想這就是官方推薦pytest格式的原因吧。
我還是挺喜歡的,因為我對於pytest使用的較多,那么接下來也是基於pytest格式的用例進行解析。

二、用例結構解析

錄制生成的case很便捷,但是這並不是說,不需要我們做任何的改動了。在實踐的過程中,我們仍然會根據我們實際項目的不同需求來對case作進一步的調整,所以徹底的了解case的構造尤為重要。
首先,我錄制了一個百度搜索“httprunner”的一個請求,轉換成pytest文件后如下:

可以看到:

  • 每個testcase都是HttpRunner的子類
  • 必須有兩個類屬性:config和teststeps。
  • 單個teststeps列表中的單個Step內部通過鏈式調用(RunRequest().get().with_params().with_header().with_cookies().validate().assert_equal())
  1. config:配置測試用例級設置,包括基礎url、驗證、變量、導出。
  2. teststeps:teststep的列表(list[Step]),每個步驟對應於一個API請求,也可以調用另一個testcase。此外,還支持variables/extract/validate/hooks機制來創建極其復雜的測試場景。
  3. 鏈調用:可以看到一個case的請求,經過了各個環節的調用,這也是httprunner 3.x版本一大亮點。現在的ide編輯器越來越強大,比如你使用pycharm的話,都不用你怎么記憶用例的格式,順手就...(點)出來了,這或許也是官方推薦使用pytest的另一個原因吧,哈哈。

三、httprunner的用例結構與我自己的用例

補一個官方完整的一個demo代碼,並說說httprunner中的用例與我自己編寫的測試用例之間的聯系。

from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase


class TestCaseRequestWithFunctions(HttpRunner):
    config = (
        Config("request methods testcase with functions")
        .variables(
            **{
                "foo1": "config_bar1",
                "foo2": "config_bar2",
                "expect_foo1": "config_bar1",
                "expect_foo2": "config_bar2",
            }
        )
        .base_url("http://demo.qa.com")
        .verify(False)
        .export(*["foo3"])
    )

    teststeps = [
        Step(
            RunRequest("get with params")
            .with_variables(
                **{"foo1": "bar11", "foo2": "bar21", "sum_v": "${sum_two(1, 2)}"}
            )
            .get("/get")
            .with_params(**{"foo1": "$foo1", "foo2": "$foo2", "sum_v": "$sum_v"})
            .with_headers(**{"User-Agent": "HttpRunner/${get_httprunner_version()}"})
            .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", "3")
            .assert_equal("body.args.foo2", "bar21")
        ),
        Step(
            RunRequest("post form data")
            .with_variables(**{"foo2": "bar23"})
            .post("/post")
            .with_headers(
                **{
                    "User-Agent": "HttpRunner/${get_httprunner_version()}",
                    "Content-Type": "application/x-www-form-urlencoded",
                }
            )
            .with_data("foo1=$foo1&foo2=$foo2&foo3=$foo3")
            .validate()
            .assert_equal("status_code", 200)
            .assert_equal("body.form.foo1", "$expect_foo1")
            .assert_equal("body.form.foo2", "bar23")
            .assert_equal("body.form.foo3", "bar21")
        ),
    ]


if __name__ == "__main__":
    TestCaseRequestWithFunctions().test_start()
  1. httprunner中的testcase,其實說的就是上面的這一整個Python文件。
  2. teststeps列表中的Step,其實就是我自己編寫case時候的一個個def test_xxx():pass。
  3. 而每一個Step內部,依然是按照 傳參——調用接口——斷言,這樣的過程來的。

萬變不離其宗,httprunner框架目前看起來,確實可以讓編寫更加的便捷、簡潔,但是這只是目前從demo的過程中得到的結論,后面還需要落地實戰才可以。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM