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
65
0
Share
Приемочное тестирование и немного матана
Презентация с "Fall Saint P Ruby Meetup" (23.11.2017)
Makar Ermokhin
November 23, 2017
More Decks by Makar Ermokhin
See All by Makar Ermokhin
RRUG - Efficient Testing
earendil95
0
42
Taming InfluxDB
earendil95
1
110
[LT] Delete or not delete
earendil95
0
52
Other Decks in Programming
See All in Programming
AI時代になぜ書くのか
mutsumix
0
370
〜バイブコーディングを超えて〜 チームで実験し続けたAI駆動開発
tigertora7571
0
200
エラー処理の温故知新 / history of error handling technic
ryotanakaya
7
1.9k
Explore CoroutineScope
tomoeng11
0
180
Import assertionsが消えた日~ECMAScriptの仕様はどう決まり、なぜ覆るのか~
bicstone
2
180
Programming with a DJ Controller — not vibe coding
m_seki
3
820
なぜあなたのコードには「コシ」がないのか?〜AI時代に問う、最後まで美味しい設計と戦略〜 #phpconkagawa / phpconkagawa2026
shogogg
0
160
「OSSがあるなら自作するな」は AI時代も正しいか ── Build vs Adopt の新しい判断基準
kumorn5s
7
2.5k
ついに来た!本格的なマルチクラウド時代の Google Cloud
maroon1st
0
410
書き換えて学ぶTemporal #fukts
pirosikick
2
370
WebAssembly を読み込むベストプラクティス 2026年春版 / Best Practices for Loading WebAssembly (Spring 2026)
petamoriken
5
1.1k
AI時代だからこそ「Bloc」を採用する価値があるのかもしれない
takuroabe
0
150
Featured
See All Featured
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
190
4 Signs Your Business is Dying
shpigford
187
22k
How to build a perfect <img>
jonoalderson
1
5.5k
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.5k
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
210
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.4k
Are puppies a ranking factor?
jonoalderson
1
3.4k
Being A Developer After 40
akosma
91
590k
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
130
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
350
Prompt Engineering for Job Search
mfonobong
0
300
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
180
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