marp |
---|
true |
День 3. Тестирование UI
- TDD
- BDD
- Синтаксис RSpec
- Тестирование Requests
- Приниципы хорошего тесты
- Рефакторинг тестов
- Покрытие кода
- Пирамида тестирование
- Изоляция тестов
- Тестирование UI
- Другие тесты
- Внедрение тестов в legacy-проект
- Ошибки новичков
- Что дальше
# 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(notifications).to receive(:notify).with(subscriber.email).and_return(:OK)
episode.publish
episode = double(:episode, title: "Title")
podcast.publish_episode(episode)
expect(podcast.episodes).to include(episode)
episode = double(:episode, title: "Title")
podcast.publish_episode(episode)
expect(episode).to have_received(:publish)
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
expect(page).to have_css('table tr.foo')
expect(page).to have_content('foo')
within("#podcast_form") do
fill_in "Titlte", with: "New Podcast"
click_button "Save"
end
before { Capybara.current_driver = :selenium_headless }
after { Capybara.use_default_driver }
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
- что самое критичное
- где чаще всего возникают баги
- что чаще меняется
- что не покрыто
- UI тесты
- настройка CI
- unit тесты
- тесты для нового кода
- изоляция сложных зависимостей
rspec --fail-fast
rspec --only-failures
rspec --next-failure
rspec --profile
- тесты после кода
- низкое покрытие
- раздутый контекст
- медленные тесты
- неудобный для тестирования код
- нечитаемые тесты
- тестирование реализации
- редкий запуск тестов
- низкое качество кода тестов
tg @UdalovX yt @SergeiUdalov email udalov.x@mail.ru