我希望使用 pytest 对项目中的所有 AWS Lambda 代码进行单元测试。由于我必须配置目录结构才能与基础设施即代码工具一起使用,每个 Lambda 都位于它自己的 CloudFormation 堆栈中,因此我有一个相当非标准的目录结构。我无法让 pytest 在我的所有 Lambda 函数中运行所有测试 - 理想情况下,我希望通过在项目的根目录中运行“pytest”来实现此功能。
目录结构如下(它是值得注意的是,改变结构不是一个选项):
- Project_Directory
- stack1
- product.template.yaml
- src
- lambda1
- lambda_function.py
- requirements.txt
- tests
- __init__.py
- test_functions
- __init__.py
- test_lambda1.py
- stack2
- product.template.yaml
- src
- lambda2
- lambda_function.py
- requirements.txt
- tests
- __init__.py
- test_functions
- __init__.py
- test_lambda2.py
- conftest.py
- pytest.ini
每个 test_lambda.py 文件都从 lambda_function.py 文件导入,如下所示:
from src.lambdax.lambda_function import func1, func2
当项目目录中只有一个堆栈时,pytest 没有问题测试。但是,当添加第二个堆栈时,pytest 会失败并出现以下错误:
ModuleNotFoundError: No module named 'tests.test_functions.test_lambda2'
此外,当直接针对每个堆栈目录运行 pytest 时,测试运行不会出现任何问题。这正在运行
pytest stack1
和
pytest stack2
期望:从project_directory运行“pytest”会产生所有lambda的所有测试。
我尝试将
testpaths = stack1 stack2
和
testpaths = stack1/tests stack2/tests
添加到pytest.ini以 no成功。
我在这里缺少什么,我猜可能是一些模块名称空间冲突,但我不知道如何解决它!非常感谢有关此问题的任何建议!
问题出在你的测试模块的导入方式上。由于你的测试目录结构是嵌套的,所以 pytest 默认情况下无法正确地解析相对导入。
你有两个选择来解决这个问题:
选项 1:使用
sys.path
修改 Python 路径
你可以通过在
conftest.py
文件中添加你的项目根目录来修改 Python 路径。这将允许 pytest 正确地找到你的模块。
-
创建
conftest.py
: 如果还没有,在你的Project_Directory
中创建一个conftest.py
文件。 -
添加以下代码到
conftest.py
: ```python import os import sys
# 获取项目根目录 PROJECT_ROOT = os.path.abspath(os.path.join(os.path.dirname( file )))
# 将项目根目录添加到 Python 路径 sys.path.insert(0, PROJECT_ROOT) ```
-
更新导入:
你不需要更改测试文件中的任何导入。
sys.path
修改将允许 Python 正确地找到这些模块。
现在,当你从
Project_Directory
运行
pytest
时,它应该能够找到所有测试并在不出现
ModuleNotFoundError
的情况下运行它们。
选项 2:使用绝对导入
另一种方法是在你的测试文件中使用绝对导入。这将明确告诉 Python 在哪里找到模块,而不管你从哪里运行
pytest
。
-
更新导入: 在你的
test_lambda.py
文件中,将相对导入更改为绝对导入。例如,将:python from src.lambdax.lambda_function import func1, func2
改为:python from Project_Directory.stackx.src.lambdax.lambda_function import func1, func2
-
运行 pytest: 你应该能够从
Project_Directory
运行pytest
,而无需修改pytest.ini
。
我个人更喜欢 选项 1 ,因为它不需要更改你的测试文件中的导入语句,并且更加灵活,可以适应代码库中的更改。但是,如果你更喜欢使用绝对导入的明确性,则选项 2 也是一个有效的解决方案。
标签:python,aws-lambda,pytest From: 78829984