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
64
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
41
Taming InfluxDB
earendil95
1
110
[LT] Delete or not delete
earendil95
0
52
Other Decks in Programming
See All in Programming
レガシーPHP転生 〜父がドメインエキスパートだったのでDDD+Claude Codeでチート開発します〜
panda_program
0
890
mruby on C#: From VM Implementation to Game Scripting (RubyKaigi 2026)
hadashia
1
290
「速くなった気がする」をデータで疑う
senleaf24
0
170
「Linuxサーバー構築標準教科書」を読んでみた #ツナギメオフライン.7
akase244
0
1.4k
의존성 주입과 모듈화
fornewid
0
130
Make GenAI Production-Ready with Kubernetes Patterns
bibryam
0
120
Going Multiplatform with Your Android App (Android Makers 2026)
zsmb
2
410
Codex CLI でつくる、Issue から merge までの開発フロー
amata1219
0
350
Coding at the Speed of Thought: The New Era of Symfony Docker
dunglas
0
4.9k
How We Benchmarked Quarkus: Patterns and anti-patterns
hollycummins
1
130
実践CRDT
tamadeveloper
0
550
JOAI2026 1st solution - heron0519 -
heron0519
0
120
Featured
See All Featured
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
210
Fashionably flexible responsive web design (full day workshop)
malarkey
408
66k
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
0
270
Are puppies a ranking factor?
jonoalderson
1
3.3k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.8k
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
2
740
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
270
Game over? The fight for quality and originality in the time of robots
wayneb77
1
160
The Limits of Empathy - UXLibs8
cassininazir
1
300
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.4k
Leo the Paperboy
mayatellez
7
1.7k
Making the Leap to Tech Lead
cromwellryan
135
9.8k
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