相关疑难解决方法(0)

确保py.test包含sys.path中的应用程序目录

我有一个项目目录结构如下(我认为这很标准):

my_project
    setup.py
    mypkg
        __init__.py
        foo.py
    tests
        functional
            test_f1.py
        unit
            test_u1.py
Run Code Online (Sandbox Code Playgroud)

我正在使用py.test作为我的测试框架,我希望能够py.test testsmy_project目录中运行以运行我的测试.这确实有效,直到我尝试import mypkg在测试中使用(例如)导入我的应用程序代码.那时,我收到错误"没有名为mypkg的模块".在进行一些调查时,似乎py.test运行测试与测试文件的目录sys.path,但不是py.test运行的目录.

为了解决这个问题,我conftest.py在我的tests目录中添加了一个文件,其中包含以下代码:

import sys, os

# Make sure that the application source directory (this directory's parent) is
# on sys.path.

here = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0, here)
Run Code Online (Sandbox Code Playgroud)

这似乎有效,但它是确保测试看到应用程序代码的好方法吗?有没有更好的方法来实现这一点,或者我在如何构建项目时做错了什么?

我已经看过其他一些使用的项目py.test(例如,pip但是我看不到代码做了这样的事情,但是运行py.test tests似乎在那里工作.我不知道为什么,但我担心他们可能以更简单的方式取得了同样的结果.

我查看了py.test文档,但是我看不出这个问题的解释或建议的方法来处理它.

python unit-testing pytest

42
推荐指数
4
解决办法
1万
查看次数

pytest 的 ModuleNotFoundError

我希望我的测试文件夹与我的应用程序代码分开。我的项目结构是这样的

myproject/
  myproject/
    myproject.py
    moduleone.py
  tests/
    myproject_test.py
Run Code Online (Sandbox Code Playgroud)

我的项目.py

from moduleone import ModuleOne

class MyProject(object)
....
Run Code Online (Sandbox Code Playgroud)

myproject_test.py

from myproject.myproject import MyProject
import pytest

...
Run Code Online (Sandbox Code Playgroud)

我使用myproject.myproject因为我使用命令

python -m pytest
Run Code Online (Sandbox Code Playgroud)

从项目根目录 ./myproject/

但是,然后这些模块中的导入失败

E ModuleNotFoundError: 没有名为“moduleone”的模块

我正在运行 Python 3.7 并已阅读自 3.3 以来,__init__不再需要空文件,这意味着我的项目成为隐式命名空间包

但是,我尝试在其中添加__init__.py文件myproject/myproject/并尝试在其中添加conftest.py文件myproject/但都不起作用

我已经阅读了一些答案,这些答案说要弄乱路径,然后在其他问题中投票说不要

什么是正确的方法,我错过了什么?

编辑;

可能相关,我使用 arequirements.txt使用 pip 安装 pytest。这可能有关系吗?如果是这样,在这种情况下安装 pytest 的正确方法是什么?

编辑2:

其中的路径之一sys.path …

python pytest python-3.x docker

32
推荐指数
8
解决办法
2万
查看次数

将pytest与src图层一起使用

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
Run Code Online (Sandbox Code Playgroud)

可悲的是,他们没有说1关于测试代码中的导入应该如何在这种情况下工作,这对于我的IDE在这个天真的例子2中工作得很好,但是导致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 …
Run Code Online (Sandbox Code Playgroud)

python pytest

13
推荐指数
2
解决办法
2036
查看次数

标签 统计

pytest ×3

python ×3

docker ×1

python-3.x ×1

unit-testing ×1