Покрытие кода Python отсутствует, когда файлы имеют одинаковые имена

#python #pytest #code-coverage

#python #pytest #покрытие кода

Вопрос:

Я использую pytest и pytest-cov для покрытия кода.

Мой проект выглядит следующим образом. Есть два модуля services и workers .

 python_tmp
├── tests
│   └── some_test.py
├── services
│   └── utils.py
└── workers
    └── utils.py
 

Оба они имеют utils.py inside. Но содержимое отличается.

services/utils.py

 def function_1():
    return 1
 

и workers/utils.py

 def function_2():
    return 2
 

В tests/some_test.py вы можете найти тестовые примеры.

 import pytest
import services.utils as t1
import workers.utils as t2

def test_function_1():
    res = t1.function_1()
    assert res == 1

def test_function_2():
    res = t2.function_2()
    assert res == 2
 

Если я запущу тест python -m pytest -v tests --cov=services --cov=workers --cov-report=xml:coverage.xml , он сгенерирует следующий отчет. Но вы можете видеть, что сообщается только об одном utils.py , и есть двусмысленность в том, что вы не знаете, к какому модулю он принадлежит.

 ...
    <sources>
        <source>/Users/xxxxxxx/workspace/tmp/python_tmp/services</source>
        <source>/Users/xxxxxxx/workspace/tmp/python_tmp/workers</source>
    </sources>
    <packages>
        <package branch-rate="0" complexity="0" line-rate="1" name=".">
            <classes>
                <class branch-rate="0" complexity="0" filename="utils.py" line-rate="1" name="utils.py">
                    <methods/>
                    <lines>
                        <line hits="1" number="1"/>
                        <line hits="1" number="2"/>
                    </lines>
                </class>
            </classes>
        </package>
    </packages>
</coverage>
 

Как это исправить? Спасибо за ваше время!

Ответ №1:

Эта проблема упоминается здесь

Итак, чтобы исправить это, вы можете запустить python -m pytest -v tests --cov --cov-report=xml:coverage.xml .

Надеюсь, это поможет.

Комментарии:

1. Вероятно --cov=. , AFAIR для этого требуется значение.

2. Я запустил его в своей системе для тестирования. Это работает нормально. (Не добавляйте знак ‘=’)

3. Я тоже запускал его в своей системе. --cov без аргумента действительно работает (я помню, что раньше это не работало), но также включает pytest и вставляет источники в отчет, что вряд ли желательно.

4. Каково ваше предложение игнорировать папки, поскольку --cov оно будет включать все папки в текущем каталоге. Создать .coveragerc файл и опустить его? Спасибо!

5. Из ссылки, упомянутой в моем ответе, говорится, что эта ошибка не была воспроизведена в версии 2.2.0, но откат к такой старой версии приведет к другим ошибкам. Я думаю, лучшим вариантом будет модификация файла .coveragerc.