Skip to content

第 9 章 · 参数化与数据驱动

本章目标:学会用环境变量、CSV/JSON 文件和每虚拟用户独立数据来驱动测试,避免硬编码。

9.1 环境变量注入

最简单的参数化方式是通过环境变量控制目标地址和并发参数:

python
import os
from locust import HttpUser, task, between

class ApiUser(HttpUser):
    host = os.getenv("TARGET_HOST", "https://httpbin.org")
    wait_time = between(
        float(os.getenv("MIN_WAIT", "1")),
        float(os.getenv("MAX_WAIT", "3"))
    )

    @task
    def get_data(self):
        self.client.get("/get")

运行时通过环境变量覆盖:

bash
TARGET_HOST=https://staging.example.com locust -f locustfile.py

9.2 CSV 数据加载

python
import csv
from locust import HttpUser, task, between

# 启动时加载全部测试数据
with open("users.csv") as f:
    USERS = list(csv.DictReader(f))

class LoginUser(HttpUser):
    wait_time = between(1, 3)

    def on_start(self):
        # 每个虚拟用户从队列中取一个账号(避免重复登录)
        self.user_data = USERS.pop() if USERS else {"username": "default", "password": "test"}

    @task
    def login_and_browse(self):
        self.client.post("/login", json=self.user_data)
        self.client.get("/dashboard")

9.3 JSON 配置文件

python
import json
from locust import HttpUser, task, between

with open("config.json") as f:
    config = json.load(f)

class ConfigurableUser(HttpUser):
    host = config["target_url"]
    wait_time = between(*config["wait_range"])

    @task
    def hit_endpoint(self):
        for ep in config["endpoints"]:
            self.client.get(ep)

9.4 每虚拟用户独立数据

使用 queue.Queue 确保每个虚拟用户拿到不重复的测试数据:

python
import queue
from locust import HttpUser, task, between

# 创建数据队列
data_queue = queue.Queue()
for i in range(1000):
    data_queue.put({"email": f"user{i}@test.com", "password": "pass123"})

class SignupUser(HttpUser):
    wait_time = between(0.5, 2)

    def on_start(self):
        if data_queue.empty():
            self.environment.runner.quit()  # 数据用完则停止测试
        self.credentials = data_queue.get_nowait()

    @task
    def signup(self):
        self.client.post("/register", json=self.credentials)
        data_queue.task_done()

本章小结

  • 环境变量是最轻量的参数化方式,适合切换目标环境;
  • CSV/JSON 文件适合批量测试数据;
  • queue.Queue 保证每个虚拟用户拿到不重复的数据,用完自动停止。

🧪 随堂测验

点击你认为正确的选项。答错时会展示正确答案与原因解析。

1. 为什么使用 queue.Queue 而不是普通列表来存储测试数据?

2. 数据队列用完后应该怎么处理?

3. 环境变量注入的主要优势是什么?

4. on_start() 适合做什么参数化操作?

🛠️ 动手实践

  1. 创建一个包含 100 条测试用户数据的 CSV 文件,编写脚本让每个虚拟用户使用不同账号登录。
  2. 用环境变量切换测试目标从 staging 到 production(仅改环境变量不改代码)。
  3. 实现"数据用完自动停止测试"的逻辑。