先给个结论:Locust 它自己不会主动去读 `.env` 文件,这事儿得靠我们手动来。要么用 `python-dotenv` 在 Python 层面加载,要么在 Shell 启动命令里显式注入。否则,你写的 `os.environ.get()` 大概率会返回空值。下面把两种靠谱方案掰开揉碎讲清楚。
很多人在 Locust 测试脚本里直接用 `os.environ.get("VALUE")`,结果死活拿不到值,返回空字符串。根本原因其实很简单:Locust 进程启动时,压根儿就没自动加载 .env 文件。这和 Django、Flask 那些框架不同,Locust 本身不集成 dotenv 功能。`.env` 文件说白了就是个约定俗成的配置存储格式,必须由我们显式解析并注入到进程环境里,它才会生效。
那么,怎么解决?
✅ 推荐方案一:Python 侧加载(简洁、跨平台、推荐)
最省心的办法,是在 Python 层面直接上手。在 `locust.py` 文件开头加上对 `python-dotenv` 的支持(记得先装:`pip install python-dotenv`):
from dotenv import load_dotenv
import os
from locust import HttpUser, task, between
# 自动加载同目录下的 .env 文件(支持相对路径)
load_dotenv()
apiKey = os.environ.get("VALUE", "")
if not apiKey:
raise ValueError("Missing required environment variable: VALUE")
class Api(HttpUser):
wait_time = between(1, 5)
@task
def test_api(self):
self.client.get(f"/api/test/apiKey={apiKey}")
有几个细节需要注意:
load_dotenv()默认加载当前工作目录下的 `.env` 文件。如果文件在别的路径(比如项目根目录),记得传 `dotenv_path` 参数,比如 `load_dotenv(".env")` 或 `load_dotenv("../.env")`。- 确保 `.env` 文件里没有多余空格、没有引号、键名大小写严格匹配。比如写成 `VALUE=diuqriqjqj` 就行,别画蛇添足加引号或空格。
- 务必把 `load_dotenv()` 放在所有 `os.environ.get()` 调用之前,而且只调用一次就够了。
✅ 方案二:Shell 侧注入(无需额外依赖,适合 CI/CD)
如果你不想多装一个包,或者你正在走 CI/CD 管道,那 Shell 侧注入也是个好选择。在启动命令里由 Shell 直接加载并导出变量:
# Linux/macOS:使用 set -a + source(推荐) set -a; source .env; set +a; locust -f locust.py
或者用 Makefile 来管理(虽然原答案里也有示例,但下面这个更简洁可靠):
# 确保 .env 格式为 KEY=VALUE(无空格/引号),然后: export $(grep -v '^#' .env | xargs) && locust -f locust.py
这行命令先过滤掉注释行,再把键值对导出为环境变量,接着启动 Locust。一步到位,干净利落。
? 总结:
- ❌ 错误做法:只跑 `locust -f locust.py`,不加载 `.env` → 变量为空,测试直接翻车。
- ✅ 正确做法:要么在 Python 里用 `load_dotenv()` 主动加载,要么在 Shell 里 `source` 或 `export` 后再启动。
- ? 安全提示:千万别把敏感密钥(比如 API Key)硬编码在 `locust.py` 里。始终通过环境变量管理,同时记得把 `.env` 加入 `.gitignore`,别让私密信息跟着代码库一起飞。
说到底,方法就上面两种,选一个顺手的一劳永逸。现在,去试试吧。