首页 > 编程问答 >配置 Pytest 以跨多个项目目录查找测试

配置 Pytest 以跨多个项目目录查找测试

时间:2024-08-04 16:57:51浏览次数:16  
标签:python aws-lambda pytest

我希望使用 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 正确地找到你的模块。

  1. 创建 conftest.py : 如果还没有,在你的 Project_Directory 中创建一个 conftest.py 文件。

  2. 添加以下代码到 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) ```

  1. 更新导入: 你不需要更改测试文件中的任何导入。 sys.path 修改将允许 Python 正确地找到这些模块。

现在,当你从 Project_Directory 运行 pytest 时,它应该能够找到所有测试并在不出现 ModuleNotFoundError 的情况下运行它们。

选项 2:使用绝对导入

另一种方法是在你的测试文件中使用绝对导入。这将明确告诉 Python 在哪里找到模块,而不管你从哪里运行 pytest

  1. 更新导入: 在你的 test_lambda.py 文件中,将相对导入更改为绝对导入。例如,将: python from src.lambdax.lambda_function import func1, func2 改为: python from Project_Directory.stackx.src.lambdax.lambda_function import func1, func2

  2. 运行 pytest: 你应该能够从 Project_Directory 运行 pytest ,而无需修改 pytest.ini

我个人更喜欢 选项 1 ,因为它不需要更改你的测试文件中的导入语句,并且更加灵活,可以适应代码库中的更改。但是,如果你更喜欢使用绝对导入的明确性,则选项 2 也是一个有效的解决方案。

标签:python,aws-lambda,pytest
From: 78829984

相关文章

  • 完全用python 实现消息中间件2
    为了完善这个简单的消息中间件,我们可以添加以下功能:消息持久化:虽然在这个示例中我们不会使用数据库,但我们可以将消息保存到文件中,以模拟持久化存储。消息确认:添加一个机制来确认消息已经被消费。并发控制:确保在多线程或多进程环境中消息的安全处理。以下是更新后的代码:fr......
  • 16:Python一些常用的变量命名
    变量名的命名直接影响到程序的易读性,好的变量名应该简洁、易于理解。一、单字符变量名数学中通常用x,y来表示坐标,同样的,在命名变量时,可以使用一些具有特定含义的单个字符。这样的变量名兼具有意义和极简两大优点,作为编程人员应熟记。具体列举如下。i、j、k:数值(integer(整数))......
  • 15:Python数据类型的综合对比整理
    #Python有六个标准的数据类型:#Numbers(数字)int#String(字符串)str字符串一旦创建,不可修改,一旦修改或者拼接,都会造成重新生成字符串#List(列表)list中号括起来,逗号分开,可以是数字、字符串、列表、布尔值,列表可以嵌套任何类型,列表有序元素可以被修改#Tup......
  • 用Python打造精彩动画与视频, 6.2 使用Manim进行数学和科学可视化
     6.2使用Manim进行数学和科学可视化Manim(MathematicalAnimationEngine)是一款强大的动画制作工具,尤其适用于数学和科学领域的可视化。它由3Blue1Brown的GrantSanderson开发,旨在通过动画演示复杂的数学概念,使其更易于理解。使用Manim,用户可以创建高质量的数学动画,从简单的......
  • 用Python打造精彩动画与视频,5.3 使用Manim创建简单动画
     5.3使用Manim创建简单动画在这一节中,我们将介绍如何使用Manim创建简单的动画。我们将从基本的场景构建开始,然后演示如何添加动画效果。通过这些示例,你将能够掌握使用Manim创建各种动画的基本技能。5.3.1创建一个简单的场景Manim中的基本单元是场景(Scene)。每个场景都是一......
  • 用Python打造精彩动画与视频, 5.2 安装和设置Manim
     5.2安装和设置ManimManim是一个强大的动画库,用于创建高质量的数学动画。它最初由3Blue1Brown的GrantSanderson开发,并被广泛用于教育和展示。以下是安装和设置Manim的详细步骤。5.2.1安装ManimManim需要Python环境和一些依赖库。在安装Manim之前,请确保已经......
  • 用Python打造精彩动画与视频,6.1 复杂动画场景的构建
     第六章:探索Manim的潜力6.1复杂动画场景的构建在本节中,我们将深入探索如何使用Manim构建复杂的动画场景。Manim是一款功能强大的Python库,广泛应用于数学可视化和教育视频制作。通过理解并掌握Manim的高级功能和技巧,你将能够创建出引人入胜且具有高可读性的动画场景。6.1.1......
  • 在 Python 中从 HTML 中抓取嵌入的 Google Sheet
    这对我来说相对棘手。我正在尝试提取来自python中的google工作表的嵌入表。这是链接我不拥有该工作表,但它是公开可用的。这是迄今为止我的代码,当我输出标题时,它向我显示“”。任何帮助将不胜感激。最终目标是将此表转换为pandasDF。多谢你们importlx......
  • 如何使用 Python 在 Google 或 DuckDuckGo 中快速获取答案
    我有一个人工智能助手项目,我希望它在互联网上搜索。我想使用适用于Python的GoogleQuickAnswerBox或DuckDuckGoInstantAnswerAPI。我看到了其他问题,但它们对我没有多大帮助。这是我想要实现的一个示例:问题:什么是长颈鹿?Google的答案:DuckDuckGo的......
  • 如何为可以在递归调用中重新分配的 python 函数制定类型提示?
    采取以下最小示例:S=TypeVar("S",bound=int|str)defmeth(a:S)->S:ifa=="5":returnstr(meth(int(a)))returna特别是,上面的方法可以采用字符串或整数。它总是返回与其输入相同类型的值,但它可以递归地调用自身,在这种情况下,S的值......