HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>Некачественный код может привести к множеству проблем, включая трудности в сопровождении, увеличение времени на исправление ошибок и снижение производительности приложения. Инструменты для обеспечения качества кода позволяют выявлять ошибки и проверять соответствие стандартам. К таким инструментам относятся линтеры, статические анализаторы и тесты.</p>
1 <p>Некачественный код может привести к множеству проблем, включая трудности в сопровождении, увеличение времени на исправление ошибок и снижение производительности приложения. Инструменты для обеспечения качества кода позволяют выявлять ошибки и проверять соответствие стандартам. К таким инструментам относятся линтеры, статические анализаторы и тесты.</p>
2 <p>В этом уроке мы рассмотрим статический анализатор кода и линтер RuboCop. Мы изучим его установку, настройку и использование для анализа кода, а также познакомимся с основами тестирования в Rails, что поможет обеспечить надежность и стабильность разрабатываемых приложений.</p>
2 <p>В этом уроке мы рассмотрим статический анализатор кода и линтер RuboCop. Мы изучим его установку, настройку и использование для анализа кода, а также познакомимся с основами тестирования в Rails, что поможет обеспечить надежность и стабильность разрабатываемых приложений.</p>
3 <h2>Статический анализатор RuboCop</h2>
3 <h2>Статический анализатор RuboCop</h2>
4 <p>RuboCop - это статический анализатор кода для Ruby, который помогает поддерживать стиль кода и следовать соглашениям в проекте. Он основан на Ruby Style Guide и предоставляет правила (копов), которые можно настраивать в зависимости от потребностей проекта. Основные возможности RuboCop включают:</p>
4 <p>RuboCop - это статический анализатор кода для Ruby, который помогает поддерживать стиль кода и следовать соглашениям в проекте. Он основан на Ruby Style Guide и предоставляет правила (копов), которые можно настраивать в зависимости от потребностей проекта. Основные возможности RuboCop включают:</p>
5 <ul><li><strong>Статический анализ</strong>: Проверка кода на соответствие стилю и стандартам.</li>
5 <ul><li><strong>Статический анализ</strong>: Проверка кода на соответствие стилю и стандартам.</li>
6 <li><strong>Автоматическая корректировка</strong>: Возможность автоматически исправлять некоторые недочеты.</li>
6 <li><strong>Автоматическая корректировка</strong>: Возможность автоматически исправлять некоторые недочеты.</li>
7 <li><strong>Настраиваемые правила</strong>: Возможность включать или отключать определенные правила в зависимости от требований проекта.</li>
7 <li><strong>Настраиваемые правила</strong>: Возможность включать или отключать определенные правила в зависимости от требований проекта.</li>
8 <li><strong>Интеграция с редакторами</strong>: Поддержка плагинов для популярных редакторов, что позволяет получать обратную связь в реальном времени.</li>
8 <li><strong>Интеграция с редакторами</strong>: Поддержка плагинов для популярных редакторов, что позволяет получать обратную связь в реальном времени.</li>
9 </ul><h3>Установка RuboCop</h3>
9 </ul><h3>Установка RuboCop</h3>
10 <p>Чтобы установить RuboCop для Rails, нужно добавить его в<em>Gemfile</em>:</p>
10 <p>Чтобы установить RuboCop для Rails, нужно добавить его в<em>Gemfile</em>:</p>
11 <p>Так как в это dev-зависимость, то и добавляется Rucobop в окружение для разработки и для тест-окружения (для CI).</p>
11 <p>Так как в это dev-зависимость, то и добавляется Rucobop в окружение для разработки и для тест-окружения (для CI).</p>
12 <p>Дальше необходимо установить новую зависимость с помощью Bundler:</p>
12 <p>Дальше необходимо установить новую зависимость с помощью Bundler:</p>
13 <p>Проверим, что RuboCop установлен:</p>
13 <p>Проверим, что RuboCop установлен:</p>
14 <h3>Файл конфигурации</h3>
14 <h3>Файл конфигурации</h3>
15 <p>RuboCop по умолчанию поставляется со своими правилами и проверяет весь проект. Чтобы применить тонкую настройку, мы можем создать файл<em>.rubocop.yml</em>и добавить туда правила проверок:</p>
15 <p>RuboCop по умолчанию поставляется со своими правилами и проверяет весь проект. Чтобы применить тонкую настройку, мы можем создать файл<em>.rubocop.yml</em>и добавить туда правила проверок:</p>
16 <p>Ранее вместе с RuboCop мы добавили гемы rubocop-rails и rubocop-performance - это наборы правил для Rails-приложений. Чтобы их включить нужно их добавить в<em>.rubocop.yml</em>:</p>
16 <p>Ранее вместе с RuboCop мы добавили гемы rubocop-rails и rubocop-performance - это наборы правил для Rails-приложений. Чтобы их включить нужно их добавить в<em>.rubocop.yml</em>:</p>
17 <p>Обычно файлы конфигурации не пишут с нуля, а используют готовые, из проекта-шаблона или из предыдущего проекта. Например в проекте<a>Hexlet CV</a>мы можем взять конфиг и добавить к себе.</p>
17 <p>Обычно файлы конфигурации не пишут с нуля, а используют готовые, из проекта-шаблона или из предыдущего проекта. Например в проекте<a>Hexlet CV</a>мы можем взять конфиг и добавить к себе.</p>
18 <p>RuboCop установлен и настроен, теперь необходимо проверить проект на ошибки и соответствие стайл гайду.</p>
18 <p>RuboCop установлен и настроен, теперь необходимо проверить проект на ошибки и соответствие стайл гайду.</p>
19 <h3>Проверка кода</h3>
19 <h3>Проверка кода</h3>
20 <p>Если мы запустим RuboCop первый раз, мы увидим множество ошибок. Точное их количество будет в конце</p>
20 <p>Если мы запустим RuboCop первый раз, мы увидим множество ошибок. Точное их количество будет в конце</p>
21 <p>Вывод команды bundle exec rubocop показывает, что было проверено 33 файла, и обнаружено 166 недочетов (offenses). Все недочеты помечены буквой "C", что указывает на то, что они являются проблемами стиля (Correctable) и их можно исправить автоматически.</p>
21 <p>Вывод команды bundle exec rubocop показывает, что было проверено 33 файла, и обнаружено 166 недочетов (offenses). Все недочеты помечены буквой "C", что указывает на то, что они являются проблемами стиля (Correctable) и их можно исправить автоматически.</p>
22 <p>RuboCop предоставляет возможность автоматической корректировки кода. Для этого используются две основные опции:</p>
22 <p>RuboCop предоставляет возможность автоматической корректировки кода. Для этого используются две основные опции:</p>
23 <ul><li>Опция -a исправляет только те недочеты, которые не могут повредить бизнес-логике (например, форматирование кода).</li>
23 <ul><li>Опция -a исправляет только те недочеты, которые не могут повредить бизнес-логике (например, форматирование кода).</li>
24 <li>Опция -A может вносить изменения, которые потенциально могут повлиять на логику приложения. Но ее можно использовать без опасений на новом проекте, в котором еще нет никакой логики.</li>
24 <li>Опция -A может вносить изменения, которые потенциально могут повлиять на логику приложения. Но ее можно использовать без опасений на новом проекте, в котором еще нет никакой логики.</li>
25 </ul><p>Вывод команды похож на тот, что вы получили при проверке, только здесь будут отмечены применённые исправления. Не все исправления можно выполнить автоматически, поэтому внимательно изучите отчет анализатора.</p>
25 </ul><p>Вывод команды похож на тот, что вы получили при проверке, только здесь будут отмечены применённые исправления. Не все исправления можно выполнить автоматически, поэтому внимательно изучите отчет анализатора.</p>
26 <h2>Тестирование</h2>
26 <h2>Тестирование</h2>
27 <p>Rails предоставляет мощные инструменты для написания и выполнения тестов. Тесты обычно располагаются в директории<em>test/</em>, где они разделены по директориям:</p>
27 <p>Rails предоставляет мощные инструменты для написания и выполнения тестов. Тесты обычно располагаются в директории<em>test/</em>, где они разделены по директориям:</p>
28 <ul><li><em>test/models/</em>- для тестов моделей.</li>
28 <ul><li><em>test/models/</em>- для тестов моделей.</li>
29 <li><em>test/controllers/</em>- для тестов контроллеров.</li>
29 <li><em>test/controllers/</em>- для тестов контроллеров.</li>
30 <li><em>test/integration/</em>- для интеграционных тестов.</li>
30 <li><em>test/integration/</em>- для интеграционных тестов.</li>
31 <li><em>test/system/</em>- для системных тестов.</li>
31 <li><em>test/system/</em>- для системных тестов.</li>
32 </ul><p>Для большинства Rails-приложений тестов для контроллеров уже достаточно, чтобы обеспечить базовую проверку приложения. Однако в зависимости от сложности приложения и требований к качеству, может потребоваться также использование других типов тестов, таких как системные тесты.</p>
32 </ul><p>Для большинства Rails-приложений тестов для контроллеров уже достаточно, чтобы обеспечить базовую проверку приложения. Однако в зависимости от сложности приложения и требований к качеству, может потребоваться также использование других типов тестов, таких как системные тесты.</p>
33 <p>Пример тестов контроллера резюме в<a>Hexlet CV</a>:</p>
33 <p>Пример тестов контроллера резюме в<a>Hexlet CV</a>:</p>
34 <p>В этих тестах используется фреймворк тестирования Minitest с гемом power-assert.</p>
34 <p>В этих тестах используется фреймворк тестирования Minitest с гемом power-assert.</p>
35 <h3>Фикстуры</h3>
35 <h3>Фикстуры</h3>
36 <p>Фикстуры в Rails - это способ предварительной загрузки данных в базу данных для тестирования. Они позволяют создавать наборы данных, которые могут быть использованы в тестах, чтобы обеспечить предсказуемую и стабильную среду для выполнения тестов. Фикстуры особенно полезны там, где необходимо иметь определенные данные для проверки работы приложения.</p>
36 <p>Фикстуры в Rails - это способ предварительной загрузки данных в базу данных для тестирования. Они позволяют создавать наборы данных, которые могут быть использованы в тестах, чтобы обеспечить предсказуемую и стабильную среду для выполнения тестов. Фикстуры особенно полезны там, где необходимо иметь определенные данные для проверки работы приложения.</p>
37 <p>Фикстуры обычно хранятся в формате YAML. Каждый файл фикстуры соответствует одной модели и содержит записи, которые будут загружены в базу данных перед выполнением тестов. В файле фикстуры каждая запись имеет уникальный идентификатор, который используется для ссылки на эту запись в тестах.</p>
37 <p>Фикстуры обычно хранятся в формате YAML. Каждый файл фикстуры соответствует одной модели и содержит записи, которые будут загружены в базу данных перед выполнением тестов. В файле фикстуры каждая запись имеет уникальный идентификатор, который используется для ссылки на эту запись в тестах.</p>
38 <p>Фикстуры автоматически загружаются в базу данных перед выполнением тестов. Это происходит благодаря методу fixtures() в<em>тестах</em>, который указывает, какие фикстуры нужно загрузить.</p>
38 <p>Фикстуры автоматически загружаются в базу данных перед выполнением тестов. Это происходит благодаря методу fixtures() в<em>тестах</em>, который указывает, какие фикстуры нужно загрузить.</p>
39 <p>В тестах можно обращаться к загруженным фикстурам по их идентификаторам:</p>
39 <p>В тестах можно обращаться к загруженным фикстурам по их идентификаторам:</p>
40 <p>Фикстуры позволяют легко создавать и управлять тестовыми данными. Особенно там, где требуется сложное состояние БД. Они обеспечивают консистентность данных между тестами. Фикстуры можно использовать с гемами faker или factory_bot_rails для того, чтобы упростить создание фикстур там, где не нужны конкретные значения.</p>
40 <p>Фикстуры позволяют легко создавать и управлять тестовыми данными. Особенно там, где требуется сложное состояние БД. Они обеспечивают консистентность данных между тестами. Фикстуры можно использовать с гемами faker или factory_bot_rails для того, чтобы упростить создание фикстур там, где не нужны конкретные значения.</p>
41 <h3>Транзакционные тесты</h3>
41 <h3>Транзакционные тесты</h3>
42 <p>Транзакционные тесты в Rails - это подход к тестированию, при котором каждый тест выполняется в рамках транзакции базы данных. Это позволяет изолировать тесты друг от друга и гарантировать, что изменения, внесенные в базу данных в ходе теста, не повлияют на другие тесты. После завершения теста транзакция откатывается, и база данных возвращается в исходное состояние.</p>
42 <p>Транзакционные тесты в Rails - это подход к тестированию, при котором каждый тест выполняется в рамках транзакции базы данных. Это позволяет изолировать тесты друг от друга и гарантировать, что изменения, внесенные в базу данных в ходе теста, не повлияют на другие тесты. После завершения теста транзакция откатывается, и база данных возвращается в исходное состояние.</p>
43 <p>Каждый тест выполняется в своей транзакции, что предотвращает "загрязнение" базы данных. Это особенно полезно, когда тесты изменяют данные, так как изменения не сохраняются после завершения теста. В Rails при использовании ActiveSupport::TestCase транзакционные тесты включены по умолчанию.</p>
43 <p>Каждый тест выполняется в своей транзакции, что предотвращает "загрязнение" базы данных. Это особенно полезно, когда тесты изменяют данные, так как изменения не сохраняются после завершения теста. В Rails при использовании ActiveSupport::TestCase транзакционные тесты включены по умолчанию.</p>
44 <p>Пример транзакционного теста:</p>
44 <p>Пример транзакционного теста:</p>
45 <h3>Пишем первый тест</h3>
45 <h3>Пишем первый тест</h3>
46 <p>Когда мы вызываем генератор для создания контроллера, то создается также класс для тестирования этого контроллера. Вызовем генератор для создания контроллера:</p>
46 <p>Когда мы вызываем генератор для создания контроллера, то создается также класс для тестирования этого контроллера. Вызовем генератор для создания контроллера:</p>
47 <p>Получили пустой контроллер:</p>
47 <p>Получили пустой контроллер:</p>
48 <p>И тестовый класс без методов</p>
48 <p>И тестовый класс без методов</p>
49 <p>Добавим обработчик в<em>config/routes.rb</em></p>
49 <p>Добавим обработчик в<em>config/routes.rb</em></p>
50 <p>И добавим тест на добавленный роут</p>
50 <p>И добавим тест на добавленный роут</p>
51 <p>В контроллер добавим экшен:</p>
51 <p>В контроллер добавим экшен:</p>
52 <p>И шаблон<em>app/views/pages/index.html.erb</em>, который будет выводиться экшеном:</p>
52 <p>И шаблон<em>app/views/pages/index.html.erb</em>, который будет выводиться экшеном:</p>
53 <p>Теперь мы готовы запустить тесты и проверить, что все работает. Запустить тесты можно командой bin/rails test:</p>
53 <p>Теперь мы готовы запустить тесты и проверить, что все работает. Запустить тесты можно командой bin/rails test:</p>
54 <p>Запуск тестов завершился успешно. Если на каком-то из этапов возникла бы ошибка, то тесты бы об этом сообщили. Например так выглядит ошибка, если нет экшена и шаблона:</p>
54 <p>Запуск тестов завершился успешно. Если на каком-то из этапов возникла бы ошибка, то тесты бы об этом сообщили. Например так выглядит ошибка, если нет экшена и шаблона:</p>
55 <h2>binding.irb</h2>
55 <h2>binding.irb</h2>
56 <p>В Ruby и Rails есть инструмент для отладки кода - binding.irb, который позволяет вам вставлять интерактивную консоль в любое место вашего кода. Это может быть особенно полезно для диагностики проблем, анализа состояния переменных и выполнения произвольного кода в контексте текущего выполнения программы.</p>
56 <p>В Ruby и Rails есть инструмент для отладки кода - binding.irb, который позволяет вам вставлять интерактивную консоль в любое место вашего кода. Это может быть особенно полезно для диагностики проблем, анализа состояния переменных и выполнения произвольного кода в контексте текущего выполнения программы.</p>
57 <p>Чтобы использовать irb, нужно вызвать binding.irb внутри кода:</p>
57 <p>Чтобы использовать irb, нужно вызвать binding.irb внутри кода:</p>
58 <p>Использовать binding.irb можно даже во время выполнения тестов</p>
58 <p>Использовать binding.irb можно даже во время выполнения тестов</p>
59 <h2>Заключение</h2>
59 <h2>Заключение</h2>
60 <p>В ходе урока мы познакомились с RuboCop - статическим анализатором кода для Ruby, который помогает поддерживать стиль и стандарты кода в проектах. Мы рассмотрели процесс установки и настройки RuboCop, включая создание конфигурационного файла<em>.rubocop.yml</em>для настройки правил проверки. Также мы изучили, как использовать RuboCop для анализа кода и автоматической корректировки недочетов.</p>
60 <p>В ходе урока мы познакомились с RuboCop - статическим анализатором кода для Ruby, который помогает поддерживать стиль и стандарты кода в проектах. Мы рассмотрели процесс установки и настройки RuboCop, включая создание конфигурационного файла<em>.rubocop.yml</em>для настройки правил проверки. Также мы изучили, как использовать RuboCop для анализа кода и автоматической корректировки недочетов.</p>
61 <p>Мы обсудили основы тестирования в Rails, включая использование фикстур и транзакционных тестов, а также написание простых тестов для контроллеров.</p>
61 <p>Мы обсудили основы тестирования в Rails, включая использование фикстур и транзакционных тестов, а также написание простых тестов для контроллеров.</p>
62 <p>Рассмотрели инструмент binding.irb для отладки кода, который позволяет отлаживать и исправлять ошибки в приложении.</p>
62 <p>Рассмотрели инструмент binding.irb для отладки кода, который позволяет отлаживать и исправлять ошибки в приложении.</p>