4 - 引用其他测试用例时的场景: demo_testcase_ref_test.py

  1 # NOTE: Generated By HttpRunner v3.1.6
  2 # FROM: testcases\demo_testcase_request.yml
  3 
  4 
  5 from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase
  6 
  7 
  8 class TestCaseDemoTestcaseRequest(HttpRunner):
  9     # 用例配置:全局变量,可以在其中进行测试用例级别的设置(将每个测试用例视为一个黑盒,配置variables是输入部分,而配置export是输出部分)
 10     config = (
 11         Config("接口测试用例的名称")
 12         # 变量:局部变量大于全局变量(步骤里面配置的变量比此处配置的变量具有更高的优先级)
 13         .variables(
 14             **{
 15                 "foo1": "config_bar1",
 16                 "foo2": "config_bar2",
 17                 "expect_foo1": "config_bar1",
 18                 "expect_foo2": "config_bar2",
 19             }
 20         )
 21         # base_url:全局变量,如果此处设置了,则测试用例步骤里只能是相对路径,不能写全
 22         .base_url("https://postman-echo.com")
 23         # 是否验证服务器的TLS证书,除非你想测试用例执行的HTTP流量,默认是false
 24         .verify(False)
 25         # 关联接口之间,变量的提取(当一个测试用例在另一个测试用例的步骤中被引用,并且将被提取一些会话变量以在随后的测试步骤中使用时,则所提取的会话变量应在config export部分中进行配置)
 26         .export(*["foo3"])
 27         # 性能的并发数
 28         .locust_weight(2)
 29     )
 30     # 测试用例的步骤:每一个步骤对应于一个API请求或者对另一个测试用例引用调用
 31     teststeps = [
 32         Step(
 33             # 在一个步骤中使用“ RunRequest”来向API发出请求,并对响应进行一些提取或验证
 34             RunRequest("该测试用例下步骤1的名字")
 35             # 该请求的变量:每个步骤的变量都是独立的,因此,如果要在多个步骤中共享变量,则应在配置变量中定义变量;此外,步骤变量将覆盖配置变量中具有相同名称的变量
 36             .with_variables(
 37                 **{"foo1": "bar11", "foo2": "bar21", "sum_v": "${sum_two(1, 2)}"}
 38             )
 39             # 请求的url,指相对路径
 40             .get("/get")
 41             # 请求的参数:Params参数
 42             .with_params(**{"foo1": "$foo1", "foo2": "$foo2", "sum_v": "$sum_v"})
 43             # 请求的Headers信息
 44             .with_headers(**{"User-Agent": "HttpRunner/${get_httprunner_version()}"})
 45             # 请求的cookies
 46             .with_cookies("xx")
 47             # 请求HTTP的正文,data参数
 48             .with_data("xxx")
 49             # 在json中指定HTTP请求正文
 50             .with_json("xxx")
 51             # 提取JSON响应主体
 52             .extract()
 53             .with_jmespath("body.args.foo2", "foo3")
 54 
 55             # 页面加载后对表单进行验证
 56             .validate()
 57             # 判断响应码是不是200
 58             .assert_equal("status_code", 200)
 59             # 判断字段foo1的值是不是bar11
 60             .assert_equal("body.args.foo1", "bar11")
 61             .assert_equal("body.args.sum_v", "3")
 62             .assert_equal("body.args.foo2", "bar21")
 63         ),
 64         Step(
 65             RunRequest("该测试用例下步骤2的名字")
 66             .with_variables(**{"foo1": "bar12", "foo3": "bar32"})
 67             .post("/post")
 68             .with_headers(
 69                 **{
 70                     "User-Agent": "HttpRunner/${get_httprunner_version()}",
 71                     "Content-Type": "text/plain",
 72                 }
 73             )
 74             .with_data(
 75                 "This is expected to be sent back as part of response body: $foo1-$foo2-$foo3."
 76             )
 77             .validate()
 78             .assert_equal("status_code", 200)
 79             .assert_equal(
 80                 "body.data",
 81                 "This is expected to be sent back as part of response body: bar12-$expect_foo2-bar32.",
 82             )
 83         ),
 84         Step(
 85             RunRequest("该测试用例下步骤3的名字")
 86             .with_variables(**{"foo2": "bar23"})
 87             .post("/post")
 88             .with_headers(
 89                 **{
 90                     "User-Agent": "HttpRunner/${get_httprunner_version()}",
 91                     "Content-Type": "application/x-www-form-urlencoded",
 92                 }
 93             )
 94             .with_data("foo1=$foo1&foo2=$foo2&foo3=$foo3")
 95             .validate()
 96             .assert_equal("status_code", 200)
 97             .assert_equal("body.form.foo1", "$expect_foo1")
 98             .assert_equal("body.form.foo2", "bar23")
 99             .assert_equal("body.form.foo3", "bar21")
100         ),
101     ]
102 
103 
104 if __name__ == "__main__":
105     TestCaseDemoTestcaseRequest().test_start()

 

 

# demo_banner_test.py

import pytest
from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase
from testcases.pytest测试用例示例.test_001_banner import (
    TestCaseTest001Banner as Banner001,
)
from testcases.pytest测试用例示例.test_003_banner import (
    TestCaseTest003Banner as Banner003,
)
from httprunner import Parameters
from lib.common.config_operate import read_ini_config


@pytest.mark.skipif(
    read_ini_config("Header", "accept-language") == "zh-CN", reason="仅适用于地球外的测试环境"
)
class TestCaseTest002Banner(HttpRunner):
    # 变量_全局变量:字段取值参数化
    @pytest.mark.parametrize(
        "param",
        Parameters(
            {
                "title": "${get_user_id(10)}",
                "user": ["user1", "user2"],
                "title-user": [("demo4", "4"), ("demo5", "5"), ("dmeo6", "6")],
            }
        ),
    )
    def test_start(self, param):
        super().test_start(param)

    config = (
        Config("开启和关闭banner成功")
        # 变量_全局变量:这里可以替换需要配置的参数,当调用用例的时候可以使用 with_variables()重写参数的值。这里是这条测试用例的全局变量。优先级没有测试步骤里面的高
        .variables(
            **{
                "xx": "xx",
                "yy": "yy",
            }
        )
        .base_url("${read_ini_config(Host, rem_host_001)}")
        .verify(False)
        # 变量_局部变量:该用例被调用时传递出去的变量,可供其他脚本使用
        .export("code")
    )

    teststeps = [
        # 测试步骤1
        Step(
            RunTestCase("前置1:添加一条banner数据")
            .setup_hook("${setup_clean_data()}")  # 调用用例前执行测试前置
            # 变量_局部变量:更新某个 step 里面的字段值
            .with_variables(
                **{
                    "xx": "yy",
                }
            )
            .call(Banner001)  # 调用用例
            .teardown_hook("${teardown_clean_data()}")  # 测试后置
            # 变量_局部变量:导出某个值,供下面的步骤使用。这个值来自于本条用例响应内容with_jmespath()
            .export("xx")
        ),
        Step(RunTestCase("前置2:获取banner页第一行数据ID").call(Banner003).export("id")),
        Step(
            RunRequest("步骤1:关闭 banner ")
            .with_variables(**{"xx": "as"})
            # hook_测试前:测试前的清理操作
            .setup_hook("${setup_clean_data1()}")
            .setup_hook("${setup_clean_data2()}")
            .setup_hook("${setup_clean_data3()}")
            .post(
                "/xxx-app/xxx/operaxxx"
            )
            .with_headers(
                **{
                    "accept-language": "${read_ini_config(Header, accept-language)}",
                    "autel-token": "${get_login_info(expert_001, token)}",
                }
            )
            # 变量_引用:使用 ${id} 或者 $id,一般使用 ${id}
            .with_json({"id": "$id", "displayStatus": False})
            # hook_测试后:测试数据清理
            .teardown_hook("${teardown_clean_data4()}")
            .teardown_hook("${teardown_clean_data5()}")
            # 变量_局部变量:提取响应的参数值
            .extract()
            .with_jmespath("body.code", "code")
            # 校验
            .validate()
            .assert_equal('headers."Content-Type"', "application/json")
            .assert_equal("status_code", 200)
            .assert_equal("body.code", "200")
            .assert_equal("body.message", "success")
            .assert_contains("body.data.records[0].name", "接口自动化")
        ),
    ]




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

 

posted @ 2022-05-27 16:44  xiaoyanhahaha  阅读(73)  评论(0编辑  收藏  举报