0Pricing
Lua Academy · Урок

Блоки 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 — локальная установка не требуется.

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

  1. Зачем нужны тесты
  2. Блоки describe и it
  3. Проверки утверждений
  4. Имитации и шпионы
← Назад к Lua Academy