Тестирование зависимостей с Python - PullRequest
6 голосов
/ 20 июня 2011

Я хотел бы написать модульные тесты, чтобы проверить, существует ли зависимость между двумя пакетами Python.Например:

a/
    __init__.py
    models.py
    views.py
    ...
b/
    __init__.py
    models.py
    views.py
    ...

модульный тест для проверки того, что модули в пакете b ничего не импортируют из модулей в пакете a.Единственное решение, которое у меня есть, - это сканировать файлы и проверять, что в исходном коде нет «from a» или «import a».Есть ли другие способы сделать это?Одно из требований заключается в том, что a/ и b/ должны находиться на одном уровне каталогов.

Я хотел бы пройти этот модульный тест, поскольку хочу быть уверенным, что могу использовать пакет bдругие проекты без пакета a, а также другие разработчики не пишут код, который сделает b зависимым от a.

Ответы [ 2 ]

4 голосов
/ 20 июня 2011

Python слишком динамичен, чтобы делать это на 100% правильно.Учтите, что вы можете импортировать модули, вызвав __import__, который принимает строковый аргумент, чтобы имя импортируемого модуля можно было создать во время выполнения.Кроме того, __import__ - это функция, поэтому она может быть связана с другими именами, поэтому вы даже не можете быть уверенными в обнаружении всех случаев, когда что-то импортируется.

Итехнически возможно, чтобы модуль вызвал функцию из другого модуля, который импортирует модуль и возвращает его.Таким образом, вы определенно не можете сделать это, проанализировав только пакет b.

А затем exec для выполнения произвольного кода Python, созданного во время выполнения ...

Самое близкое, что вы можете получить, это, вероятно, попытаться выполнить ваше модульное тестовое упражнение b, когда a находится на PYTHONPATH, а также когда a не на PYTHONPATH.Все еще не надежно, так как это только говорит о том, что b завершил все тесты без a на PYTHONPATH, не то, что ему никогда не понадобится a для чего-либо.И если вам действительно не повезло, b делает что-то действительно глупое и возится с sys.path в полете и все равно каким-то образом умудряется импортировать a.

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

1 голос
/ 20 июня 2011
import sys
sys.modules['a'] = None

import b
# run unit tests for b to try and catch local import statements in b's functions
...