Скоростное тестирование Rails / Александр Балашов (Evrone)

Preview:

DESCRIPTION

 

Citation preview

Тестирование. Скорость.

Александр Балашов / Evrone

Загрузка приложения

1

(при реальном количестве гемов)

Группы в Gemfile

=> 3с

group :testgroup :developmentgroup :production

:development

•hirb

•wirble

• bullet

•migration_opener

• letter_opener

• capistrano

• quiet_assets

• capistrano-nc

• localeapp

• dev_log_in

:test

• fakeweb

• timecop

• database_cleaner

• launchy

• zonebie

:production

•newrelic_rpm

Lazy require

=> 3с

gem 'savon', require: falserequire 'savon'

gem ‘paper_trail’, require: false

gem 'whenever', require: false

Почистить Gemfile

Редко используемые

# gem ‘debugger’# gem ‘ruby-prof’

Время выполнения

2

Finished in 15 minutes 12.9 seconds1589 examples, 0 failures, 0 pending

Статистика FactoryGirl

USER — 1m 36create: 3425

• до 2 мин на создание одной фабрики

• несколько тысяч вызовов каждой• 7 фабрик с временем минута и более

Время FactoryGirl

50%

FactoryGirl.create(:user)

Когда реально нужно учитывать состояние БД

FactoryGirl.build(:user)

Реально создаёт объекты в БД

User.new

•Простые валидации•Методы не связанные с БД

stub_model(User)

•Быстро работает•Независимость тестов•Подходит для spec/services/*

•Подходит для spec/mailers/*

FactoryGirl Seeds

Вложенные фабрики

=> 2мин

rating < comment < post < user < city

factory :keyword do project { seed(:project) } user { project.user }

Стандартные фабрики

comment = create(:comment)

Finished in 10 minutes 42.38 seconds1556 examples, 0 failures, 0 pending

(10 * 60 + 42) / (15 * 60 + 13) =

2x

Запуск тестов

3

Spork

Spin

spin servespin push spec/models/user_spec.rb:12

Zeus

zeus startzeus test spec/models/user_spec.rb:12

Spring

spring rspec spec/models/user_spec.rb:12

alias rg='spring rails g'alias rs='spring rails s'alias rc='spring rails c'

rails/commands

rails console test

> test "models/user"

rspec-console

rspec spec/models/user_spec.rb:13

Приёмы в спеках

4

valid? вместо save

много it при объёмном before

slow: true

(требует CI-сервера)

# .rspec--tag ~slow --tag ~stable

stable: true

(требует CI-сервера)

Rails.logger.level = Logger::WARN

Devise.stretches = 1

Top 10 slowest examples

# .rspec-p

Повсеместный User

user = create(:user)

Finished in 2 minutes 38.91 seconds893 examples, 0 failures, 0 pending

(15 * 60 + 13) / (2 * 60 + 38) =

6x

Recommended