Как измерить покрытие при использовании мультипроцессинга через pytest? - PullRequest
1 голос
/ 10 апреля 2020

Я запускаю свои юнит-тесты через pytest. Для покрытия я использую coverage.py.

. В одном из моих модульных тестов я запускаю функцию через multirpocessing, и покрытие не отражает функции, выполняемые через multirpocessing, но утверждает работа. Вот проблему, которую я пытаюсь решить.

Тест выглядит так:

import time
import multiprocessing

def test_a_while_loop():
    # Start through multiprocessing in order to have a timeout.
    p = multiprocessing.Process(
        target=foo
        name="Foo",
    )
    try:
        p.start()
        # my timeout
        time.sleep(10)
        p.terminate()
    finally:
        # Cleanup.
        p.join()

    # Asserts below
    ...

Чтобы запустить тесты и увидеть охват, я использую в Ubuntu следующую команду:

coverage run --concurrency=multiprocessing -m pytest my_project/
coverage combine
coverage report

В документах даются указания о том, что нужно сделать, чтобы покрытие правильно учитывало многопроцессорность ( здесь ). Итак, я настроил .coveragerc следующим образом:

[run]
concurrency = multiprocessing

[report]
show_missing = true

, а также sitecustomize.py выглядит так:

import coverage
coverage.process_startup()

Несмотря на это, вышеуказанная функция работает через multiprocessing все еще не учитывается в покрытии.

Что я делаю неправильно или отсутствует?

PS Этот кажется похожим вопросом, однако он не решает мою проблему снова: (

1 Ответ

2 голосов
/ 10 апреля 2020

Я «исправил» эту проблему, выполнив два действия:

  1. Переключение пакета покрытия с coverage.py на pytest-cov.
  2. Добавление этого кода над process, как описано в их документах .

Код:

try:
    from pytest_cov.embed import cleanup_on_sigterm
except ImportError:
    pass
else:
    cleanup_on_sigterm()

Затем я просто запускаю pytest --cov=my_proj my_proj/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...