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
63
Приемочное тестирование и немного матана
Презентация с "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
38
Taming InfluxDB
earendil95
1
110
[LT] Delete or not delete
earendil95
0
51
Other Decks in Programming
See All in Programming
[AI Engineering Summit Tokyo 2025] LLMは計画業務のゲームチェンジャーか? 最適化業務における活⽤の可能性と限界
terryu16
2
510
AIで開発はどれくらい加速したのか?AIエージェントによるコード生成を、現場の評価と研究開発の評価の両面からdeep diveしてみる
daisuketakeda
1
920
AIエージェント、”どう作るか”で差は出るか? / AI Agents: Does the "How" Make a Difference?
rkaga
4
1.9k
0→1 フロントエンド開発 Tips🚀 #レバテックMeetup
bengo4com
0
520
[KNOTS 2026登壇資料]AIで拡張‧交差する プロダクト開発のプロセス および携わるメンバーの役割
hisatake
0
150
責任感のあるCloudWatchアラームを設計しよう
akihisaikeda
3
130
LLM Observabilityによる 対話型音声AIアプリケーションの安定運用
gekko0114
2
400
gunshi
kazupon
1
140
副作用をどこに置くか問題:オブジェクト指向で整理する設計判断ツリー
koxya
1
550
OSSとなったswift-buildで Xcodeのビルドを差し替えられるため 自分でXcodeを直せる時代になっている ダイアモンド問題編
yimajo
3
540
例外処理とどう使い分ける?Result型を使ったエラー設計 #burikaigi
kajitack
16
5.8k
Graviton と Nitro と私
maroon1st
0
180
Featured
See All Featured
How To Stay Up To Date on Web Technology
chriscoyier
791
250k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
270
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
58
42k
Deep Space Network (abreviated)
tonyrice
0
36
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
900
Color Theory Basics | Prateek | Gurzu
gurzu
0
190
XXLCSS - How to scale CSS and keep your sanity
sugarenia
249
1.3M
Skip the Path - Find Your Career Trail
mkilby
0
48
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Optimising Largest Contentful Paint
csswizardry
37
3.6k
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
300
Leo the Paperboy
mayatellez
4
1.3k
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