Блоки describe и it
Структурируйте набор тестов.
«Блоки describe и it» — бесплатный урок Lua Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Lua Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Lua Academy содержит 4 уроков всего.
Структура спецификации
busted организует тесты с помощью двух основных функций: describe и it. Блок describe объединяет связанные тесты, а каждый блок it является отдельным тестовым случаем.
Такая структура происходит из разработки, управляемой поведением, и читается как обычный английский текст.
describe("Stack", function()
it("starts empty", function()
assert.are.equal(0, Stack.new():size())
end)
end)Блок describe
describe принимает строку с именем и функцию. Имя должно обозначать тестируемый компонент или функциональность, например модуль или класс.
Всё внутри функции относится к этой группе. Имя отображается в выводе тестов и помогает организовать результаты.
describe("calculator", function()
-- tests live here
end)Блок it
Каждый блок it описывает одно конкретное поведение. Строка должна завершать предложение, начатое с помощью describe.
Вместе «калькулятор» и «складывает два числа» образуют ясную спецификацию намерения.
describe("calculator", function()
it("adds two numbers", function()
assert.are.equal(5, calc.add(2, 3))
end)
end)Вложенные блоки describe
Блоки describe можно вкладывать друг в друга, чтобы выразить контекст. Внутренний блок может описывать конкретный метод или особое условие.
Вложенность объединяет связанные случаи и создаёт удобный для чтения вывод с отступами.
describe("List", function()
describe("push", function()
it("adds an item", function()
assert.are.equal(1, list:push("a"):size())
end)
end)
end)Настройка before_each
before_each запускает функцию перед каждым блоком it в своём блоке. Используйте его для создания свежих тестовых данных, чтобы тесты не разделяли состояние.
Это сохраняет изоляцию каждого теста. Изменение в одном тесте не может повлиять на следующий.
describe("Stack", function()
local s
before_each(function()
s = Stack.new()
end)
it("pushes", function()
s:push(1)
assert.are.equal(1, s:size())
end)
end)Очистка after_each
after_each запускается после каждого теста. Используйте его для очистки ресурсов, таких как временные файлы, открытые соединения или глобальное состояние.
Сочетание настройки и очистки гарантирует сброс среды между тестами.
after_each(function()
os.remove("temp.db")
end)Настройка и очистка
busted также предоставляет setup и teardown, которые запускаются один раз для каждого блока describe, а не один раз для каждого теста.
Используйте их для ресурсоёмкой одноразовой работы, например открытия общего соединения, когда настройка перед каждым тестом была бы неэффективной.
describe("db", function()
setup(function()
db = connect()
end)
teardown(function()
db:close()
end)
end)Отложенные тесты
Иногда нужно отметить тест, который ещё не написан. Вызовите pending с описанием или создайте блок it без функции.
busted сообщает о них как об отложенных, а не как об успешных или неуспешных, напоминая Вам завершить их.
it("handles unicode", function()
pending("not implemented yet")
end)Фокусировка и исключение
Во время отладки можно сосредоточиться на части тестов. Использование --tags в командной строке или вспомогательных средств busted позволяет запускать только важные тесты.
Это избавляет от запуска всего набора, пока Вы работаете над одной проблемной областью.
-- run only tests tagged 'fast'
-- busted --tags=fastСоглашения об именовании
Хорошие имена делают причины ошибок понятными без дополнительных объяснений. Начинайте describe с предмета, а it — с глагола, описывающего поведение.
Избегайте расплывчатых имён вроде «работает» или «тест1». Неуспешный тест должен читаться как описание ошибки, с которой можно работать.
describe("parser", function()
it("rejects malformed input", function()
assert.has_error(function() parser.parse("{") end)
end)
end)Объединяем всё
Полная спецификация сочетает группы describe, настройку before_each и целевые случаи it. Эта основа масштабируется от одного теста до сотен.
Делайте блоки небольшими и сосредоточьтесь в каждом it на одном поведении, чтобы получить максимально ясный вывод.
describe("Account", function()
local acc
before_each(function() acc = Account.new(100) end)
it("withdraws funds", function()
acc:withdraw(40)
assert.are.equal(60, acc.balance)
end)
end)Быстрая проверка
Проверьте, насколько хорошо Вы поняли структуру блоков busted.
Итоги
describe объединяет связанные тесты, а it определяет отдельный случай, вместе формируя спецификацию. Вкладывайте блоки describe, чтобы выразить контекст.
Используйте before_each и after_each для изоляции каждого теста, а setup и teardown — для работы, выполняемой один раз за блок. Отмечайте незавершённую работу с помощью pending.
Часто задаваемые вопросы
Урок «Блоки describe и it» бесплатный?
Да — полный текст урока «Блоки describe и it» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Lua Academy, подпишись на CoddyKit PRO. Курс Lua Academy содержит 4 уроков всего.
Чему я научусь в уроке «Блоки describe и it»?
Структурируйте набор тестов. Ты практикуешь Lua Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Lua Academy?
Предыдущий опыт не требуется. Lua Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Блоки describe и it»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Lua Academy?
Да. Каждый урок Lua Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Зачем нужны тесты
- Блоки describe и it
- Проверки утверждений
- Имитации и шпионы