2015-05-06 2 views
0

Я хотел бы написать тест, но этот тест пройдет только в том случае, если установлен модуль nlopt. Так как этот модуль необязательный, мне было интересно, есть ли способ написать тест, который не будет препятствовать тому, чтобы py.test завершился неудачно, если модуль отсутствует. на данный момент, py.test останавливается, поскольку он не может найти модуль nlopt:Ошибка py.test из-за недостающего модуля

$ make test 
py.test --exitfirst tests/ 
============================================================= test session starts ============================================================= 
platform darwin -- Python 3.4.2 -- py-1.4.26 -- pytest-2.6.4 
collecting 0 items/1 errors 
=================================================================== ERRORS ==================================================================== 
_____________________________________________ ERROR collecting tests/unit/fem/test_simulation.py ______________________________________________ 
tests/unit/fem/test_simulation.py:5: in <module> 
    from hybrida.fem import Simulation, Step, Eigenvalue 
src/hybrida/__init__.py:4: in <module> 
    from . import geometry 
src/hybrida/geometry/__init__.py:3: in <module> 
    from . import distance 
src/hybrida/geometry/distance.py:9: in <module> 
    import nlopt 
E ImportError: No module named 'nlopt' 
--------------------------------------------------------------- Captured stdout --------------------------------------------------------------- 
nlopt does not seem to be installed. 
=========================================================== short test summary info =========================================================== 
ERROR tests/unit/fem/test_simulation.py 
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Interrupted: stopping after 1 failures !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
=========================================================== 1 error in 0.67 seconds =========================================================== 
make: *** [test] Error 2 

Я пытался добавить try-except блок в начале тестового файла, но это не помогло:

try: 
    import nlopt 
    import numpy as np 

except ImportError: 
    print("""nlopt does not seem to be installed""") 

Модуль nlopt используется внутри библиотеки, для которой я пишу тест. В настоящее время библиотека вызывает исключение, если модуль не найден. На верхнем уровне файла, который использует модуль:

try: 
    import nlopt 

except ImportError: 
    print("""\033[91m nlopt does not seem to be installed. Please install it by downloading nlopt, and installing it using 
     $ ./configure --enable-shared 
     $ make 
     $ make install 
     and adding /usr/local/lib/Python3.4/site-packages to the PYTHONPATH 
     (or wherever nlopt has been installed): 
     export PYTHONPATH=$PYTHONPATH:/usr/local/lib/Python3.4/site-packages 

     Note: although Homebrew provides nlopt, it does not install the Python interface.\033[0m""") 
    raise 

ответ

2

Используйте conditional import machinery pytest обеспечивает:

nlopt = pytest.importorskip('nlopt') 

Поместите эту строку внутри конкретной тестовой функции, которая использует nlopt (или в способе установки набор функций), и он будет пропускать только те, когда он не может выполнить импорт.

+0

Я пробовал это, но код все еще не работает внутри библиотеки, для которой я предоставил тест, так как внутри библиотеки есть также «import nlopt», который вызывает исключение, если он не может найти модуль. – aaragon

+0

Вы можете переместить этот 'import' внутри функций, которые на самом деле его используют, вместо того, чтобы иметь верхний уровень. – tzaman

+0

Вы имеете в виду на стороне библиотеки или на тестовой стороне? – aaragon

Смежные вопросы