使用 Makefile 和 make 命令进行 pytest

Mav*_*ckD 6 python makefile

我是第一次学习测试驱动开发。我没有软件开发经验,但有一些脚本编写经验。

\n\n

我一直在关注 LinuxAcademy Python 3 for Sys Admin 教程。

\n\n

我创建了以下结构,

\n\n
\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Makefile\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Pipfile\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Pipfile.lock\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 README.rst\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 setup.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 src\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 pgbackup\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\x94\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 tests\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 test_cli.py\n
Run Code Online (Sandbox Code Playgroud)\n\n

setup.py文件,

\n\n
from setuptools import setup, find_packages\n    with open(\'README.rst\', \'r\') as f:\n        readme = f.read()\n    setup(\n        name=\'pgbackup\',\n        version=\'0.1.0\',\n        description=\'Database backups locally or to AWS S3.\',\n        long_description=readme,\n        author=\'Keith Thompson\',\n        author_email=\'keith@linuxacademy.com\',\n        packages=find_packages(\'src\'),\n        package_dir={\'\': \'src\'},\n    )\n
Run Code Online (Sandbox Code Playgroud)\n\n

Makefile文件,

\n\n
.PHONY: install test\n\ndefault: test\n\ninstall:\n        pipenv install --dev --skip-lock\n\ntest:\n        PYTHONPATH=./src pytest\n
Run Code Online (Sandbox Code Playgroud)\n\n

tests/test_cli.py文件,

\n\n
import pytest\nfrom pgbackup import cli\n\ndef test_helloworld():\n    """\n    JUST A HELLO WORLD TEST\n    """\n    assert cli.hello() == "helloworld"\n
Run Code Online (Sandbox Code Playgroud)\n\n

src/pgbackup/cli.py文件,

\n\n
def hello():\n    return "helloworld"\n
Run Code Online (Sandbox Code Playgroud)\n\n

我编写helloworld的第一个示例测试不是教程的一部分。现在,当我从项目根目录运行make命令时,我的测试通过了,

\n\n
========================================== test session starts ===========================================platform linux -- Python 3.6.6, pytest-3.8.0, py-1.6.0, pluggy-0.7.1\nrootdir: /root/code/pgbackup, inifile:\ncollected 1 item\n\ntests/test_cli.py .                                                                                [100%]\n\n======================================== 1 passed in 0.04 seconds ========================================\n
Run Code Online (Sandbox Code Playgroud)\n\n

我知道该make命令设置PYTHONPATH./src pytest但不明白它如何运行实际测试?我知道它只是设置一个搜索路径来导入 python 模块。

\n\n

如果我尝试pytest从目录运行命令tests,我的测试失败,

\n\n
================================================= ERRORS =================================================___________________________________ ERROR collecting tests/test_cli.py ___________________________________ImportError while importing test module \'/root/code/pgbackup/tests/test_cli.py\'.\nHint: make sure your test modules/packages have valid Python names.\nTraceback:\ntest_cli.py:2: in <module>\n    from pgbackup import cli\nE   ModuleNotFoundError: No module named \'pgbackup\'\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Interrupted: 1 errors during collection !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!======================================== 1 error in 0.35 seconds =========================================\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果我从src目录运行测试,它不会运行任何东西,

\n\n
====================================== no tests ran in 0.01 seconds ======================================\n
Run Code Online (Sandbox Code Playgroud)\n\n

有人可以解释一下运行如何make运行测试,因为Makefile只是设置PYTHONPATH变量吗?

\n

Edu*_*ard 2

有人可以解释一下运行 make 是如何运行测试的,因为 Makefile 只是设置 PYTHONPATH 变量吗?

它不仅仅是设置变量。pytest 正在此处运行,因为您当前的测试行:

PYTHONPATH=./src pytest
Run Code Online (Sandbox Code Playgroud)

相当于:

export PYTHONPATH=./src; pytest
Run Code Online (Sandbox Code Playgroud)

检查此处的第三个示例:Bash 变量分配中的命令未找到错误以获取解释

您可能需要更改它以使其看起来相应,

如果我尝试从测试目录运行 pytest 命令,我的测试如果失败,

至于从不同目录运行 pytest 。确实,这会产生不同的结果。pytest 搜索测试(查找test文件夹中的所有文件,或当前名为 的文件test_*)。因此,如果您在内部运行它src,它不会找到任何测试。

如果我尝试从测试目录运行 pytest 命令,我的测试失败

pgbackup 似乎是从当前目录导入的,因此当您移入“tests”文件夹时将找不到它。

希望这可以帮助。