美文网首页
HttpRunner3.X学习笔记(2)-用例结构解析

HttpRunner3.X学习笔记(2)-用例结构解析

作者: 是立品啊 | 来源:发表于2020-09-17 08:40 被阅读0次

    一、官方推荐的pytest格式

    httprunner可以支持三种格式的用例,分别是pytestyamljsonyamljson是以前的版本所使用的用例格式,但是在3.x版本上,官方强烈建议使用的是pytest格式的用例。

    image.png

    官方的用例格式关系图,可以看出来,httprunner在对于第三方导出的har文件进行了转换处理,有的人喜欢转换成json,有的人喜欢转换成yaml。但是最终,还是通过解析json格式的文件,生成pytestpython文件。

    二.pytest用例格式分析

    from httprunner import HttpRunner, Config, Step, RunRequest
    from utils.FakerData import *
    from api.dlvopenapi import unified_order, order_query
    from utils.SigleData import FakerSingleData
    
    class TestCaseDlvOpenApiSuccess(HttpRunner):
        config = (
            Config("发放成功的测试案例")
                .variables(
                **{
                    "appId": "200803014515363414",
                    "accountName": get_name(),
                    "idCard": "420624199109037552",
                    "amount": "0.02",
                    "signType":"rsa2",
                    "version":"1.0",
                    "accountNo": "6225380092315252",
                    "phone":get_phone(),
                    "serviceCompanyId": "10000032",
                    "key": "MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAOI4fc5POr0cZmyyGuwAonQGNVUvEd8KWtYk2ozNM1S6la7BK7DwWyk6kI10/NsY+Wues+C0fN86Ol0uckTF+s4NqMqw/W8PZ0"
                }
            )
                .base_url("http://1127.0.0.1:8002")
                .verify(False)
                .export(*["reqNo","outOrderNo"])
        )
    
        teststeps = [
            Step(
                RunRequest("发放收单成功").
                    setup_hook('${setup_request($request,$key)}')
                    .with_variables(
                    **{
                        "attach": "附件",
                        "bank": "ICBC1",
                        "batchNo": "20200801",
                        "depositBank": "工商",
                        "extInfo": "API001-商户004-攻城狮",
                        "foreignNationality": "CN",
                        "memo": "API_AUTO1",
                        "outOrderNo": get_outOrderNo(),
                        "personalIncomeTax": "0",
                        "phone": "$phone",
                        "postId": "10468",
                        "postName": "tester",
                        "serviceFee": "0",
                        "serviceType": "10002",
                        "shouldAmount": "0",
                        "totalFee": "0",
                        "nonce": get_nonce(),
                        "timestamp": get_current_time()}
                )
                    .post(unified_order.UnifiedOrderApi.path)
                    .with_json(unified_order.UnifiedOrderApi.json)
                    .teardown_hook('${polling_assert(state_,30)}')
                    .extract()
                    .with_jmespath("body.data.reqNo", "reqNo")
                    .with_jmespath("body.data.outOrderNo", "outOrderNo")
                    .validate()
                    .assert_equal("status_code", 200)
                    .assert_equal("body.code", "0000")
                    .assert_equal("body.msg", "处理成功")
                    .assert_equal('${db_filed_states_with_parm(state_)}', 30)
                    .assert_equal('${db_filed_states_with_parm(balance_state_)}', 39)
                    .assert_equal('${db_filed_states_with_parm(channel_balance_state_)}', 39)
    
    
            ),
    
            Step(
                RunRequest("发放订单查询")
                    .setup_hook('${setup_request($request,$key)}')
                    .with_variables(**{
                    "method": "ayg.salary.payQuery",
                    "nonce": get_nonce(),
                    "timestamp": get_current_time(),
    
                })
                    .post(order_query.OrderQueryApi.path)
                    .with_json(order_query.OrderQueryApi.json)
                    .validate()
                    .assert_equal("status_code", 200)
                    .assert_equal("body.code", "0000")
                    .assert_equal("body.data.code", "30")
                    .assert_equal("body.data.msg", "支付成功")
            )
        ]
    
    
    if __name__ == "__main__":
        TestCaseDlvOpenApiSuccess().test_start()
    

    说明:由于喜欢2版本的api分层机制,在3版本并没有强制要求此分层,我还是将单个接口通过类的方式封装了起来,在用例层调用接口类属性完成参数传递。

    可以看到:

    • 每个python文件格式的testcase都是HttpRunner的子类
    • 每个测试类,必须有两个类属性:config(元组)和teststeps(列表)。
    • teststeps列表中的单个Step内部通过链式调用RunRequest().setup_hook().with_variables().post().with_json().with_header().with_cookies().validate().assert_equal().....

    config

    是测试用例级别的配置,包括base_urlverifyvariablesexport

    teststeps:

    teststeps是包含测试步骤的列表(list[Step]),每个步骤对应于一个API请求RunRequest(),当然也可以调用另一个testcase,对应的类是RunTestCase()。此外,还支持variables/extract/validate/hooks机制来创建极其复杂的测试场景

    链式调用:

    链式调用是httprunner 3.x版本一大亮点。在如pycharm等IDE环境编写代的话,会智能提示用例方法。有编写代码的流畅度,再也不用担心yaml格式不正确,没有智能提示或者代码不能智能跳转等痛点了。

    httprunner与pytest的联系

    1. httprunner中的testcase,就是一个Python文件。因为hrun命令是对pytest命令的封装,所有想要使用hrun或者pytest命令,则用例文件的命名必须要使用xxxx_test.py的格式,才能被pytest检测出来是需要执行的用例文件
    2. teststeps列表中的Step,其实就是自己编写pytest脚本时候的一个个def test_xxx():pass。而每一个Step内部,依然是按照传参=>调用接口=>断言的步骤进行。

    相关文章

      网友评论

          本文标题:HttpRunner3.X学习笔记(2)-用例结构解析

          本文链接:https://www.haomeiwen.com/subject/qglqyktx.html