我最近发现了pytest.看起来很棒.但是,我觉得文档可能更好.
我正在尝试了解哪些conftest.py文件的用途.
在我(当前很小的)测试套件中,我conftest.py在项目根目录中有一个文件.我用它来定义我注入测试的灯具.
我有两个问题:
conftest.py吗?它有其他用途吗?conftest.py文件吗?我什么时候想这样做?将举例说明.更一般地说,您如何conftest.py在py.test测试套件中定义文件的目的和正确使用?
我正在使用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编写的控制台程序.它使用以下命令询问用户问题:
some_input = input('Answer the question:', ...)
Run Code Online (Sandbox Code Playgroud)
我将如何测试中,含有一个呼叫的功能input使用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) 我有这样的文件夹结构
App
--App
--app.py
--Docs
--Tests
--test_app.py
Run Code Online (Sandbox Code Playgroud)
在我test_app.py file,我有一行来导入我的应用程序模块.当我在根文件夹上运行py.test时,我得到关于没有名为app的模块的错误.我该如何配置?
这个问题与以下问题有关,但在那里没有回答:
我有一个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) 我想了解运行之间的区别:
\n$ pytest\nRun Code Online (Sandbox Code Playgroud)\n和
\n$ python -m pytest tests\nRun Code Online (Sandbox Code Playgroud)\n我正在 Mac 上的虚拟环境中工作。\n第一个解决方案给了我一个错误:
\nModuleNotFoundError: No module named 'app' \nRun Code Online (Sandbox Code Playgroud)\n第二种解决方案效果很好。
\n为什么第二个解决方案有效而第一个解决方案无效?\n我怎样才能让它只使用$ pytest?
我的文件夹结构:
\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 \nRun Code Online (Sandbox Code Playgroud)\n在 test_app.py 中,此行失败:
\nfrom app import app\nRun Code Online (Sandbox Code Playgroud)\n 我无法从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 …
已经 有人对此主题提出疑问。有时程序员会__init__.py在某些地方放置一些路径,通常有人说应该使用绝对路径。但是,我无法让它在这里工作:
如何从包中导入类以便 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\nRun Code Online (Sandbox Code Playgroud)\n__init__.py在这两种情况下都是空文件。
$ 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()\nRun Code Online (Sandbox Code Playgroud)\n$ cat testingonly/testingonly.py\n"""Main module."""\nclass Tester():\n def __init__(self):\n print("Hello")\nRun Code Online (Sandbox Code Playgroud)\n正如预期的那样:
\n$ python3 testingonly/cli.py\nHello\nRun Code Online (Sandbox Code Playgroud)\n然而,尝试测试这一点失败了:
\n$ pytest\n========================================================= test session starts =========================================================\nplatform linux -- …Run Code Online (Sandbox Code Playgroud) 我试图让我的单元测试显示在 VSCode 的测试资源管理器中,但它似乎不起作用。测试发现不会因输出中出现任何错误而失败,但也不会显示我的任何测试。
这是我正在使用的存储库,您可以在那里看到文件结构。
这可能与我使用诗歌来管理我的虚拟环境有任何关系,也可能没有任何关系,尽管我确信 python 解释器设置正确。pytest我可以通过运行或在我的基本目录中手动让我的测试完美运行poetry run pytest。__init__.py我的测试目录中确实有一个空目录。另外值得注意的是,我在 WSL 2 上的 Ubuntu 中运行。
我通过以下过程设置了这个环境:
pip install poetrypoetry install这是我的工作区设置.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) 我正在按照本教程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) 想象一个简单的文件夹结构:
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设置了它运行的路径,这样如果不手动处理就不会出现这些类型的错误。
文档也没有给出任何关于这一点的指示......他们只是说:
通常,您可以通过指向测试目录或模块来运行测试:
Run Code Online (Sandbox Code Playgroud)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 …
我正在尝试使用src目录推荐的python包布局之一.
我的问题是当我从命令行运行pytest时,我的测试没有找到我的python包.我尝试从这个目录的顶层运行并在tests目录中运行,但仍然收到ModuleNotFoundError异常.我用pytest-3.5.0运行python 3.5.
从这种类型的python包布局中执行pytest的推荐方法是什么?
pytest ×13
python ×12
import ×2
testing ×2
conda ×1
flask ×1
input ×1
python-3.x ×1
unit-testing ×1