0Pricing
Ruby Academy · Урок

Тестирование и версионирование

Качество и semver

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

Зачем тестировать гем?

Поскольку гем используют многие проекты, ошибка затрагивает всех. Автоматизированные тесты позволяют уверенно менять код и подтверждают, что гем по-прежнему работает.

  • Тесты документируют ожидаемое поведение.
  • Они выявляют регрессии до выпуска.
  • Они необходимы серьёзным пользователям, прежде чем те начнут использовать гем.

Выбор фреймворка

Два популярных варианта — Minitest (поставляется с Ruby и отличается лёгкостью) и RSpec (богатый DSL, очень распространённый). Подойдёт любой вариант; выберите один и добавьте его как зависимость для разработки в спецификацию гема.

Пример с Minitest

Тесты Minitest — это обычные классы с методами проверок. Ниже приведён самодостаточный пример, который запускает логику Вашего гема и проверяет результат.

require "minitest/autorun"

def greet(name)
  "Hi, " + name
end

class GreetTest < Minitest::Test
  def test_greet
    assert_equal "Hi, Sam", greet("Sam")
  end
end

Распространённые проверки

Полезные проверки Minitest:

  • assert_equal expected, actual
  • assert obj и refute obj
  • assert_nil value
  • assert_raises(Error) { ... }

Каждый тест должен проверять одно чётко определённое поведение.

require "minitest/autorun"

class MathTest < Minitest::Test
  def test_addition
    assert_equal 4, 2 + 2
  end

  def test_truth
    refute_nil 5
  end
end

Запуск и автоматизация тестов

Обычно добавляют задачу Rake, чтобы rake test запускала весь набор тестов. Затем система непрерывной интеграции запускает ту же задачу при каждом отправлении изменений, в нескольких версиях Ruby, чтобы рано обнаруживать проблемы.

Что такое семантическое версионирование?

Семантическое версионирование придаёт смысл номеру версии MAJOR.MINOR.PATCH:

  • MAJOR: несовместимые изменения API.
  • MINOR: новые возможности с обратной совместимостью.
  • PATCH: исправления ошибок с обратной совместимостью.

Пользователи полагаются на это, чтобы безопасно обновляться.

Разбор версии

Для версии 2.4.1: основной номер равен 2, дополнительный — 4, номер исправления — 1. Разделение строки показывает её составные части.

version = "2.4.1"
major, minor, patch = version.split(".")
puts "Major: " + major
puts "Minor: " + minor
puts "Patch: " + patch

Когда увеличивать каждую часть

Правила принятия решения:

  • Исправили ошибку, не меняя API? Увеличьте номер исправления.
  • Добавили возможность, а старый код по-прежнему работает? Увеличьте дополнительный номер и сбросьте номер исправления до 0.
  • Удалили или изменили существующее поведение? Увеличьте основной номер и сбросьте дополнительный номер и номер исправления до 0.
def bump_minor(version)
  major, minor, _patch = version.split(".").map(&:to_i)
  major.to_s + "." + (minor + 1).to_s + ".0"
end

puts bump_minor("1.3.5")

Ограничения версий

Пользователи фиксируют версию Вашего гема с помощью операторов в своём Gemfile:

  • '~> 1.4' разрешает версии от 1.4 до 2.0, не включая 2.0 (пессимистичное ограничение).
  • '>= 1.4' разрешает любую более новую версию.
  • '= 1.4.2' фиксирует точную версию.

Пессимистичное ограничение ~> используется чаще всего, обеспечивая баланс между обновлениями и безопасностью.

Ведите журнал изменений

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

Предварительные версии

Версии вроде 2.0.0.beta1 обозначают нестабильные предварительные выпуски. Пользователи должны явно согласиться на их установку, поэтому можно выпускать ранние версии для тестирования, не затрагивая обычные установки.

version = "2.0.0.beta1"
puts "Pre-release? " + version.include?("beta").to_s

Быстрая проверка

Проверьте своё понимание управления версиями.

Итоги: тестирование и управление версиями

Вы узнали, как поддерживать надёжность гема:

  • Пишите тесты с помощью Minitest или RSpec; автоматизируйте их с помощью Rake и непрерывной интеграции.
  • Следуйте семантическому версионированию: MAJOR.MINOR.PATCH.
  • Увеличивайте правильную часть номера для исправлений, новых возможностей или несовместимых изменений.
  • Используйте ограничения ~> и ведите журнал изменений.

Далее мы опубликуем гем в RubyGems.

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

Урок «Тестирование и версионирование» бесплатный?

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

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

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

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

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

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

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

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

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

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

  1. Структура gem
  2. Написание кода
  3. Тестирование и версионирование
  4. Публикация в RubyGems
← Назад к Ruby Academy