Как включить полную трассировку pytest при ошибке импорта?

#python #python-3.x #pytest

#python #python-3.x #pytest

Вопрос:

Мы тестируем нашу библиотеку c поверх SWIG на python с помощью pytest . Однако иногда, когда возникают проблемы с интерпретацией SWIG, мы не получаем правильную информацию обратной трассировки при импорте нашей библиотеки в conftest.py Когда мы импортируем нашу библиотеку непосредственно в python, мы получаем полную трассировку исключения

Как мы можем получить полную обратную трассировку в pytest, что может быть достигнуто при импорте библиотеки непосредственно в python?

Ниже приведен фрагмент из автоматически сгенерированного SWIG с дополнительным введенным вручную исключением для целей тестирования импорта

 from sys import version_info as _swig_python_version_info
if _swig_python_version_info >= (2, 7, 0):
    def swig_import_helper():
        import importlib
        pkg = __name__.rpartition('.')[0]
        mname = '.'.join((pkg, '_sdk')).lstrip('.')
        try:
            # Added - Generate exception use case
            raise ImportError("**** Import Error Use Case ****")

            return importlib.import_module(mname)
        except ImportError:
            return importlib.import_module('_sdk')
  

Когда мы импортируем библиотеку непосредственно в python, мы получаем полную трассировку, включая первое возникновение исключения:

Импорт в библиотеку непосредственно в python

 >>> from leaba import sdk
Traceback (most recent call last):
  File ".../out/opt3-debug/pylib/leaba/sdk.py", line 17, in swig_import_helper
    raise ImportError("**** Import Error Use Case ****")
ImportError: **** Import Error Use Case ****

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File ".../out/opt3-debug/pylib/leaba/sdk.py", line 21, in <module>
    _sdk = swig_import_helper()
  File ".../out/opt3-debug/pylib/leaba/sdk.py", line 20, in swig_import_helper
    return importlib.import_module('_sdk')
  File "/common/pkgs/python/3.6.0/lib/python3.6/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
ModuleNotFoundError: No module named '_sdk'
  

Импорт в pytest conftest.py ,
отсутствует вывод первой обратной трассировки

 ImportError while loading conftest '.../fishnet/tests/conftest.py'.
fishnet/tests/conftest.py:60: in <module>
    from init import device_init
fishnet/init/device_init.py:28: in <module>
    from leaba import sdk
.../out/opt3-debug/pylib/leaba/sdk.py:21: in <module>
    _sdk = swig_import_helper()
.../out/opt3-debug/pylib/leaba/sdk.py:20: in swig_import_helper
    return importlib.import_module('_sdk')
/common/pkgs/python/3.6.0/lib/python3.6/importlib/__init__.py:126: in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
E   ModuleNotFoundError: No module named '_sdk'
  

Как мы можем указать pytest предоставлять полную обратную трассировку, а не усекать и предоставлять только последнюю?