c -тесты запускаются из модуля и командной строки, а не из ловушки pre-commit - PullRequest
0 голосов
/ 06 марта 2020

Я хочу запустить do c -test для скрипта Python как часть хука предварительной фиксации в Python.

В файле set_prefix.py у меня есть do c -тесты перед функциями, которые я тестирую перед запуском:

import doctest
import sys

EXTENSIONS = tuple([".%s" % ending for ending in ["jpg", "heic", "nrw"]])

def is_target_for_renaming(filepath):
    """Returns true if this filepath should be renamed.

    >>> is_target_for_renaming("/Users/username/Pictures/document.other_jpg")
    True
    """

    return filepath.lower().endswith(EXTENSIONS)


def get_failed_tests():
    r = doctest.testmod()
    return r.failed


def main():
    pass


if "__main__" == __name__:

    args = sys.argv
    test_only = 2 <= len(sys.argv) and "test" == sys.argv[1]
    test_failures = get_failed_tests()
    print(test_failures)
    assert 0 == test_failures

    if not test_only:
        main()

Когда я запускаю python3 set_prefix.py test, я получаю ожидаемую ошибку.

Тем не менее, когда я импортирую модуль и вызов функции:

import set_prefix

if "__main__" == __name__:

    test_failures = set_prefix.get_failed_tests()
    print(test_failures)

Я получаю 0 сбоев:

$ python3 temp.py 
0

Причина, по которой я хочу импортировать модуль, состоит в том, чтобы запускать тесты в хуке предварительной фиксации, аналогичном добавлено flake8:

#!/usr/local/opt/python/bin/python3.7
import sys

from flake8.main import git

if __name__ == '__main__':
    sys.exit(
        git.hook(
            strict=git.config_for('strict'),
            lazy=git.config_for('lazy'),
        )
    )

Почему тесты do c запускаются при вызове из командной строки и сценария, а не при импорте сценария? Будет ли unittest лучшей платформой, как описано в этой теме ?

1 Ответ

1 голос
/ 13 апреля 2020
doctest.testmod()

запускает тестирование документов в модуле __main__, и это зависит от того, какой скрипт вы на самом деле запускаете.

Вы можете исправить это с помощью параметра m, но вы все равно будете вынуждены добавить стандартный код в каждом модуле, который имеет doctests. Попробуйте это:

doctest.testfile("some_module.py")
...