0Pricing
Lua Academy · Урок

Покрытие кода и инструментирование тестов

Измеряйте покрытие тестами с помощью luacov и анализируйте отчёты о покрытии.

«Покрытие кода и инструментирование тестов» — бесплатный урок Lua Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Lua Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Lua Academy содержит 4 уроков всего.

Что такое покрытие кода

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

luacov: стандартный инструмент

luacov — стандартный инструмент покрытия кода для Lua. Он подключается к уровню отладки Lua и записывает, какие строки выполняются.

-- Run with luacov:
luacov script.lua
-- Or require at the start of the test file:
require("luacov")

Использование luacov с тестовым средством запуска

При использовании busted или собственного средства запуска подключите luacov в начале, и он автоматически начнёт записывать покрытие.

-- spec/all_spec.lua
require("luacov")
describe("my module", function()
  it("does something", function()
    local m = require("mymodule")
    assert.equals(m.add(1,2), 3)
  end)
end)

Формирование отчёта

После выполнения тестов luacov записывает файл luacov.stats.out. Запустите luacov-reporter, чтобы сформировать удобный для чтения отчёт.

# After tests:
luacov-reporter
# Produces luacov.report.out with per-file line coverage

Чтение отчёта

В каждой строке указаны количество попаданий, количество пропусков и исходная строка. Строки с 0 попаданий — непокрытый код, который может быть мёртвым кодом или указывать на отсутствующие варианты тестирования.

Покрытие ветвей

luacov отслеживает покрытие строк, но не покрытие ветвей. Для покрытия ветвей используйте более продвинутый инструмент или вручную добавьте тесты для каждого пути if/else.

Пользовательский обработчик покрытия

Создайте минимальный сборщик данных о покрытии с помощью debug.sethook для событий строк.

local covered = {}
debug.sethook(function(event, line)
  local info = debug.getinfo(2, "S")
  local src = info.short_src
  covered[src] = covered[src] or {}
  covered[src][line] = (covered[src][line] or 0) + 1
end, "l")
-- ... run tests ...
debug.sethook()

Пороговые значения покрытия

Задайте минимальный порог покрытия в CI (например, 80%). Завершайте сборку с ошибкой, если покрытие опускается ниже этого значения. Это предотвращает постепенное накопление случайно оставшегося мёртвого кода.

Шаблоны инструментирования тестов

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

Имитация для изоляции тестов

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

local realSend = http.send
local calls = {}
http.send = function(...) calls[#calls+1] = {...} end
-- run tests --
http.send = realSend  -- restore
print(#calls, "send calls")

Интеграция с CI

Запускайте luacov в конвейере CI. Загружайте отчёты о покрытии в Coveralls или Codecov, чтобы отслеживать изменения показателей между фиксациями.

Вопрос о покрытии

Что означает строка с 0 выполнениями в отчёте luacov?

Повторение: покрытие кода и инструментирование тестов

Используйте luacov, чтобы записывать покрытие строк и создавать отчёты. Устанавливайте пороговые значения покрытия в CI. Добавляйте пользовательское инструментирование с помощью debug.sethook для специализированного отслеживания. Используйте моки для изоляции модульных тестов и проверки количества вызовов.

Часто задаваемые вопросы

Урок «Покрытие кода и инструментирование тестов» бесплатный?

Да — полный текст урока «Покрытие кода и инструментирование тестов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Lua Academy, подпишись на CoddyKit PRO. Курс Lua Academy содержит 4 уроков всего.

Чему я научусь в уроке «Покрытие кода и инструментирование тестов»?

Измеряйте покрытие тестами с помощью luacov и анализируйте отчёты о покрытии. Ты практикуешь Lua Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Lua Academy?

Предыдущий опыт не требуется. Lua Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Покрытие кода и инструментирование тестов»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Lua Academy?

Да. Каждый урок Lua Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Подробно о библиотеке debug
  2. Удалённая отладка с MobDebug
  3. Профилирование с LuaProfiler
  4. Покрытие кода и инструментирование тестов
← Назад к Lua Academy