• httprunner 3.x--参数化parameters(参数和值多对一,多对多,一对一等),csv文件


    上一篇里写的httprunner 3.x--variables变量和声明(变量和值一一对应) 中的variables是对  “一对一”的参数有用,

    但对于变量需要多个数值,比如登录账号需要多个账号密码的,总不能一个账号密码写一个测试用例,这时候就需要用到关键字parameters

    参数化:多对多(多对一)
        直接指定参数
        csv导入(相对路径,绝对路径)
            yml格式可用相对路径,也可用绝对路径
            pytest只能用绝对路径(用相对路径会报错,还没找到解决办法)
    
    参数化:一多一

    【参数化:多对多(多对一是一样的)】

    一 . 直接指定参数列表:

    该种方式最为简单易用,适合参数列表比较小的情况

    【yml格式的测试用例】

    config:
        name: "hz测试"
        parameters:
          uid: [1**97,1245]
          choujiang_id: [***,33]
          username: [**,mm]
        base_url: "https://lottery.hz.z****in.com"
        verify: False
    
    teststeps:
    -
        name: "接口test /lotteryTest.php"
        request:
            method: GET
            url: /lotteryTest.php
            params:
              uid: $uid
              choujiang_id: $choujiang_id
              username: $username
        validate:
            - eq : ["status_code", 200]
            - eq : ["body.status", 1]

    其中打**的参数是正确,username是任意都行,所以上面的参数有8种组合

    [1**97,***,**]    [1**97,***,mm]   [1**97,33,**]   [1**97,33,mm]

    [1245,***,**]   [1234,***,mm]   [1245,33,**]   [1245,33,mm]

    运行结果如下:

      

    【pytest格式测试用例】

    # NOTE: Generated By HttpRunner v3.1.3
    # FROM: testcases/hetest_re.yml
    
    
    import pytest
    from httprunner import Parameters
    
    
    from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase
    
    
    class TestCaseHetestRe(HttpRunner):
        @pytest.mark.parametrize(
            "param",
            Parameters(
                {"uid": [1**7, 1245], "choujiang_id": [***, 33], "username": ["**", "mm"]}
            ),
        )
        def test_start(self, param):
            super().test_start(param)
    
        config = (
            Config("hz测试").base_url("https://lottery.hz.z*****in.com").verify(False)
        )
    
        teststeps = [
            Step(
                RunRequest("接口test /lotteryTest.php")
                .get("/lotteryTest.php")
                .with_params(
                    **{
                        "uid": "$uid",
                        "choujiang_id": "$choujiang_id",
                        "username": "$username",
                    }
                )
                .validate()
                .assert_equal("status_code", 200)
                .assert_equal("body.status", 1)
            ),
        ]
    
    
    if __name__ == "__main__":
        TestCaseHetestRe().test_start()

    然后用pytest方法运行

    运行结果如下:

    二 . csv导入

    1.引用外部的csv文件,文件位置和debugtalk.py同一级别,即项目的根目录(也可以在该目录下指定相对路径,比如data/*.csv)
    
    2.一个csv只存放一个字段

    3.csv文件里的字段名要和实际的一致

    1)csv文件位置和debugtalk.py同一级别

    同时在pycharm中能看到该csv文件

    在 YAML/JSON 测试用例文件中,就可以通过内置的 parameterize(可简写为 P)函数引用 CSV 文件

    引用csv文件语法${P(user_name.csv)}

    【yml格式】

    config:
        name: "hz测试"
        parameters:
          uid: ${parameterize(hzuid.csv)}
          choujiang_id: ${parameterize(hzcjid.csv)}
          username: [**,mm]
        base_url: "https://lottery.hz.z****n.com"
        verify: False

    【pytest格式】

    pytest格式运用csv文件时,csv要存放在和测试用例同一目录下,要不然会报错(或者用绝对路径,下面会有介绍)

    @pytest.mark.parametrize(
            "param",
            Parameters(
                {
                    "uid": "${parameterize(hzuid.csv)}",
                    "choujiang_id": "${parameterize(hzcjid.csv)}",
                    "username": ["**", "mm"],
                }
            ),
        )

     

    2)csv文件如果是相对路径,情况如下:

     【yml格式】

       引用如下:

    config:
        name: "hz测试"
        parameters:
          uid: ${parameterize(data/hzuid.csv)}
          choujiang_id: ${parameterize(data/hzcjid.csv)}
          username: [**,mm]
        base_url: "https://lottery.hz.z****in.com"
        verify: False

    运行结果同样正常!!!

    【pytest格式】

    pytest格式要用绝对路径:

    @pytest.mark.parametrize(
            "param",
            Parameters(
                {
                    "uid": "${parameterize(/Users/may/Documents/automatortest/httprunner/testHttprunner/mayhttprunner/data/hzuid.csv)}",
                    "choujiang_id": [***,125],
                    "username": ["**", "mm"],
                }
            ),
        )
        def test_start(self, param):
            super().test_start(param)

    运行结果:

    --------------------------------------------------------------------------

    --------------------------------------------------------------------------

    【参数化:一对一】

    csv文件如下

     

     要的目标是两组参数

    [1**7,***,**]    [4353,33,mm]

    把参数关联起来,用 “- ”关联

    uid-choujiang_id-username: ${parameterize(data/hz1t1.csv)}

    【yml格式】
    config:
        name: "hz测试"
        parameters:
          uid-choujiang_id-username: ${parameterize(data/hz1t1.csv)}
    
        base_url: "https://lottery.hz.z****n.com"
        verify: False
    
    teststeps:
    -
        name: "接口test /lotteryTest.php"
        request:
            method: GET
            url: /lotteryTest.php
            params:
              uid: $uid
              choujiang_id: $choujiang_id
              username: $username
        validate:
            - eq : ["status_code", 200]
            - eq : ["body.status", 1]

    运行结果:

    两组参数即两个用例

    【pytest格式】如下:(用绝对路径)

    # NOTE: Generated By HttpRunner v3.1.3
    # FROM: testcases/hzoto.yml
    
    
    import pytest
    from httprunner import Parameters
    
    
    from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase
    
    
    class TestCaseHzoto(HttpRunner):
        @pytest.mark.parametrize(
            "param",
            Parameters({"uid-choujiang_id-username": 

    "${parameterize(/Users/may/Documents/automatortest/httprunner/testHttprunner/mayhttprunner/data/hz1t1.csv)}"}),
    )
    def test_start(self, param): super().test_start(param) config = ( Config("hz测试").base_url("https://lottery.hz.z****n.com").verify(False) ) teststeps = [ Step( RunRequest("接口test /lotteryTest.php") .get("/lotteryTest.php") .with_params( **{ "uid": "$uid", "choujiang_id": "$choujiang_id", "username": "$username", } ) .validate() .assert_equal("status_code", 200) .assert_equal("body.status", 1) ), ] if __name__ == "__main__": TestCaseHzoto().test_start()

    运行结果如下:

     

  • 相关阅读:
    随笔2
    随笔
    关于updateElement接口
    随笔1
    本地访问正常,服务器访问乱码 记录
    Redis (error) NOAUTH Authentication required.解决方法
    tomcat启动很慢 停留在 At least one JAR was scanned for TLDs yet contained no TLDs.
    微信公众号消息回复
    微信公众号 报token验证失败
    idea中web.xml报错 Servlet should have a mapping
  • 原文地址:https://www.cnblogs.com/may18/p/13377901.html
Copyright © 2020-2023  润新知