Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Приемочное тестирование и немного матана
Search
Makar Ermokhin
November 23, 2017
Programming
0
61
Приемочное тестирование и немного матана
Презентация с "Fall Saint P Ruby Meetup" (23.11.2017)
Makar Ermokhin
November 23, 2017
Tweet
Share
More Decks by Makar Ermokhin
See All by Makar Ermokhin
RRUG - Efficient Testing
earendil95
0
34
Taming InfluxDB
earendil95
1
110
[LT] Delete or not delete
earendil95
0
48
Other Decks in Programming
See All in Programming
3 Effective Rules for Using Signals in Angular
manfredsteyer
PRO
0
100
Quine, Polyglot, 良いコード
qnighy
4
640
色々なIaCツールを実際に触って比較してみる
iriikeita
0
330
Creating a Free Video Ad Network on the Edge
mizoguchicoji
0
120
聞き手から登壇者へ: RubyKaigi2024 LTでの初挑戦が 教えてくれた、可能性の星
mikik0
1
130
ペアーズにおけるAmazon Bedrockを⽤いた障害対応⽀援 ⽣成AIツールの導⼊事例 @ 20241115配信AWSウェビナー登壇
fukubaka0825
6
2k
Compose 1.7のTextFieldはPOBox Plusで日本語変換できない
tomoya0x00
0
190
What’s New in Compose Multiplatform - A Live Tour (droidcon London 2024)
zsmb
1
480
GitHub Actionsのキャッシュと手を挙げることの大切さとそれに必要なこと
satoshi256kbyte
5
430
Kaigi on Rails 2024 〜運営の裏側〜
krpk1900
1
230
3 Effective Rules for Using Signals in Angular
manfredsteyer
PRO
0
120
PHP でアセンブリ言語のように書く技術
memory1994
PRO
1
170
Featured
See All Featured
Code Reviewing Like a Champion
maltzj
520
39k
Visualization
eitanlees
145
15k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
26
2.1k
Making the Leap to Tech Lead
cromwellryan
133
8.9k
The World Runs on Bad Software
bkeepers
PRO
65
11k
The Cost Of JavaScript in 2023
addyosmani
45
6.8k
Art, The Web, and Tiny UX
lynnandtonic
297
20k
Teambox: Starting and Learning
jrom
133
8.8k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
28
2k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
329
21k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
28
9.1k
What's new in Ruby 2.0
geeforr
343
31k
Transcript
ПРИЕМОЧНОЕ ТЕСТИРОВАНИЕ Макар Ермохин, Teachbase
https://github.com/earendil95 https://github.com/teachbase
МАТЧАСТЬ Интеграционное тестирование — одна из фаз тестирования программного обеспечения,
при которой отдельные программные модули объединяются и тестируются в группе
МАТЧАСТЬ Приемочное тестирование — вид интеграционного, в котором подразумевается тестирование
готового продукта
ЗАЧЕМ?
ЗАЧЕМ? •Unit-тесты не тестируют модули в совокупности •Если вы используете
необычный frontend, где нет тестов
ЧТО НУЖНО? • Capybara • (Headless) браузер • PhantomJS •
Headless Chrome
PHANTOM JS •Прост в установке •Устаревший движок JS var a
= function() {}.bind(this); TypeError: 'undefined' is not a function
PHANTOM JS
HEADLESS CHROME •Сложнее в установке •Нет частичных скриншотов •Нужно разрешать
запросы
•Актуален и обновляется •Работаем с Chrome — один из самых
популярных браузеров HEADLESS CHROME
ТЕСТИРОВАНИЕ DOM
DOM •Методы visit и click_on •Матчеры have_* Первые помощники
scenario "follow link" do visit root_path click_on "Profile" expect(page).to have_content("Makar")
end DOM
•fill_in — универсальный метод заполнения форм •А так же choose,
check, uncheck и select DOM
scenario "updates profile" do visit edit_profile_path fill_in "Name", with: "Ivan"
click_on "Save" expect(page).to_not have_content("Makar") expect(page).to have_content("Ivan") end DOM
ЗАКРЕПИМ •Приемочный тест описывает поведение пользователя •Приемочный тест может быть
прочитан пользователем
ВЫВОД Приемочное тестирование — это тестирование черного ящика
ПРИМЕР Этот тест плохой click_on "Create" expect(User.count).to eq(2)
ПОДОЖДЁМ… •Асинхронная отправка формы •Асинхронная загрузка контента •Интересные* анимации *
они же хитровыдуманные
None
ПОДОЖДАТЬ… •expect(page).to have_content(…) • Написать свой хелпер
ВОЛШЕБНЫЙ ХЕЛПЕР def wait_js(command, timeout = 10) step = 0
loop do step += 0.5 return if page.evaluate_script(command) raise( RSpec!::Expectations!::ExpectationNotMetError, "JS never evals to true: !#{command}") if step > timeout sleep 0.5 end end
ВОЛШЕБНЫЙ ХЕЛПЕР # Pieces framework (Teachbase) def wait_ajax wait_js("pi.net._active_req !==
0") end # JQuery def wait_ajax wait_js("jQuery.active !== 0") end
А ЧТО ЕСЛИ…
НЕОДНОЗНАЧНОСТЬ •Использовать within •Использовать find
# Плохо el = find('.selector') expect(el).to have_content('Some') # Хорошо within
'.selector' do expect(page).to have_content('Some') end НЕОДНОЗНАЧНОСТЬ
ВИЗУАЛЬНОЕ ТЕСТИРОВАНИЕ
ВИЗУАЛЬНО •rprt/rspec-page-regression scenario "renders correctly" do visit root_path expect(page).to match_reference_screenshot
end
•Отказаться от матчера have_css ВИЗУАЛЬНО
ЗАЧЕМ? •Тест визуализации •Регрессионное тестирование
КАК? •Попиксельное сравнение •Подсчёт различающихся пикселей •Результат •Отрисовка разницы
•Минимально различающиеся изображения ПРОБЛЕМЫ
НЕМНОГО САТАНА Отношение эквивалентности — функция двух аргументов c булевым
значением с условиями: •r(x, x) !== true •r(x, y) !== r(y, x) •r(x, y) !== r(y, z) !== true !=> r(x, z) !== true
НЕМНОГО АТАНА Отношение эквивалентности — функция двух аргументов c булевым
значением с условиями: •r(x, x) !== true •r(x, y) !== r(y, x) •r(x, y) !== r(y, z) !== true !=> r(x, z) !== true М
НЕМНОГО МАТАНА ЛИНАЛА Векторное пространство — множество объектов, которые можно
складывать и умножать на число.
Метрика — функция двух аргументов на векторном пространстве, такая что:
•F(x, y) !== 0 !!<=> x !== y •F(x, y) !== F(y, x) •F(x, z) !<= F(x, y) + F(y, z) НЕМНОГО МАТАНА ЛИНАЛА
ПРИМЕРЫ МЕТРИК •Евклидова метрика: •Дискретная метрика •Манхеттенская метрика:
НАЗАД К КАРТИНКАМ Изображение — это набор векторов. Описанный алгоритм
использует дискретную метрику и обычное отношение эквивалентности.
ТЕСТИРУЕМЫЕ ИЗОБРАЖЕНИЯ
ИЗНАЧАЛЬНЫЙ АЛГОРИТМ Среднее расстояние: 0.43
КАК ИНАЧЕ? Использовать метрику: Будем вычислять среднее расстояние и сравнивать
с заранее заданной погрешностью.
АЛГОРИТМ DELTAE Среднее расстояние: 0.01
КАК ИНАЧЕ? Одинаковыми будем считать пиксели с одной яркостью. При
этом допустим небольшую погрешность.
АЛГОРИТМ GRAYSCALE Погрешность 8, среднее расстояние: 0
Погрешность 4, среднее расстояние: 0.09 АЛГОРИТМ GRAYSCALE
КАК ПРИМЕНИТЬ?
ПРОБЛЕМЫ •Танцы с бубном на CI •Даже в при сравнении
в обычном режиме довольно медленно
ПРОБЛЕМЫ
ПРОБЛЕМЫ • Изменение внешнего вида страницы • Изменение текстов на
странице
ПРОБЛЕМЫ • Медленно • Прекомпилировать assets • Убрать DatabaseCleaner
DATABASECLEANER RSpec Server DB
DATABASECLEANER RSpec Server DB Transaction
СПАСИБО ЗА ВНИМАНИЕ! Макар Ермохин teachbase.ru github.com/Earendil95