Тестирование и версионирование
Качество и 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, actualassert objиrefute objassert_nil valueassert_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 — локальная установка не требуется.
Все уроки этого курса
- Структура gem
- Написание кода
- Тестирование и версионирование
- Публикация в RubyGems