我是第一次学习测试驱动开发。我没有软件开发经验,但有一些脚本编写经验。
\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\nsetup.py
文件,
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\nMakefile
文件,
.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\ntests/test_cli.py
文件,
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
文件,
def hello():\n return "helloworld"\n
Run Code Online (Sandbox Code Playgroud)\n\n我编写helloworld
的第一个示例测试不是教程的一部分。现在,当我从项目根目录运行make
命令时,我的测试通过了,
========================================== 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 模块。
如果我尝试pytest
从目录运行命令tests
,我的测试失败,
================================================= 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
目录运行测试,它不会运行任何东西,
====================================== no tests ran in 0.01 seconds ======================================\n
Run Code Online (Sandbox Code Playgroud)\n\n有人可以解释一下运行如何make
运行测试,因为Makefile
只是设置PYTHONPATH
变量吗?
有人可以解释一下运行 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”文件夹时将找不到它。
希望这可以帮助。