Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Приемочное тестирование и немного матана
Search
Makar Ermokhin
November 23, 2017
Programming
71
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Приемочное тестирование и немного матана
Презентация с "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
54
Taming InfluxDB
earendil95
1
120
[LT] Delete or not delete
earendil95
0
55
Other Decks in Programming
See All in Programming
RSSとCodexを使ってX投稿自動化してみた
ochtum
0
110
新卒PdEのリアル
ryu1013
1
470
モバイル交通系ICへのチャージ実例から考える、クロスプラットフォーム開発におけるiOS実機テスト設計とCI運用
yusuga
1
210
Deep dive into the select statement (GopherCon UK)
jespino
0
170
Hello, Hiroshima Geospatial Data! — Exploring DoboX with Python
ra0kley
0
180
自分的「カンファレンスの楽しみ方」
syumai
0
200
AI駆動開発にグラフDBを重ねてみた
satoshi256kbyte
2
760
AI Agent時代のリアーキテクチャ戦略と実践
hokaccha
6
2.8k
XP祭りでしか伝わらないフリップネタ #xpjug
murabayashi
0
120
初心者DevRelとして参加者だった私が、DevRel Talks!#2に登壇するまでにしてきたこと
sokohirai
0
360
不幸な GC
chencmd
0
890
AI時代に学ぶ 好きなルール 嫌いなルール Linter編
shorty5121
0
890
Featured
See All Featured
The World Runs on Bad Software
bkeepers
PRO
72
12k
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2.1k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.8k
Rails Girls Zürich Keynote
gr2m
96
14k
We Are The Robots
honzajavorek
0
350
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.4k
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
680
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
3k
For a Future-Friendly Web
brad_frost
183
10k
Faster Mobile Websites
deanohume
310
32k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
500
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
290
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