第 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.py9.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() 适合做什么参数化操作?
🛠️ 动手实践
- 创建一个包含 100 条测试用户数据的 CSV 文件,编写脚本让每个虚拟用户使用不同账号登录。
- 用环境变量切换测试目标从 staging 到 production(仅改环境变量不改代码)。
- 实现"数据用完自动停止测试"的逻辑。