У меня есть библиотека питона со следующей структурой: хранилищеИспользование py.test с кодом компилируются библиотеки
repobase
|- mylibrary
| |- __init__.py
|- tests
|- test_mylibrary.py
До сих пор, запуск тестов может просто быть сделано путем вызова py.test
в каталоге repobase. import mylibrary
в test_mylibrary.py затем воспользовался локальным кодом в repobase/mylibrary.
Теперь я расширил библиотеку, чтобы использовать скомпилированный код. Поэтому исходный код repobase/mylibrary не работает сам по себе. Я должен сделать setup.py build
. Это создает repobase/build/lib.linux-x86_64-2.7/mylibrary.
Есть ли разумный способ заставить py.test использовать этот каталог для импорта mylibrary? С учетом этих ограничений:
Я не хочу, чтобы включить любые
sys.path
/импорта магии в test_mylibrary.py, потому что это может нарушить тесты в других envrionments.Я не хочу отказаться от возможности запускать
py.test
от repobase. Поэтому изменение PYTHONPATH не помогает, потому что.
по-прежнему будет первым вsys.path
. И таким образом repobase/mylibrary было бы желательно за repobase/build/lib.linux-x86_64-2.7/mylibrary.
Если нет, то это стандартный способ для библиотек тестирования Python, что нужно строить?
Непонятно, что вы подразумеваете под «... я расширил библиотеку для использования скомпилированного кода ...», то есть, скомпилированная версия предоставляет тот же интерфейс, что и версия Python, или же импортирует версию Python 'скомпилированная версия? Если первое, то вы эффективно тестируете две разные вещи, поэтому, возможно, они должны иметь разные имена, даже если набор тестов идентичен, q.v. Python 'pickle' vs' cPickle'. Если последнее, то у них обязательно должны быть разные имена. Общая идиома Python заключается в том, что скомпилированная часть должна быть добавлена с подчеркиванием, q.v. Python 'socket' vs' _socket'. – Aya
(продолжение) В любом случае, имея две разные реализации модулей, использующие одно и то же имя, возникает проблема. Даже если ваше решение работает для всех возможных случаев выполнения на сегодняшний день, вы не можете предвидеть все возможные будущие случаи выполнения, и вы можете в конечном итоге импортировать или протестировать неправильную версию, не осознавая ее. – Aya
@Aya У меня только одна реализация. Скомпилированный код * заменяет * прежний код python. Как я написал «Поэтому исходный код в repobase/mylibrary не работает сам по себе». Мне нужен скомпилированный код, чтобы иметь возможность запускать тесты. –