zoukankan      html  css  js  c++  java
  • httprunner 3.x学习5

    前言

    当我写了一个登录的接口用例后,后面会继续写查询个人信息的接口,但是查询个人信息接口是依赖于先登录(获取token)。
    像这种业务上操作有先后关系的情况,可以把登录当一个step来引用。
    httprunner3.x 框架弱化了API层的概念,直接写testcase了,如果是单个接口的用例,可以当step去引用。

    场景案例

    我现在有一个登陆接口A,登陆成功后返回一个token值。有一个获取绑定卡号的接口B,但是接口B必须要先登录后传登录的token才能访问
    A接口登录接口文档基本信息

    B接口获取绑定卡号的接口文档基本信息

    • 访问地址:http://127.0.0.1:8000/api/v1/userinfo/
    • 请求类型:GET
    • 请求头部:Content-Type: application/json
    • 请求头部token参数: Authorization: Token xxxxx login token xxxxx

    先不带token去访问接口B,使用命令行工具httpie测试接口

    C:Usersdell>http http://127.0.0.1:8000/api/v1/userinfo/
    HTTP/1.1 401 Unauthorized
    Allow: GET, POST, HEAD, OPTIONS
    Content-Length: 58
    Content-Type: application/json
    Date: Sat, 21 Sep 2019 14:06:15 GMT
    Server: WSGIServer/0.2 CPython/3.6.0
    Vary: Accept
    WWW-Authenticate: Token
    X-Frame-Options: SAMEORIGIN
    
    {
        "detail": "Authentication credentials were not provided."
    }
    

    不带token会提示没权限访问:401 Unauthorized

    登录接口用例

    先写一个登录的接口用例

    # NOTE: Generated By HttpRunner v3.1.4
    # FROM: test_login.yml
    # 作者-上海悠悠 QQ交流群:717225969
    # blog地址 https://www.cnblogs.com/yoyoketang/
    
    
    from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase
    
    
    class TestCaseTestLogin(HttpRunner):
    
        config = Config("logincase").base_url("http://127.0.0.1:8000").export(*["token"])
    
        teststeps = [
            Step(
                RunRequest("steplogin")
                .with_variables(**{"user": "test", "psw": "123456"})
                .post("/api/v1/login")
                .with_json({"username": "$user", "password": "$psw"})
                .extract()
                .with_jmespath("body.token", "token")
                .validate()
                .assert_equal("status_code", 200)
                .assert_equal("body.code", 0)
                .assert_equal("body.msg", "login success!")
                .assert_length_equal("body.token", 40)
            ),
        ]
    
    
    if __name__ == "__main__":
        TestCaseTestLogin().test_start()
    

    查询个人信息

    查询个人信息接口先用到登录的token,前面已经写过登录了,于是可以直接引用登录用例, 当成一个测试步骤

    RunTestCase(name)

    • RunTestCase 在一个步骤中用于引用另一个测试用例调用。
    • name RunTestCase 的参数用于指定测试步骤名称,该名称将显示在执行日志和测试报告中。
    • .with_variable() 与 RunRequest 的.with_variables 一样,定义变量
    • .call() 指定引用的测试用例类,需先导入这个类。
    • .export() 指定要从引用的测试用例导出的会话变量名称。导出的变量可以被后续的测试步骤引用。
    # NOTE: Generated By HttpRunner v3.1.4
    # FROM: testcaseslogin_userinfo.yml
    # 作者-上海悠悠 QQ交流群:717225969
    # blog地址 https://www.cnblogs.com/yoyoketang/
    
    
    import sys
    from pathlib import Path
    
    sys.path.insert(0, str(Path(__file__).parent.parent))
    
    
    from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase
    from testcases.test_login_test import TestCaseTestLogin as TestLogin
    
    
    class TestCaseLoginUserinfo(HttpRunner):
    
        config = Config("logincase").base_url("http://127.0.0.1:8000").export(*["token"])
    
        teststeps = [
            Step(RunTestCase("step1 login")
                 .call(TestLogin)
                 .export(*["token"])),
            Step(
                RunRequest("step2 get user info")
                .get("/api/v1/userinfo/")
                .with_headers(
                    **{
                        "Content-Type": "application/json",
                        "User-Agent": "python-requests/2.18.4",
                        "Authorization": "Token $token",
                    }
                )
                .validate()
                .assert_equal("status_code", 200)
                .assert_equal('headers."Content-Type"', "application/json")
                .assert_equal("body.code", 0)
                .assert_equal("body.data[0].mail", "283340479@qq.com")
            ),
        ]
    
    
    if __name__ == "__main__":
        TestCaseLoginUserinfo().test_start()
    

    运行结果:

    运行结果是执行2个用例,先执行登录,再执行后面的查询。

  • 相关阅读:
    jQuery之事件even
    jQuery之动画效果show()......animate()
    jQuery之DOM
    css开发经验&错误习惯
    jQuery语法基础&选择器
    3D案例,导航,导航升级版
    css3实践—创建3D立方体
    CSS3弹性盒模型之Flexbox是布局模块box-sizing & box-orient & box-direction & box-ordinal-group
    Linux-ps命令
    Linux->卸载Mysql方法总结
  • 原文地址:https://www.cnblogs.com/yoyoketang/p/14890583.html
Copyright © 2011-2022 走看看