当前位置: 首页 > 面试题库 >

将pytest与src层一起使用

蓟和煦
2023-03-14
问题内容

pytest建议添加一个附加目录来分隔项目中的源代码:

my_package
├── src  # <-- no __init__.py on this layer
│   └── my_package
│       ├── __init__.py
│       └── util_module
│           ├── __init__.py
│           └── utils.py
└── tests
    ├── __init__.py
    └── test_util_module
        ├── __init__.py
        └── test_utils.py

可悲的是,他们在这种情况下对测试代码中的导入应该如何工作一无所获[1],在这个幼稚的示例[2]中,这对于我的IDE来说是很好的,但pytest导致以下错误:

my_package $ pytest

====================== test session starts ======================
platform linux -- Python 3.6.4, pytest-3.5.1, py-1.5.3, pluggy-0.6.0
rootdir: /home/user/workspace/my_package, inifile:
collected 0 items / 1 errors

============================ ERRORS =============================
___ ERROR collecting tests/test_util_module/test_utils.py ___
ImportError while importing test module '/home/user/workspace/my_package/tests/test_util_module/test_utils.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
tests/test_util_module/test_utils.py:1: in <module>
    from test.test_module.some_file import starify
E   ModuleNotFoundError: No module named 'my_package.util_module'
!!!! Interrupted: 1 errors during collection !!!!!

我可以通过将测试的导入更改为来解决此问题from src.my_package.util_module.utils import starify,但随后我的IDE投诉该src部分多余,因此我想将其保留。

[1]
:情况不再如此。从3.7.3版本开始,pytest建议在@hoefling的答案的最佳实践的顶部也提供可编辑的安装。

[2] :设置为virtualenv env -p python3.6; source env/bin/activate; pip install pytest


问题答案:

调整PYTHONPATH(如注释中所建议)是解决导入问题的一种可能性。另一个方法是conftest.pysrc目录中添加一个空文件:

$ touch src/conftest.py

并且pytest将添加srcsys.path。这是诱骗pytest向中添加代码库的简单方法sys.path

但是,src当您打算构建发行版时,通常会选择布局,例如,提供setup.py(在这种情况下)显式指定根软件包目录:

from setuptools import find_packages, setup


setup(
    ...
    package_dir={'': 'src'},
    packages=find_packages(where='src'),
    ...
)

并在仍在开发时以开发模式(通过python setup.py developpip install --editable .)安装该软件包。这样,您的软件包my_package就可以正确地集成到Python的站点软件包结构中,而无需费心了PYTHONPATH



 类似资料:
  • 我用的是py。测试以运行测试。我将它与pytest xdist一起使用以并行运行测试。我想在测试中看到print语句的输出。 我有:Ubuntu 15.10,Python 2.7.10,pytest-2.9.1,plugy-0.3.1。 这是我的测试文件: 当我跑步的时候。测试时,没有打印任何内容。这是预期的:默认情况下,py。测试捕获输出。 当我跑步的时候。test-s,它会打印test_a和t

  • 问题内容: 因此,我一直在为这个(应该是)简单的练习而绞尽脑汁,以使该程序将日期字符串转换为对象,对其进行格式化,并在完成后将其作为字符串再次返回。 这是程序的最后一点,它从文件中获取一小段文本,将其分解为单独的记录,然后将记录分解为单独的数据并将它们分配给个人对象。 我已经在多个位置检查了该代码,并且该代码完全执行了应该执行的操作,直到调用了format函数(该函数抛出)为止。为对象分配了应该分

  • 问题内容: 我想在目录中获取具有特定扩展名的文件列表。在中,我看到了可以做到这一点的方法。 由于我需要特定的扩展名,因此我创建了一个。但是,当我与此一起使用时,出现编译错误。我以为自以来,我应该能够做到这一点。代码如下: 最后一行显示编译错误: 类型的方法不适用于类型的参数 我正在尝试使用,不是。为何编译器无法识别这一点? 如果我编写自己的扩展筛选器,则此方法有效。我宁愿使用而不愿自己写。我究竟做

  • 问题内容: 我正在尝试在我的watchKit应用中使用firebase数据库。我已经在我的iPhone应用程序上开发了此功能,但是发现在我的Watch应用程序上很难做到这一点。当我尝试将firebase导入watch应用程序的VC类中时,它正在创建error 。 可以在Watch app中使用Firebase吗? 问题答案: 可悲的是,没有支持,并由于这样的事实,有没有支持在这些版本中,并高度依赖

  • 问题内容: 当请求来自Ajax.ActionLink(使用Http方法发布)时,是否可以在控制器操作上使用ValidateAntiForgeryToken属性。替代方法似乎是手动滚动JQuery Ajax请求,但我很好奇MVC Ajax框架中是否有办法。 问题答案: 我还没看过。您必须将令牌放入POST中记录的数据中。每次都使用相同的防伪令牌ID(或名称,我不记得了),但是您必须非常小心,并确保您

  • 问题内容: 最近,我开始与路由器一起使用来构建应用程序。 我通常将use 用于依赖项和代码管理。但是,当我尝试包含包含语法的文件时会出现问题。 这就是我目前所拥有的: 如何将IndexComponent放在其自己的文件中并在此文件中调用它?我尝试了通常的方法(与骨干和反应相同),但是由于语法错误。 问题答案: 所以我自己弄清楚了。 我从此仓库获得了必要的文件和说明:jsx- requirejs-p