Если вы всё ещё не проверяете покрытие тестами — самое время начать. Вот пара свежих примеров, почему это важно.
Пример 1: два одинаковых теста — но один не выполняется:
def test_get_install_to_run_with_platform(patched_installs):
i = installs.get_install_to_run("<none>", None, "1.0-32")
assert i["id"] == "PythonCore-1.0-32"
...
def test_get_install_to_run_with_platform(patched_installs): # дублирующее имя
i = installs.get_install_to_run("<none>", None, "1.0-32", windowed=True)
assert i["id"] == "PythonCore-1.0-32"
...
Копировали тест и забыли переименовать? Первый просто не запускается — и вы даже не заметите без отчёта по покрытию. В отчёте будет видно: тест написан, но не выполнялся.
✔️ Переименовали — и всё стало работать.
👉 Без
coverage — баги в тестах могут так и остаться незамеченными.💡 Подсказка: это также ловит ruff F811 и легко решается через
@pytest.mark.parametrize.Пример 2: генератор в тесте, который не сработал:
im = Image.new("RGB", (1, 1))
for colors in (("#f00",), ("#f00", "#0f0")):
append_images = (Image.new("RGB", (1, 1), color) for color in colors)
im_reloaded = roundtrip(im, save_all=True, append_images=append_images)
assert_image_equal(im, im_reloaded)
assert isinstance(im_reloaded, MpoImagePlugin.MpoImageFile)
assert im_reloaded.mpinfo is not None
assert im_reloaded.mpinfo[45056] == b"0100"
for im_expected in append_images:
im_reloaded.seek(im_reloaded.tell() + 1)
assert_image_similar(im_reloaded, im_expected, 1)Генератор был уже использован внутри
roundtrip(), и цикл не выполняется — тест пропускается.👉 Без
coverage — даже не заметите.✔️ Решение — заменить генератор на
list(...).🟣 Короткий итог: даже если тесты «проходят», это не значит, что они выполняются или действительно что-то тестируют.
🟣 Покрытие — простой способ избежать ложного чувства безопасности.
🟣 Попробуйте
coverage run -m pytest && coverage report.Библиотека питониста #буст
