pytest, используя Makefile и команду make - PullRequest
0 голосов
/ 15 сентября 2018

Я впервые изучаю разработку через тестирование. У меня нет опыта разработки программного обеспечения, но у меня есть некоторый опыт работы со скриптами.

Я следую учебному пособию по LinuxAcademy Python 3 для Sys Admin.

Я создал следующую структуру,

├── Makefile
├── Pipfile
├── Pipfile.lock
├── README.rst
├── setup.py
├── src
│   └── pgbackup
│       ├── cli.py
│       └── __init__.py
└── tests
    └── test_cli.py

setup.py файл,

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

Makefile файл,

.PHONY: install test

default: test

install:
        pipenv install --dev --skip-lock

test:
        PYTHONPATH=./src pytest

tests/test_cli.py файл,

import pytest
from pgbackup import cli

def test_helloworld():
    """
    JUST A HELLO WORLD TEST
    """
    assert cli.hello() == "helloworld"

и src/pgbackup/cli.py file,

def hello():
    return "helloworld"

Я написал helloworld как мой первый пример теста, который не является частью учебника. Теперь, когда я запускаю команду make из корневого каталога проекта, мой тест проходит,

========================================== test session starts ===========================================platform linux -- Python 3.6.6, pytest-3.8.0, py-1.6.0, pluggy-0.7.1
rootdir: /root/code/pgbackup, inifile:
collected 1 item

tests/test_cli.py .                                                                                [100%]

======================================== 1 passed in 0.04 seconds ========================================

Я знаю, что команда make устанавливает PYTHONPATH на ./src pytest, но я не могу понять, как работает текущий тест? Я знаю, что это единственная установка пути поиска для импорта модулей Python.

Если я попытаюсь запустить команду pytest из tests dir, мой тест в случае неудачи

================================================= ERRORS =================================================___________________________________ ERROR collecting tests/test_cli.py ___________________________________ImportError while importing test module '/root/code/pgbackup/tests/test_cli.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
test_cli.py:2: in <module>
    from pgbackup import cli
E   ModuleNotFoundError: No module named 'pgbackup'
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Interrupted: 1 errors during collection !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!======================================== 1 error in 0.35 seconds =========================================

Если я запускаю тест из src dir, он ничего не запускает,

====================================== no tests ran in 0.01 seconds ======================================

Может кто-нибудь объяснить, как при запуске make выполняется тест, поскольку Makefile просто устанавливает PYTHONPATH переменную?

1 Ответ

0 голосов
/ 21 сентября 2018

Может кто-нибудь объяснить, как при запуске make выполняется тест, поскольку Makefile просто устанавливает переменную PYTHONPATH?

Это не только установка переменной.Здесь запускается pytest, потому что ваша текущая строка для теста:

PYTHONPATH=./src pytest

эквивалентна:

PYTHONPATH=./src; pytest

Проверьте 3-й пример здесь: Команда не найдена ошибка при назначении переменной Bash для объяснения

Возможно, вы захотите изменить его, чтобы он выглядел соответствующим образом,

Если я попытаюсь запустить команду pytest из файла dir tests, мой тест, если он не пройден,

Что касается запуска pytest из разных папок, действительно, это будет иметь разные результаты.потому что pytest использует автоматическое обнаружение тестов (все файлы в папке «test» или в текущей папке с именем «test_ *»).Так что если вы запускаете его внутри 'src', то внутри тестов нет.

Если я попытаюсь запустить команду pytest из dir tests, мой тест в случае неудачи

pgbackup будет импортирован из текущего каталога, поэтому при перемещении в папку «tests»это не будет найдено.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...