Почему импорт * не запускает импортированный код? - PullRequest
1 голос
/ 15 марта 2012

У меня есть папка со всеми моими тестами. Все они включают в себя:

if __name__ ==  '__main__':
    unittest.TextTestRunner(verbosity=2).run(suite())

Итак, чтобы проверить их, мне нужно только импортировать тестовый скрипт. У меня есть скрипт test_all, который выполняет все тесты юнитов, импортируя их один за другим. В настоящее время это выглядит так:

from pyMS.test import test_baseFunctions
from pyMS.test import test_compareFeatureXMLmzML
from pyMS.test import test_config
from pyMS.test import test_featureFunctions
from pyMS.test import test_fileHandling
from pyMS.test import test_mzmlFunctions
from pyMS.test import test_output
from pyMS.test import test_parseFeatureXML
from pyMS.test import test_rFunctions
from pyMS.test import test_rPlots
[...]

Это означает, что каждый раз, когда я добавляю или удаляю новый тест, мне нужно изменить импорт. Поэтому вместо этого я хочу использовать

from pyMS.test import *

Однако, это не запускает какой-либо код. Мне любопытно, почему импорт * не запускает код. Кроме того, если кто-то знает решение (то есть нос к сведению) для запуска всех юнит-тестов без необходимости импортировать их по одному, было бы здорово.

Спасибо
Niek

Ответы [ 3 ]

1 голос
/ 15 марта 2012

Самый простой способ (без использования внешнего инструмента) запустить все тесты - это, вероятно, использовать TestLoader.discover .

1 голос
/ 15 марта 2012

__name__ устанавливается только на "__main__" для исходного файла python, читаемого интерпретатором. Это позволяет импортировать модуль другими модулями без кода после выполнения if __name__ == "__main__":.

Будет выполнен любой код, который не защищен if __name__ == "__main__":. Таким образом, вы можете удалить его в каждом из файлов, после чего будет выполнен импорт unittest.TextTestRunner(verbosity=2).run(suite()).

Лучшим методом является использование метода из unittest.TestLoader() для загрузки ваших тестов в набор, а затем присвоение этого набора unittest.TextTestRunner. Загрузчик может быть автоматизирован без необходимости изменения импорта в тестовом файле. Добавьте тестовый файл в структуру каталогов, и тесты будут выполнены автоматически.

1 голос
/ 15 марта 2012

Если вы используете Python 2.7, вы можете использовать командную строку:

python -m unittest discover

Это автоматически найдет и выполнит все тесты во всех подкаталогах.Дополнительные параметры см .:

python -m unittest -h

Этот модуль перенесен в Python 2.3+ и может быть загружен здесь .Если вы используете бэкпорт, есть включенный скрипт командной строки с именем unit2 или unit2.py (ваш выбор), который вызывается так:

unit2.py discover

Что касается from XXX import *, это фактически импортирует все впространство имен файла XXX/__init__.py.Поместите следующий код в __init__.py для автоматической загрузки любых прямых подмодулей:

import os

all_files = os.listdir(os.path.dirname(__file__))
modules = [x for x in all_files if x.endswith(".py") and not x.startswith("_")]
__all__ = [x.rpartition(".")[0] for x in modules]

Подробное объяснение того, как это работает, можно найти в документах python для глобальной переменной __all__ .

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