相关疑难解决方法(0)

在pytest中,conftest.py文件有什么用?

我最近发现了pytest.看起来很棒.但是,我觉得文档可能更好.

我正在尝试了解哪些conftest.py文件的用途.

在我(当前很小的)测试套件中,我conftest.py在项目根目录中有一个文件.我用它来定义我注入测试的灯具.

我有两个问题:

  1. 这是正确使用的conftest.py吗?它有其他用途吗?
  2. 我可以拥有多个conftest.py文件吗?我什么时候想这样做?将举例说明.

更一般地说,您如何conftest.py在py.test测试套件中定义文件的目的和正确使用?

python testing pytest

166
推荐指数
5
解决办法
4万
查看次数

python无法导入模块

我正在使用Python编写一个包.我用virtualenv.我在virtualenv的.pth路径中设置了模块根目录的路径,这样我就可以在开发代码的同时导入包的模块并进行测试(问题1:这是一个好方法吗?).这工作正常(这是一个例子,这是我想要的行为):

(VEnvTestRc) zz@zz:~/Desktop/GitFolders/rc$ python
Python 2.7.12 (default, Jul  1 2016, 15:12:24) 
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from rc import ns
>>> exit()
(VEnvTestRc) zz@zz:~/Desktop/GitFolders/rc$ python tests/test_ns.py 
issued command: echo hello
command output: hello
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试使用PyTest,我会收到一些导入错误消息:

(VEnvTestRc) zz@zz:~/Desktop/GitFolders/rc$ pytest
=========================================== test session starts ============================================
platform linux2 -- Python 2.7.12, pytest-3.0.5, py-1.4.31, pluggy-0.4.0
rootdir: /home/zz/Desktop/GitFolders/rc, inifile: 
collected 0 items / 1 errors 

================================================== ERRORS ==================================================
________________________________ ERROR collecting tests/test_ns.py ________________________________
ImportError while importing …
Run Code Online (Sandbox Code Playgroud)

python import pytest

72
推荐指数
16
解决办法
5万
查看次数

Pytest:如何使用输入调用测试函数?

我有一个用Python编写的控制台程序.它使用以下命令询问用户问题:

some_input = input('Answer the question:', ...)
Run Code Online (Sandbox Code Playgroud)

我将如何测试中,含有一个呼叫的功能input使用pytest?我不想强迫测试人员多次输入文本只完成一次测试运行.

python testing unit-testing input pytest

38
推荐指数
5
解决办法
2万
查看次数

使用pytest正确导入

我刚刚设置为使用python与Python 2.6.到目前为止,除了处理"导入"语句之外,它运行良好:我似乎无法以与我的程序相同的方式响应导入.

我的目录结构如下:

src/
    main.py
    util.py
    test/
        test_util.py
    geom/
        vector.py
        region.py
        test/
            test_vector.py
            test_region.py
Run Code Online (Sandbox Code Playgroud)

要运行,我python main.py从src/调用.

在main.py中,我导入了vector和region

from geom.region import Region
from geom.vector import Vector
Run Code Online (Sandbox Code Playgroud)

在vector.py中,我导入了区域

from geom.region import Region
Run Code Online (Sandbox Code Playgroud)

当我在标准运行中运行代码时,这些都可以正常工作.但是,当我从src /调用"py.test"时,它会一直退出导入错误.


一些问题和我的解决方案尝试

我的第一个问题是,当运行"test/test_foo.py"时,py.test无法直接"导入foo.py".我通过使用"imp"工具解决了这个问题.在"test_util.py"中:

import imp
util = imp.load_source("util", "util.py")
Run Code Online (Sandbox Code Playgroud)

这适用于许多文件.它似乎也暗示当pytest运行"path/test/test_foo.py"来测试"path/foo.py"时,它基于目录"path".

但是,"test_vector.py"失败了.Pytest可以找到并导入vector模块,但它无法找到任何vector的进口.使用pytest时,以下导入(来自"vector.py")都会失败:

from geom.region import *
from region import *
Run Code Online (Sandbox Code Playgroud)

这些都给出了表格的错误

ImportError: No module named [geom.region / region]
Run Code Online (Sandbox Code Playgroud)

我不知道接下来要做什么来解决这个问题; 我对Python中导入的理解是有限的.

使用pytest时处理导入的正确方法是什么?


编辑:非常黑客的解决方案

vector.py,我更改了import语句

from geom.region import Region
Run Code Online (Sandbox Code Playgroud)

简单地说

from region …
Run Code Online (Sandbox Code Playgroud)

python import pytest

35
推荐指数
5
解决办法
2万
查看次数

Py.test没有名为*的模块

我有这样的文件夹结构

App
--App
  --app.py       
--Docs
--Tests
  --test_app.py
Run Code Online (Sandbox Code Playgroud)

在我test_app.py file,我有一行来导入我的应用程序模块.当我在根文件夹上运行py.test时,我得到关于没有名为app的模块的错误.我该如何配置?

python pytest

26
推荐指数
7
解决办法
3万
查看次数

py.test找不到模块

这个问题与以下问题有关,但在那里没有回答:

我有一个python模块具有以下树结构:

mcts
|- setup.py
|- mcts
 |- __init__.py
 |- uct.py
 |- toy_world_state.py
 |- test
  |- test_uct.py
  |- test_toy_world_state.py
Run Code Online (Sandbox Code Playgroud)

我在某个目录中创建了virtualenv

$ mkdir virtual
$ virtualenv --system-site-packages virtual
$ source virtual/bin/activate
Run Code Online (Sandbox Code Playgroud)

然后我安装我的包:

$ cd /path/to/mcts
$ pip install -e .
Run Code Online (Sandbox Code Playgroud)

现在我尝试运行测试:

$ py.test mcts
================================================== test session starts ==================================================
platform linux -- Python 3.4.2 -- py-1.4.26 -- pytest-2.6.4
collected 0 items / 2 errors 

======================================================== ERRORS =========================================================
__________________________________ ERROR collecting mcts/test/test_toy_world_state.py ___________________________________
mcts/test/test_toy_world_state.py:4: in <module>
    from mcts.toy_world_state import * …
Run Code Online (Sandbox Code Playgroud)

python pytest

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

$ pytest 和 $ python -m pytest 测试之间的区别

我想了解运行之间的区别:

\n
$ pytest\n
Run Code Online (Sandbox Code Playgroud)\n

\n
$ python -m pytest tests\n
Run Code Online (Sandbox Code Playgroud)\n

我正在 Mac 上的虚拟环境中工作。\n第一个解决方案给了我一个错误:

\n
ModuleNotFoundError: No module named 'app'  \n
Run Code Online (Sandbox Code Playgroud)\n

第二种解决方案效果很好。

\n

为什么第二个解决方案有效而第一个解决方案无效?\n我怎样才能让它只使用$ pytest

\n

我的文件夹结构:

\n
\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 app.py   \n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 requirements.txt  \n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 templates  \n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 tests  \n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 conftest.py  \n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 functional  \n\xe2\x94\x82   \xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py  \n\xe2\x94\x82   \xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 test_s.py   \n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 unit   \n\xe2\x94\x82       \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py   \n\xe2\x94\x82       \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 test_app.py   \n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 venv   \n
Run Code Online (Sandbox Code Playgroud)\n

在 test_app.py 中,此行失败:

\n
from app import app\n
Run Code Online (Sandbox Code Playgroud)\n

python pytest

10
推荐指数
2
解决办法
2203
查看次数

python3中pytest的布局和导入

我无法从pytest函数导入模块。我知道有100万个问题,但是我已经读了一堆,但仍然难以理解。

$ tree
.
??? code
    ??? eight_puzzle.py
    ??? missionaries_and_cannibals.py
    ??? node.py
    ??? search.py
    ??? test
        ??? test_eight_puzzle.py
        ??? test_search.py

2 directories, 6 files
$
$ grep import code/test/test_search.py
import sys
import pytest
import code.search
$
$ pytest
...
ImportError while importing test module '~/Documents/code/test/test_search.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
code/test/test_search.py:14: in <module>
    import code.search
E   ModuleNotFoundError: No module named 'code.search'; 'code' is not a package
...
Run Code Online (Sandbox Code Playgroud)

我希望那能奏效。“代码”是一个包,对吗?Python 3中的软件包是其中包含.py文件的任何目录。

我也尝试了相对导入-- from .. import search …

python pytest python-3.x conda

8
推荐指数
1
解决办法
1226
查看次数

如何使用 pytest 解决 ImportError

已经 有人对此主题提出疑问有时程序员会__init__.py在某些地方放置一些路径,通常有人说应该使用绝对路径。但是,我无法让它在这里工作:

\n

如何从包中导入类以便 pytest 中的测试运行并可以使用代码?

\n

目前我得到 pytest 或通过各自运行的代码。

\n

我的示例项目结构是

\n
.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 testingonly\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 cli.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 testingonly.py\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 tests\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 test_testingonly.py\n
Run Code Online (Sandbox Code Playgroud)\n

__init__.py在这两种情况下都是空文件。

\n
$ cat testingonly/cli.py\n"""Console script for testingonly."""\nfrom testingonly import Tester\n\ndef main(args=None):\n    """Console script for testingonly."""\n    te = Tester()\n    return 0\n\nmain()\n
Run Code Online (Sandbox Code Playgroud)\n
$ cat testingonly/testingonly.py\n"""Main module."""\nclass Tester():\n    def __init__(self):\n        print("Hello")\n
Run Code Online (Sandbox Code Playgroud)\n

正如预期的那样:

\n
$ python3 testingonly/cli.py\nHello\n
Run Code Online (Sandbox Code Playgroud)\n

然而,尝试测试这一点失败了:

\n
$ pytest\n========================================================= test session starts =========================================================\nplatform linux -- …
Run Code Online (Sandbox Code Playgroud)

python python-import pytest

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

VSCode 未检测到我的任何 pytest 测试

我试图让我的单元测试显示在 VSCode 的测试资源管理器中,但它似乎不起作用。测试发现不会因输出中出现任何错误而失败,但也不会显示我的任何测试。

这是我正在使用的存储库,您可以在那里看到文件结构。

这可能与我使用诗歌来管理我的虚拟环境有任何关系,也可能没有任何关系,尽管我确信 python 解释器设置正确。pytest我可以通过运行或在我的基本目录中手动让我的测试完美运行poetry run pytest__init__.py我的测试目录中确实有一个空目录。另外值得注意的是,我在 WSL 2 上的 Ubuntu 中运行。

在此输入图像描述

我通过以下过程设置了这个环境:

  • 在 Windows 上安装 WSL2
  • 在 Windows 上安装 VSCode
  • 安装“远程 - WSL”VSCode 扩展
  • 在 VSCode 中打开一个新的 WSL 窗口
  • 使用本指南在 Ubuntu 中安装 Anaconda
  • 安装 VSCode Python 扩展
  • 将 VSCode python 解释器设置为 anaconda 安装,并打开一个新终端
  • pip install poetry
  • 转到我的项目根文件夹
  • poetry install
  • 将VSCode python解释器设置为poetry环境,并打开一个新终端
  • 完成,我可以通过命令行运行 pytest

这是我的工作区设置.json:

{
    "restructuredtext.confPath": "${workspaceFolder}/docs/source",
    "python.testing.pytestEnabled": true,
}
Run Code Online (Sandbox Code Playgroud)

以下是我尝试刷新测试时显示的输出:

~/.cache/pypoetry/virtualenvs/monaco-bfS1OgpY-py3.9/bin/python ~/.vscode-server/extensions/ms-python.python-2021.11.1422169775/pythonFiles/testing_tools/run_adapter.py discover pytest -- --rootdir ~/coding/monaco -s …
Run Code Online (Sandbox Code Playgroud)

pytest visual-studio-code

7
推荐指数
1
解决办法
7908
查看次数

带有 Flask 的 pytest 无法定位模块

我正在按照本教程https://flask.palletsprojects.com/en/1.1.x/#user-s-guide学习Flask但是,当我尝试运行时,出现此错误:pytest

(FlaskVenv) MacBook-Pro-de-Hugo:FlaskProject hugovillalobos$ pytest
ImportError while loading conftest '/Users/hugovillalobos/Documents/Code/FlaskProject/tests/conftest.py'.
tests/conftest.py:4: in <module>
    from Flaskr import create_app
E   ModuleNotFoundError: No module named 'Flaskr'
Run Code Online (Sandbox Code Playgroud)

这是引发错误 ( conftest.py)的模块:

import os
import tempfile
import pytest
from Flaskr import create_app
from Flaskr.db import get_db, init_db

with open(os.path.join(os.path.dirname(__file__), 'data.sql'), 'rb') as f:
    _data_sql = f.read().decode('utf8')

@pytest.fixture
def app():
    db_fd, db_path = tempfile.mkstemp()

    app = create_app({
        'TESTING': True,
        'DATABASE': db_path,
    })

    with app.app_context():
        init_db()
        get_db().executescript(_data_sql)

    yield app

    os.close(db_fd)
    os.unlink(db_path)

@pytest.fixture …
Run Code Online (Sandbox Code Playgroud)

python pytest flask

6
推荐指数
1
解决办法
1189
查看次数

pytest 的文件夹结构和导入问题

想象一个简单的文件夹结构:

my_folder/
    __init__.py
    funcs.py
    tests/
        test_funcs.py
Run Code Online (Sandbox Code Playgroud)

函数.py:

def f():
    return 2
Run Code Online (Sandbox Code Playgroud)

__init__.py:

from funcs import f
Run Code Online (Sandbox Code Playgroud)

test_funcs.py:

from funcs import f

def test_f():
    assert f() == 2
Run Code Online (Sandbox Code Playgroud)

这是文档中建议的方法之一: https://pytest.readthedocs.io/en/reorganize-docs/new-docs/user/directory_struct.html

但是当我从以下位置运行 pytest 时my_folder

tests/test_funcs.py:1: in <module>
    from funcs import f
E   ModuleNotFoundError: No module named 'funcs'
Run Code Online (Sandbox Code Playgroud)

这很奇怪,因为我本以为pytest设置了它运行的路径,这样如果不手动处理就不会出现这些类型的错误。

文档也没有给出任何关于这一点的指示......他们只是说:

通常,您可以通过指向测试目录或模块来运行测试:

pytest tests/test_appmodule.py      # for external test dirs
pytest src/tests/test_appmodule.py  # for inlined test dirs
pytest src                          # run tests in all below test directories
pytest                              # run all …
Run Code Online (Sandbox Code Playgroud)

python python-import pytest

5
推荐指数
1
解决办法
5625
查看次数

pytest python src布局

我正在尝试使用src目录推荐的python包布局之一.

在此输入图像描述

我的问题是当我从命令行运行pytest时,我的测试没有找到我的python包.我尝试从这个目录的顶层运行并在tests目录中运行,但仍然收到ModuleNotFoundError异常.我用pytest-3.5.0运行python 3.5.

从这种类型的python包布局中执行pytest的推荐方法是什么?

python pytest

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