Skip to content

HeavyTechRuby/testing-rails-day3

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 
 
 
 
 
 
 

Repository files navigation

marp
true

Тестирование Ruby on Rails приложений

День 3. Тестирование UI


День 2.

  • TDD
  • BDD
  • Синтаксис RSpec
  • Тестирование Requests
  • Приниципы хорошего тесты
  • Рефакторинг тестов

День 3

  • Покрытие кода
  • Пирамида тестирование
  • Изоляция тестов
  • Тестирование UI
  • Другие тесты
  • Внедрение тестов в legacy-проект
  • Ошибки новичков
  • Что дальше

Покрытие кода


SimpleCov

# Gemfile
group :test do
  gem 'simplecov', require: false
end

# spec/spec_helper.rb
require 'simplecov'
SimpleCov.start 'rails' do
  add_filter '/spec/' 
  add_group 'Models', 'app/models'
  add_group 'Controllers', 'app/controllers'
  # ...
end

Применение

  • Целевое показатель
  • CI

Ограничения

  • Погоня за покрытием а не качеством
  • Гарантии

Пирамида тестирвания


Ошибки пирамиды

  • Дисбаланс
  • Отсутствие уровней
  • Перевернутая пирамида

Изоляция тестов

  • Скорость
  • Надежность
  • Простота
  • Воспроизведение сложных кейсов

Что изолировать

  • База данных
  • Файловая система
  • Внешние API
  • время
  • Что не контроллируем

allow to receive

allow(notifications).to receive(:notify).with(subscriber.email).and_return(:OK)

episode.publish

double

episode = double(:episode, title: "Title")

podcast.publish_episode(episode)

expect(podcast.episodes).to include(episode)

expect to receive

episode = double(:episode, title: "Title")

podcast.publish_episode(episode)

expect(episode).to have_received(:publish)

VCR


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


group :test do
  # Use system testing [https://guides.rubyonrails.org/testing.html#system-testing]
  gem "capybara"
  gem "selenium-webdriver"
end

require 'rails_helper'

RSpec.describe "Login Page", type: :feature do
  let!(:user) { FactoryBot.create(:user, password: "secret123") }

  it "logins user" do
    visit "/login"

    fill_in "Email", with: user.email
    fill_in "Password", with: "secret123"
    click_button "Login"

    expect(page).to have_content "Welcome, User!"
  end
end

Selector

expect(page).to have_css('table tr.foo')
expect(page).to have_content('foo')

within

within("#podcast_form") do
  fill_in "Titlte", with: "New Podcast"
  click_button "Save"
end

driver

before { Capybara.current_driver = :selenium_headless }
after { Capybara.use_default_driver }

wait

Capybara.default_max_wait_time = 5

Другие тесты


module PagesHelper
  def page_title(page) = "<h1>#{page.title}</h1>"
end

describe PagesHelper do
  describe "#page_title" do
    it { expect(helper.page_title(page)).to include("h1") }
    it { expect(helper.page_title(page)).to include(page.title) }
  end
end

RSpec.describe PagesController, type: :routing do
  describe "routing" do
    it "routes to #index" do
      expect(get: "/pages").to route_to("pages#index")
    end
  end
end

А также

  • ActiveJob
  • ActiveMailer
  • Service
  • ActionCable

Внедрение тестов в legacy-проект

  • что самое критичное
  • где чаще всего возникают баги
  • что чаще меняется
  • что не покрыто

  1. UI тесты
  2. настройка CI
  3. unit тесты
  4. тесты для нового кода
  5. изоляция сложных зависимостей

rspec --fail-fast

rspec --only-failures

rspec --next-failure

rspec --profile

Ошибки новичков

  • тесты после кода
  • низкое покрытие
  • раздутый контекст
  • медленные тесты
  • неудобный для тестирования код

Ошибки

  • нечитаемые тесты
  • тестирование реализации
  • редкий запуск тестов
  • низкое качество кода тестов

Что дальше


Спасибо!

tg @UdalovX yt @SergeiUdalov email udalov.x@mail.ru

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published