httprunner3.x总结3 - 如何编写测试用例?

编写测试用例,为什么推荐使用python脚本,而不是其他的?
主要是编写Python可以复用IDE的能力,包括语法提示、自动补全,这些都会是Yaml/Json比较欠缺的。
另外,python脚本集成了pytest、locust、allure等等使用起来是非常方便的

1、.gitignore这里配置的内容,不会上传到git仓库

2、上一个接口的值是如何传递到下一个接口?也就是怎么实现步骤之间的数据关联
.with_json({“folderId”: “0”, “type”: 0})
#输出响应,并提取id值作为变量,变量名是id
.extract()
.with_jmespath(“body.data.id”, “docId”)
注意:是在请求的body体后面直接提取extract(),然后通过jmespath获取body.data.id传入变量docid,变量的引用使用${docid}

3、docid,3部,,,00:32,详情可参考源码示例的实现方式

1、处理python脚本不规范的问题

black test_test.py,可是文件,也可以是目录名
black是github上一个开源的项目,httprunner集成了它。

C:\Users\Administrator\Desktop\api_test\testcases>black test_test.py
reformatted test_test.py
All done! ✨ � ✨
1 file reformatted.

2、如何编写测试用例?
参考:httprunner源码的example示例:https://github.com/httprunner/httprunner

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

class TestCaseRequestWithFunctions(HttpRunner):
    # 用例配置 >>> 全局变量
    config = (
        Config("接口用例名称")
            # 变量,符合局部大于全局变量
            .variables(**{"foo1": "config_bar1",
                          "foo2": "config_bar2",
                          "expect_foo1": "config_bar1",
                          "expect_foo2": "config_bar2", })
            # rul,这里是全局变量,如果设置了,则用例步骤只能是相对路径。不能写全名
            .base_url("https://postman-echo.com")
            # 是否验证服务器的TLS证书,除非你想测试用例执行的HTTP流量,默认是false
            .verify(False)
            # 接口之间关联,变量的提取
            .export(*["foo3"])
            # 应该是性能的并发数
            .locust_weight(2))
    
    # 用例步骤
    teststeps = [
        Step(RunRequest("这里步骤1的名字")
             # 请求的变量
             .with_variables(**{"foo1": "bar11", "foo2": "bar21", "sum_v": "${sum_two(1, 2)}"})
             # 请求的url,相对路径
             .get("/get")
             # 请求的参数,params参数
             .with_params(**{"foo1": "$foo1", "foo2": "$foo2", "sum_v": "$sum_v"})
             # 请求的headers
             .with_headers(**{"User-Agent": "HttpRunner/${get_httprunner_version()}"})
             # 请求的cookies
             .with_cookies("xx")
             # 请求的正文,data参数。
             .with_data("xxx")
             # 在json中指定HTTP请求正文
             .with_json("xxx")
             .extract()
             # 提取JSON响应主体。
             .with_jmespath("body.args.foo2", "foo3")
             # 页面加载后对表单进行验证
             .validate()

             # 判断响应码是不是200
             .assert_equal("status_code", 200)
             # 判断字段foo1的值是不是bar11
             .assert_equal("body.args.foo1", "bar11")
             .assert_equal("body.args.sum_v", "3")
             .assert_equal("body.args.foo2", "bar21")),

        Step(RunRequest("这里步骤2的名字")
             .with_variables(**{"foo1": "bar12", "foo3": "bar32"})
             .post("/post")
             .with_headers(**{"User-Agent": "HttpRunner/${get_httprunner_version()}", "Content-Type": "text/plain", })
             .with_data("This is expected to be sent back as part of response body: $foo1-$foo2-$foo3.")
             .validate()

             .assert_equal("status_code", 200)
             .assert_equal("body.data", "This is expected to be sent back as part of response body: bar12-$expect_foo2-bar32.", )
             .assert_type_match("body.json", "None")
             .assert_type_match("body.json", "NoneType")
             .assert_type_match("body.json", None)),
    ]

if __name__ == "__main__":
    TestCaseRequestWithFunctions().test_start()

2、测试用例详情
HttpRunner v3.x支持三种测试用例格式,即pytest,YAML和JSON。 极力建议以pytest格式而不是以前的YAML / JSON格式编写和维护测试用例。

(1)记录并生成测试用例
如果SUT(被测系统)准备就绪,最有效的方法是先捕获HTTP流量,然后使用HAR文件生成测试用例。 有关更多详细信息,请参考[`记录并生成测试用例](/ user / gen_tests /)。然后,基于生成的pytest测试用例,您可以根据需要进行一些调整,因此您需要了解测试用例格式的详细信息。

(2)测试用例结构
每个测试用例都是HttpRunner的子类,并且必须具有两个类属性:config和teststeps。
-config:配置测试用例级别的设置,包括“ base_url”,“ verify”,“ variables”和“ export”。
-teststeps:测试步骤列表(“ List [Step]”),每个步骤对应于一个API请求或另一个测试用例引用调用。 此外,还支持“变量” /“提取” /“验证”
/“挂钩”机制,以创建极其复杂的测试方案。

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("https://postman-echo.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()

##调用链 >>> 意思就是支持索引,智能提示

HttpRunner v3.x的最强大功能之一是“链调用”,使用它您无需记住任何测试用例格式的详细信息,并且在IDE中编写测试用例时就可以智能完成。

##config
每个测试用例应该有一个“ config”部分,您可以在其中配置测试用例级别的设置。

name (required)

指定测试用例名称。 这将显示在执行日志和测试报告中。

base_url (optional)

指定SUT的通用架构和主机部分,例如 https://postman-echo.com。 如果指定了“ base_url”,则teststep中的url只能设置相对路径部分。
如果要在不同的SUT环境之间切换,这将特别有用。

variables (optional)

这里是变量,步骤变量比配置变量具有更高的优先级。

verify (optional)

指定是否验证服务器的TLS证书。 如果我们想记录测试案例执行的HTTP流量,这将特别有用,
因为如果没有设置verify或将其设置为True,则会发生SSLError。 报错如下:

SSLError(SSLCertVerificationError(1, ‘[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1076)’))

export (optional)

指定导出的测试用例会话变量。 将每个测试用例视为一个黑盒,配置variables是输入部分,而配置export是输出部分。 特别是,当一个测试用例在
另一个测试用例的步骤中被引用,并且将被提取一些会话变量以在随后的测试步骤中使用时,则所提取的会话变量应在configexport部分中进行配置。

teststeps

每个测试用例应具有一个或多个有序的测试步骤(“ List [Step]”),每个步骤对应于一个API请求或另一个测试用例引用调用。

RunRequest(name)

在一个步骤中使用“ RunRequest”来向API发出请求,并对响应进行一些提取或验证。
RunRequest的参数“名称”用于指定测试步骤名称,该名称将显示在执行日志和测试报告中。

.with_variables

指定测试步骤变量。 每个步骤的变量都是独立的,因此,如果要在多个步骤中共享变量,则应在配置变量中定义变量。
此外,步骤变量将覆盖配置变量中具有相同名称的变量。

.method(url)

指定HTTP方法和SUT的URL。 这些对应于[requests.request] [requests.request]的methodurl参数。
如果在配置中设置了“ base_url”,则url只能设置相对路径部分。

.with_params

指定请求网址的查询字符串。 这对应于[requests.request] [requests.request]的params参数。

.with_headers

指定请求的HTTP标头。 这对应于[requests.request] [requests.request]的headers参数。

.with_cookies

指定HTTP请求cookie。 这对应于[requests.request] [requests.request]的cookies参数。

.with_data

指定HTTP请求正文。 这对应于[requests.request] [requests.request]的data参数。

.with_json

在json中指定HTTP请求正文。 这对应于[requests.request] [requests.request]的json参数。

extract
.with_jmespath

使用[jmespath] [jmespath]提取JSON响应主体。
-jmes_path:jmespath表达式,有关更多详细信息,请参考[JMESPath教程] [jmespath_tutorial]
-var_name:存储提取值的变量名,可以在后续测试步骤中引用它

with_jmespath(jmes_path:文本,var_name:文本)

.assert_XXX

使用[jmespath] [jmespath]提取JSON响应主体,并使用期望值进行验证。
-jmes_path:jmespath表达式,有关更多详细信息,请参考[JMESPath教程] [jmespath_tutorial]
-预期值:指定的预期值,变量或函数引用也可以在此处使用
-消息(可选):用于指示断言错误的原因

assert_XXX(jmes_path:文本,期望值:任何,消息:文本=“”)

RunTestCase(name)

在一个步骤中使用“ RunTestCase”来引用另一个测试用例调用。
RunTestCase的参数“名称”用于指定测试步骤名称,该名称将显示在执行日志和测试报告中。

.with_variables

与RunRequest的.with_variables相同。

.call

指定引用的测试用例类。

.export

指定会话变量名称以从引用的测试用例中导出。 可以通过后续测试步骤引用导出的变量。

import os
import sys

sys.path.insert(0, os.getcwd())

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

from examples.postman_echo.request_methods.request_with_functions_test import (
    TestCaseRequestWithFunctions as RequestWithFunctions,
)


class TestCaseRequestWithTestcaseReference(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(RequestWithFunctions)
            .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__":
    TestCaseRequestWithTestcaseReference().test_start()

request库产品文档:
https://requests.readthedocs.io/en/master/api/#requests.request
jmespath调试器:
https://jmespath.org/
jmespath产品文档:
https://jmespath.org/tutorial.html

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿_焦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值