Httprunner3.x参数化示例

本文详细介绍了如何在HttpRunner3.x中进行参数化操作,包括独立参数、关联参数(直接枚举和生成笛卡尔积)以及使用CSV文件进行参数化。通过示例代码展示了不同方式的应用,并提到了在特定情况下需要修改源码来支持某些功能,如使用CSV文件时,建议从环境变量获取文件路径,以避免路径问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

框架作者没有对pytest格式的测试用例做一个参数化的官方demo,这里补充一下.

如果要对断言做关联参数化,框架本身是不支持的,需要改源码:这里-优化断言正则匹配
部分

只参数化请求报文内容的话,则不需要修改源码.


使用环境变量.env-作用域: 整个项目
在这里插入图片描述

import sys
from pathlib import Path
import pytest
sys.path.insert(0, str(Path(__file__).parent.parent))


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


class TestCaseBattle(HttpRunner):

    config = (
        Config("battle: login")
        .base_url("http://xxx.xx.xx.225:12356")
        .verify(False)
    )

    teststeps = [

        Step(
            RunRequest("post form data")
            .with_variables(**{"res":"please select One Equipment"})
            .post("/login")
            .with_data({"username":"${ENV(username)}","password":"${ENV(password)}"}) #调用env变量
            .validate()
            .assert_equal("status_code", 200)
            .assert_regex_match("body", "${res}")
        ),
    ]


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


在config使用variables关键字和在step使用with_variables定义变量

import sys
from pathlib import Path
import pytest
sys.path.insert(0, str(Path(__file__).parent.parent))


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


class TestCaseBattle(HttpRunner):

    config = (
        Config("battle: login")
        .variables(
            **{
                "username": "gsky",
                "password": "gsky",
            }
        )
        .base_url("http://xxx.xx.xx.225:12356")
        .verify(False)
    )

    teststeps = [

        Step(
            RunRequest("post form data")
            .with_variables(**{"res":"please select One Equipment"})
            .post("/login")
            .with_data({"username":"$username","password":"$password"})
            .validate()
            .assert_equal("status_code", 200)
            .assert_regex_match("body", "${res}")
        ),
    ]


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


使用Parameters参数化

独立参数

代码

    @pytest.mark.parametrize(
        "param", Parameters({"equipmentid": ["10001","10002","10003"]})
    )
    def test_start(self, param):
        super().test_start(param)
关联参数-直接枚举

代码

    @pytest.mark.parametrize(
        "param",
        Parameters(
            {"enemyid-equipmentid-res": [
                   ["20001", "10002","You win Level 1"],
                   ["20001", "10001","Your and your enemy all dead!!!"],
                   ["", "10002","Error 9904: Your kill yourself!!"],
                   ["20004", "","Error 9905: Your fight your enemy by nothing!And you are  died!"],
                ]}
        ),
    )
    def test_start(self,param):
        super().test_start(param)
关联参数-生成笛卡尔积

各个参数会以笛卡尔积的方式组合.
下面会组合成四条测试用例
['gsky','gsky'],['gsky','gsky123'],['gsky123','gsky],['gsky123','gsky123]

import sys
from pathlib import Path
import pytest
sys.path.insert(0, str(Path(__file__).parent.parent))


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


class TestCaseBattle(HttpRunner):
   
    @pytest.mark.parametrize(
        "param",
        Parameters(
            {"username":["gsky","gsky123"],"password":["gsky","gsky123"]}
        ),
    )
    def test_start(self,param):
        super().test_start(param)
        
    config = (
        Config("battle: login")
        .base_url("http://xxx.xx.xx.225:12356")
        .verify(False)
    )

    teststeps = [

        Step(
            RunRequest("post form data")
            .with_variables(**{"res":"please select One Equipment"})
            .post("/login")
            .with_data({"username":"$username","password":"$password"})
            .validate()
            .assert_equal("status_code", 200)
            .assert_regex_match("body", "${res}")
        ),
    ]


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

使用csv文件枚举所有场景

使用csv文件参数化.对于项目来说,应该支持:

  1. 在测试用例里写入csv文件绝对路径
  2. 从环境变量里,拿到csv文件的绝对路径,测试用例里只写环境变量的name
    最好的实践是第二种方式.

不建议在测试文件中使用csv文件的相对路径,使用相对路径的话修改起来非常麻烦, 因此,框架改动后也就不支持这种方式.

对于csv文件参数化,需要修改源码.
loader.py中,csv_file = os.path.join(project_meta.RootDir, *csv_file.split("/"))注释掉,改为从.env文件中获取csv文件路径

        # make compatible with Windows/Linux  
        # csv_file = os.path.join(project_meta.RootDir, *csv_file.split("/"))
        try:
            temp = os.getenv(csv_file)
        except IOError:
            print('.evn文件中的环境变量account_path不存在')
        else:
            csv_file = temp

csv文件:
在这里插入图片描述

代码

import sys
from pathlib import Path
import pytest
sys.path.insert(0, str(Path(__file__).parent.parent))

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


class TestCaseBattle(HttpRunner):
    
    @pytest.mark.parametrize(
        "param",
        Parameters(
            {"username-password-res":"${P(battle_cases/account.csv)}"}
        ),
    )
    def test_start(self,param):
        super().test_start(param)

    config = (
        Config("battle: login")
		.base_url("http://xx.xx.xx.xx:12356")
        .verify(False)
    )

    teststeps = [

        Step(
            RunRequest("post form data")
            .post("/login")
            .with_data({"username":"$username","password":"$password"})
            .validate()
            .assert_equal("status_code", 200)
            .assert_regex_match("body", "${res}")

        ),
    ]


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

执行结果
在这里插入图片描述

<think>好的,我现在需要帮助用户了解HttpRunner框架的搭建方法。用户明确提到了安装配置和使用说明,所以我的回答需要覆盖这些方面。首先,我得回忆一下HttpRunner的基本安装步骤,可能包括Python环境、安装命令、版本检查等。 用户提供的引用中,引用[1]提到安装httprunner是通过pip install httprunner,并且提到了版本区别。引用[2]涉及到环境变量的配置和接口关联的方法,比如在.env文件中配置URL,然后在config中使用${ENV(变量名)}引用。引用[3]是关于Allure报告的集成,可能需要下载Allure并配置环境变量。引用[4]提到Postman用于接口调试,但用户的问题主要是HttpRunner的搭建,这部分可能作为补充内容。 接下来,我需要组织这些信息。安装部分应该包括Python环境准备、安装HttpRunner、验证安装。然后配置部分可能涉及项目结构创建、环境变量设置、配置文件的使用。使用说明需要涵盖测试用例的编写、运行测试、生成报告,可能还要提到与Postman的集成调试。 需要注意用户提到的LaTeX格式要求,但这个问题主要是技术步骤,可能不需要数学公式。不过要确保所有代码块和命令正确无误,比如pip命令和hrun的使用。此外,用户要求生成相关问题,可能需要围绕安装问题、配置技巧、测试用例编写、报告生成和调试工具等方面提问。 需要检查引用是否正确对应,例如引用[1]对应安装步骤,引用[2]对应环境配置,引用[3]对应Allure报告,引用[4]对应Postman调试。最后,确保回答结构清晰,分步骤说明,并自然地添加引用标识。</think>### HttpRunner框架搭建方法分步说明 #### 一、环境准备与安装 1. **Python环境要求** - 需要Python 3.6及以上版本 - 使用以下命令验证Python版本: ```bash python --version ``` 2. **安装核心组件** ```bash pip install httprunner # 安装最新稳定版[^1] pip install allure-pytest # 测试报告生成依赖[^3] ``` 3. **验证安装** ```bash hrun -V # 显示版本号(如v4.3.0) ``` #### 二、项目配置(以电商接口测试为例) 1. **创建项目结构** ```bash hrun startproject demo_project cd demo_project ``` 生成标准目录: ``` ├── testcases/ ├── reports/ ├── .env └── debugtalk.py ``` 2. **环境变量配置** [^2] 在`.env`文件中配置测试环境: ```ini ENV=test BASE_URL=https://api.example.com/v1 ``` 3. **全局配置`config`示例** ```yaml base_url: ${ENV(BASE_URL)} variables: app_key: "123456" verify: False ``` #### 三、测试用例开发 1. **基础接口测试用例**(YAML格式) ```yaml - config: name: 用户登录测试套件 - test: name: 成功登录 request: url: /login method: POST json: username: testuser password: "123456" validate: - eq: [status_code, 200] - contains: [content.token, "x234"] ``` 2. **参数化示例**(使用CSV文件) ```csv # login_data.csv username,password,expected_code testuser,123456,200 wronguser,123456,401 ``` #### 四、执行与报告生成 1. **运行测试** ```bash hrun testcases/ --alluredir=reports/allure ``` 2. **生成可视化报告** ```bash allure serve reports/allure # 需要提前配置allure环境变量 ``` #### 五、调试技巧 1. **Postman集成** [^4] - 使用Postman调试单接口 - 通过`Export`功能生成curl命令 - 在HttpRunner中转换为YAML测试用例 2. **调试模式** ```bash hrun --log-level debug testcases/login.yml ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值