Охват модуля Cython с использованием py.test и coverage.py

Я хочу получить информацию о покрытии модуля Cython, используя некоторые (единичные) тесты, написанные на Python. То, что я имею сейчас, - это освещение самих тестов, то есть, какие строки тестов выполняются при запуске py.test. Хотя приятно смотреть, я бы предпочел .pyx файл .pyx, т.е. какие строки интерфейса C/Python покрыты моими тестами.

Я уже нашел некоторую информацию, но не смог запустить ее для моего проекта:

http://blog.behnel.de/posts/coverage-analysis-for-cython-modules.html

https://medium.com/@dfdeshom/better-test-coverage-workflow-for-cython-modules-631615eb197a

Как использовать анализ покрытия с помощью Cython

Это код, о котором идет речь: https://github.com/SCIP-Interfaces/PySCIPOpt/tree/coverage

Ответ 1

Текущий ответ здесь состоит из двух частей:

  • конфигурация pytest
  • Конфигурация zone.py

Начните с конфигурации pytest. В настоящее время в вашем филиале coverage есть файл .travis.yml со следующей строкой: py.test --cov tests, это говорит pytest-cov, чтобы показать вам покрытие для каталога tests, которое вам не нужно. Вы можете запускать py.test tests --cov или изменить свой setup.cfg и вообще не проходить tests.

Тогда у вас setup.cfg файл setup.cfg с:

[tool:pytest]
testpaths = 
    tests

В файле .coverage вам необходимо:

[run]
plugins = Cython.Coverage
source = src/pyscipopt
omit =
    tests
    *__init__.py

Указание paths отдельно устарело, и я удалил его. Таким образом, coverage.py знает, что он должен только проверять покрытие для каталога src/pyscipopt.

После этих изменений выход я получил:

---------- coverage: platform darwin, python 3.6.4-final-0 -----------
Name                          Stmts   Miss Branch BrPart  Cover
---------------------------------------------------------------
src/pyscipopt/Multidict.py       17     17     10      0     0%
src/pyscipopt/conshdlr.pxi      301    129      0      0    57%
src/pyscipopt/expr.pxi          168     57      0      0    66%
src/pyscipopt/heuristic.pxi      44     18      0      0    59%
src/pyscipopt/lp.pxi            235    177      0      0    25%
src/pyscipopt/pricer.pxi         52     24      0      0    54%
---------------------------------------------------------------
TOTAL                           817    422     10      0    48%

Это похоже на правильный вывод, который вы хотите, но я вижу, что файл scip.pyx отсутствует. Вы также можете посмотреть связанную с этим проблему на github. Я не расследую дальше, потому что он отвечает на ваш вопрос, и я думаю, что вы сможете идти отсюда с тем, что отсутствует.