SlideShare uma empresa Scribd logo
1 de 16
ASSERTIONS? WTF??
Wikipedia говорит нам:
«Утверждение (англ. Assertion) в программировании —
предикат, размещѐнный в программе и указывающий на
то, что разработчик имеет в виду этот предикат в этом
месте программы всегда истинным.»
PREDICATE, MY ASS!
Какой-то бред сумасшедшего, правда?
Как же все-таки работать с этими непонятными
ассертами и при этом еще и не прослыть лошарой?
В этой презентации мы рассмотрим такие продвинутые
техники как курощение, низведение, дуракаваляние и
многие другие. Все они широко применяются в
автоматизированном тестировании.
КУРОЩЕНИЕ
Различают несколько видов курощения ассертами.
Какие же преимущества они дают?
• Посторонние не понимают, что проверяется и почему
• Посторонние не понимают, где ожидаемое значение, а где
реальное
• Посторонние не понимают, почему тот или иной тест
падает, хотя на вид все вроде бы в порядке
• Посторонние видят, что вы – грамотный специалист с
опытом использования разных фреймворков
• Количество зависимостей проекта возрастает, а значит,
возрастает и шанс, что посторонние отчаются и не
станут билдить ваш проект, а это вам только на руку
А ЭТО ЗНАЧИТ…
ВАС НЕ УВОЛЯТ!
КУРОЩЕНИЕ КЛАССАМИ
Крайне полезно для проекта употребление всех возможных видов
ассертов сразу. Здесь работает принцип «побольше
ассертов, хороших и разных». Наилучших результатов удается
достичь, когда ассерты из различных фреймворков встречаются в
рамках одного и того же класса.
Примеры:
• junit.framework.Assert.assertEquals(expected, actual)
;
• org.junit.Assert.assertEquals(expected, actual);
• org.testng.Assert.assertEquals(actual, expected);
и т.п.
Нельзя забывать и о встроенных ассертах языка
программирования:
• assert expression : message
КУРОЩЕНИЕ СООБЩЕНИЯМИ
Общеизвестно, что код должен документировать себя сам.
Это в особенности касается столь вредного явления как
сообщения в ассертах.
Сравним:
Assert.assertTrue(«Button „Click Me‟ was not found
on the page.», a);
и
Assert.assertTrue(a);
Почти втрое меньше символов! Налицо значительная
экономия, код стал более читабельным. Кого волнует, что
такое «a» и почему оно должно было равняться true?
КУРОЩЕНИЕ ТИПАМИ
Весьма хитроумным способом запутывания пользователей
считается курощение типами сравниваемых значений.
Возьмем следующий пример:
Assert.assertEquals(priceTextField.getAttribute(“v
alue”), 10 );
При хорошем раскладе есть шанс увидеть в отчете
сообщение вида «expected [10] but found [10]», что
обязательно поставит в тупик посторонних и лишний раз
подтвердит вашу незаменимость на проекте. К
сожалению, не для всех классов ассертов это работает.
НИЗВЕДЕНИЕ
Еще одной полезной техникой является так называемое
низведение ассертов, т.е. развертывание их при помощи
условных операторов. Это позволяет повысить
читабельность кода и увеличить общее число строк, что
может служить отличной метрикой его качества.
Пример кода:
if (element.isPresent()) {
Assert.assertTrue(true);
} else {
Assert.assertTrue(false);
}
НИЗВЕДЕНИЕ
Другой реальный пример низведения:
public void verifySomething(Boolean expected) {
if (isSomething()) {
Assert.assertTrue(expected.equals(false));
}
}
ДУРАКАВАЛЯНИЕ
Иногда бывает полезно пересыпать код так называемыми
контрольными ассертами. Подобный подход, называемый еще
дуракавалянием, может использоваться для тех же целей, что и
курощение, а также для временно-постоянной маркировки
участков кода, которые не должны выполняться никогда (но чтобы
компилятор не ругался).
Примеры использования:
• Assert.assertTrue(true);
• Assert.assertTrue(false);
• Assert.assertEquals(2, 23);
и др.
Отметим следующее: не стоит в таких случаях прибегать к вызову
Assert.fail(). Этот метод написан для дилетантов, которые не
умеют пользоваться ассертами.
ДУРАКАВАЛЯНИЕ
Дополнительно в целях унификации кода и затруднения
понимания его посторонними можно использовать такую
дуракавалятельную методику как подмена методов:
Assert.assertTrue(a == b);
вместо
Assert.assertEquals(a, b);
В сущности абсолютно все виды ассертов можно заменить на
assertTrue() без ущерба для функциональности теста. В случае
ошибки со сгенерированным сообщением в репорте о том, что true
не равно false, будет сложно не согласиться даже самым
отъявленным скептикам.
ПЕРЕХВАТ АССЕРТОВ
Код всегда должен понимать, кто в доме хозяин. Он не
должен думать, что может безнаказанно выбрасывать
ошибки, как будто ему здесь никто не указ.
Ошибки, генерируемые ассертами, легко можно
перехватить, так же как и любые другие:
try {
Assert.assertTrue(false);
} catch (AssertionError e) {
logger.info(“Обломись, глупый ассерт”);
}
ЭМУЛЯЦИЯ АССЕРТОВ
Если не принять особых мер, будущие пользователи
автотестов могут решить, будто код писали какие-нибудь
малообразованные неучи, незнакомые с архитектурой
фреймворков тестирования, которые только и могут, что
дергать библиотечные методы. Вот пример из реальной
жизни, демонстрирующий, как это можно предотвратить:
if (actual == null && expected != null) {
throw new AssertionError("Expected list "+key+" but was null
(expected "+expected+")");
}
Теперь ни у кого не возникнет и мысли, будто вы не в
состоянии сгенерировать AssertionError
самостоятельно!
НУЛЕВОЙ АССЕРТ
Вершиной дзена автоматизированного тестирования
является так называемый нулевой ассерт, то есть
ассерт, которого в явном виде не существует.
@Test
public void testThatEverythingsAwright() {
doThis();
doThat();
andNowForSomethingEntirelyDifferent();
}
Легко видеть, что приведенный код не содержит никаких
ассертов, нет их и в вызываемых методах. В чем же смысл
данного теста? Если ничего нигде не упало, значит, все
ништяк!
ВОПРОСЫ?
=)

Mais conteúdo relacionado

Mais procurados

Константин Книжник: статический анализ, взгляд со стороны
Константин Книжник: статический анализ, взгляд со стороныКонстантин Книжник: статический анализ, взгляд со стороны
Константин Книжник: статический анализ, взгляд со стороныTatyanazaxarova
 
Итак, вы тимлид
Итак, вы тимлидИтак, вы тимлид
Итак, вы тимлидAnton Piskunov
 
Фреймворк для регрессионного тестирования на основе WebDriver
Фреймворк для регрессионного тестирования на основе WebDriverФреймворк для регрессионного тестирования на основе WebDriver
Фреймворк для регрессионного тестирования на основе WebDriverautomated-testing.info
 
Проблемы автоматизации крупных проектов: TestComplete
Проблемы автоматизации крупных проектов: TestCompleteПроблемы автоматизации крупных проектов: TestComplete
Проблемы автоматизации крупных проектов: TestCompleteautomated-testing.info
 
Совершенный тестовый фреймворк
Совершенный тестовый фреймворкСовершенный тестовый фреймворк
Совершенный тестовый фреймворкautomated-testing.info
 
Мульти-блиц выступление на Стачка-2012
Мульти-блиц выступление на Стачка-2012Мульти-блиц выступление на Стачка-2012
Мульти-блиц выступление на Стачка-2012Alexey Mahotkin
 
“Обезьянье тестирование” в мобильных проектах
“Обезьянье тестирование” в мобильных проектах“Обезьянье тестирование” в мобильных проектах
“Обезьянье тестирование” в мобильных проектахautomated-testing.info
 
A1QA Summer 2014 - Alien bugs
A1QA Summer 2014 - Alien bugsA1QA Summer 2014 - Alien bugs
A1QA Summer 2014 - Alien bugsPavel Novik
 
CodeFest 2014. Гайдаренко О. — Промисы и jQuery Промисы
CodeFest 2014. Гайдаренко О. — Промисы и jQuery ПромисыCodeFest 2014. Гайдаренко О. — Промисы и jQuery Промисы
CodeFest 2014. Гайдаренко О. — Промисы и jQuery ПромисыCodeFest
 
У всех на виду: нюансы Open Source разработки
У всех на виду: нюансы Open Source разработкиУ всех на виду: нюансы Open Source разработки
У всех на виду: нюансы Open Source разработкиCUSTIS
 
QA Club Kiev #2 Vision of TL and PM
QA Club Kiev #2 Vision of TL and PMQA Club Kiev #2 Vision of TL and PM
QA Club Kiev #2 Vision of TL and PMQA Club Kiev
 
Denys Herashchenko “Плаваючі баги серед нас”
Denys Herashchenko “Плаваючі баги серед нас”Denys Herashchenko “Плаваючі баги серед нас”
Denys Herashchenko “Плаваючі баги серед нас”Dakiry
 
А существуют ли в реальности 64-битные ошибки?
А  существуют ли в реальности 64-битные ошибки?А  существуют ли в реальности 64-битные ошибки?
А существуют ли в реальности 64-битные ошибки?Tatyanazaxarova
 
Курс молодого бойца-автоматизатора – как стать ветераном и остаться в живых
Курс молодого бойца-автоматизатора – как стать ветераном и остаться в живыхКурс молодого бойца-автоматизатора – как стать ветераном и остаться в живых
Курс молодого бойца-автоматизатора – как стать ветераном и остаться в живыхautomated-testing.info
 
Алексей Лупан - Да перестаньте уже автоматизировать
Алексей Лупан - Да перестаньте уже автоматизироватьАлексей Лупан - Да перестаньте уже автоматизировать
Алексей Лупан - Да перестаньте уже автоматизироватьAlexei Lupan
 
обработка исключений в Java
обработка исключений в Javaобработка исключений в Java
обработка исключений в Javametaform
 
Статический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMergeСтатический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMergeTatyanazaxarova
 
Как уменьшить вероятность ошибки на этапе написания кода. Заметка N1.
Как уменьшить вероятность ошибки на этапе написания кода. Заметка N1.Как уменьшить вероятность ошибки на этапе написания кода. Заметка N1.
Как уменьшить вероятность ошибки на этапе написания кода. Заметка N1.Tatyanazaxarova
 
Собеседование на позицию Java Developer
Собеседование на позицию Java DeveloperСобеседование на позицию Java Developer
Собеседование на позицию Java DeveloperOlexandra Dmytrenko
 

Mais procurados (20)

Константин Книжник: статический анализ, взгляд со стороны
Константин Книжник: статический анализ, взгляд со стороныКонстантин Книжник: статический анализ, взгляд со стороны
Константин Книжник: статический анализ, взгляд со стороны
 
Итак, вы тимлид
Итак, вы тимлидИтак, вы тимлид
Итак, вы тимлид
 
Фреймворк для регрессионного тестирования на основе WebDriver
Фреймворк для регрессионного тестирования на основе WebDriverФреймворк для регрессионного тестирования на основе WebDriver
Фреймворк для регрессионного тестирования на основе WebDriver
 
Проблемы автоматизации крупных проектов: TestComplete
Проблемы автоматизации крупных проектов: TestCompleteПроблемы автоматизации крупных проектов: TestComplete
Проблемы автоматизации крупных проектов: TestComplete
 
Совершенный тестовый фреймворк
Совершенный тестовый фреймворкСовершенный тестовый фреймворк
Совершенный тестовый фреймворк
 
Мульти-блиц выступление на Стачка-2012
Мульти-блиц выступление на Стачка-2012Мульти-блиц выступление на Стачка-2012
Мульти-блиц выступление на Стачка-2012
 
“Обезьянье тестирование” в мобильных проектах
“Обезьянье тестирование” в мобильных проектах“Обезьянье тестирование” в мобильных проектах
“Обезьянье тестирование” в мобильных проектах
 
A1QA Summer 2014 - Alien bugs
A1QA Summer 2014 - Alien bugsA1QA Summer 2014 - Alien bugs
A1QA Summer 2014 - Alien bugs
 
CodeFest 2014. Гайдаренко О. — Промисы и jQuery Промисы
CodeFest 2014. Гайдаренко О. — Промисы и jQuery ПромисыCodeFest 2014. Гайдаренко О. — Промисы и jQuery Промисы
CodeFest 2014. Гайдаренко О. — Промисы и jQuery Промисы
 
У всех на виду: нюансы Open Source разработки
У всех на виду: нюансы Open Source разработкиУ всех на виду: нюансы Open Source разработки
У всех на виду: нюансы Open Source разработки
 
QA Club Kiev #2 Vision of TL and PM
QA Club Kiev #2 Vision of TL and PMQA Club Kiev #2 Vision of TL and PM
QA Club Kiev #2 Vision of TL and PM
 
Denys Herashchenko “Плаваючі баги серед нас”
Denys Herashchenko “Плаваючі баги серед нас”Denys Herashchenko “Плаваючі баги серед нас”
Denys Herashchenko “Плаваючі баги серед нас”
 
А существуют ли в реальности 64-битные ошибки?
А  существуют ли в реальности 64-битные ошибки?А  существуют ли в реальности 64-битные ошибки?
А существуют ли в реальности 64-битные ошибки?
 
Курс молодого бойца-автоматизатора – как стать ветераном и остаться в живых
Курс молодого бойца-автоматизатора – как стать ветераном и остаться в живыхКурс молодого бойца-автоматизатора – как стать ветераном и остаться в живых
Курс молодого бойца-автоматизатора – как стать ветераном и остаться в живых
 
Алексей Лупан - Да перестаньте уже автоматизировать
Алексей Лупан - Да перестаньте уже автоматизироватьАлексей Лупан - Да перестаньте уже автоматизировать
Алексей Лупан - Да перестаньте уже автоматизировать
 
обработка исключений в Java
обработка исключений в Javaобработка исключений в Java
обработка исключений в Java
 
Статический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMergeСтатический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMerge
 
1
11
1
 
Как уменьшить вероятность ошибки на этапе написания кода. Заметка N1.
Как уменьшить вероятность ошибки на этапе написания кода. Заметка N1.Как уменьшить вероятность ошибки на этапе написания кода. Заметка N1.
Как уменьшить вероятность ошибки на этапе написания кода. Заметка N1.
 
Собеседование на позицию Java Developer
Собеседование на позицию Java DeveloperСобеседование на позицию Java Developer
Собеседование на позицию Java Developer
 

Destaque

Part I. How to stop fooling around and begin automating
Part I. How to stop fooling around and begin automatingPart I. How to stop fooling around and begin automating
Part I. How to stop fooling around and begin automatingÞorgeir Ingvarsson
 
Part II. How to automate properly
Part II. How to automate properlyPart II. How to automate properly
Part II. How to automate properlyÞorgeir Ingvarsson
 
Part III. How to maximize profit from automation
Part III. How to maximize profit from automationPart III. How to maximize profit from automation
Part III. How to maximize profit from automationÞorgeir Ingvarsson
 
XPath локаторы в Selenium WebDriver
XPath локаторы в Selenium WebDriverXPath локаторы в Selenium WebDriver
XPath локаторы в Selenium WebDriverИлья Кожухов
 
Javascript in big project
Javascript in big projectJavascript in big project
Javascript in big projectEvgeny Gusev
 
Илья Кудинов «Развитие процессов тестирования в Badoo за три года, или как мы...
Илья Кудинов «Развитие процессов тестирования в Badoo за три года, или как мы...Илья Кудинов «Развитие процессов тестирования в Badoo за три года, или как мы...
Илья Кудинов «Развитие процессов тестирования в Badoo за три года, или как мы...WrikeTechClub
 
Артём Ерошенко «Рецепт приготовления облачных тестингов»
Артём Ерошенко «Рецепт приготовления облачных тестингов»Артём Ерошенко «Рецепт приготовления облачных тестингов»
Артём Ерошенко «Рецепт приготовления облачных тестингов»WrikeTechClub
 
Александр Шуров, Олег Николенко «Как устроено автоматическое frontend-тестир...
Александр Шуров, Олег Николенко  «Как устроено автоматическое frontend-тестир...Александр Шуров, Олег Николенко  «Как устроено автоматическое frontend-тестир...
Александр Шуров, Олег Николенко «Как устроено автоматическое frontend-тестир...WrikeTechClub
 
Java Tools and Technologies Landscape for 2014 (image gallery)
Java Tools and Technologies Landscape for 2014 (image gallery)Java Tools and Technologies Landscape for 2014 (image gallery)
Java Tools and Technologies Landscape for 2014 (image gallery)ZeroTurnaround
 
Концепция QaAPI: взгляд на тестирование с другой стороны баррикад
Концепция QaAPI: взгляд на тестирование с другой стороны баррикадКонцепция QaAPI: взгляд на тестирование с другой стороны баррикад
Концепция QaAPI: взгляд на тестирование с другой стороны баррикадSQALab
 
Мелочь пузатая или Объем тест кейса против его содержательности
Мелочь пузатая или Объем тест кейса против его содержательностиМелочь пузатая или Объем тест кейса против его содержательности
Мелочь пузатая или Объем тест кейса против его содержательностиAlexei Lupan
 
Автоматизация тестирования: отбрасываем лишнее и проверяем суть
Автоматизация тестирования: отбрасываем лишнее и проверяем сутьАвтоматизация тестирования: отбрасываем лишнее и проверяем суть
Автоматизация тестирования: отбрасываем лишнее и проверяем сутьSQALab
 
Автоматизация функционального тестирования REST API: секреты, тонкости и подв...
Автоматизация функционального тестирования REST API: секреты, тонкости и подв...Автоматизация функционального тестирования REST API: секреты, тонкости и подв...
Автоматизация функционального тестирования REST API: секреты, тонкости и подв...SQALab
 
QA Fest 2014. Алексей Лупан. Не тест-кейсы красят тестировщика, а...
QA Fest 2014. Алексей Лупан. Не тест-кейсы красят тестировщика, а...QA Fest 2014. Алексей Лупан. Не тест-кейсы красят тестировщика, а...
QA Fest 2014. Алексей Лупан. Не тест-кейсы красят тестировщика, а...QAFest
 
Модель системы Continuous Integration в компании Positive Technologies | Тиму...
Модель системы Continuous Integration в компании Positive Technologies | Тиму...Модель системы Continuous Integration в компании Positive Technologies | Тиму...
Модель системы Continuous Integration в компании Positive Technologies | Тиму...Positive Hack Days
 
Тренировка служебных тестировщиков
Тренировка служебных тестировщиковТренировка служебных тестировщиков
Тренировка служебных тестировщиковSQALab
 
QA Fest 2016. Алексей Виноградов. Цель тестирования. А на самом деле?
QA Fest 2016. Алексей Виноградов. Цель тестирования. А на самом деле?QA Fest 2016. Алексей Виноградов. Цель тестирования. А на самом деле?
QA Fest 2016. Алексей Виноградов. Цель тестирования. А на самом деле?QAFest
 
DaKiRY_BAQ2016_QADay_Круглий стіл: "Чи помре ручне тестування з часом" Учасни...
DaKiRY_BAQ2016_QADay_Круглий стіл: "Чи помре ручне тестування з часом" Учасни...DaKiRY_BAQ2016_QADay_Круглий стіл: "Чи помре ручне тестування з часом" Учасни...
DaKiRY_BAQ2016_QADay_Круглий стіл: "Чи помре ручне тестування з часом" Учасни...Dakiry
 

Destaque (20)

The Dangers of Cucumber
The Dangers of CucumberThe Dangers of Cucumber
The Dangers of Cucumber
 
Part I. How to stop fooling around and begin automating
Part I. How to stop fooling around and begin automatingPart I. How to stop fooling around and begin automating
Part I. How to stop fooling around and begin automating
 
Part II. How to automate properly
Part II. How to automate properlyPart II. How to automate properly
Part II. How to automate properly
 
Part III. How to maximize profit from automation
Part III. How to maximize profit from automationPart III. How to maximize profit from automation
Part III. How to maximize profit from automation
 
Automation patterns on practice
Automation patterns on practiceAutomation patterns on practice
Automation patterns on practice
 
XPath локаторы в Selenium WebDriver
XPath локаторы в Selenium WebDriverXPath локаторы в Selenium WebDriver
XPath локаторы в Selenium WebDriver
 
Javascript in big project
Javascript in big projectJavascript in big project
Javascript in big project
 
Илья Кудинов «Развитие процессов тестирования в Badoo за три года, или как мы...
Илья Кудинов «Развитие процессов тестирования в Badoo за три года, или как мы...Илья Кудинов «Развитие процессов тестирования в Badoo за три года, или как мы...
Илья Кудинов «Развитие процессов тестирования в Badoo за три года, или как мы...
 
Артём Ерошенко «Рецепт приготовления облачных тестингов»
Артём Ерошенко «Рецепт приготовления облачных тестингов»Артём Ерошенко «Рецепт приготовления облачных тестингов»
Артём Ерошенко «Рецепт приготовления облачных тестингов»
 
Александр Шуров, Олег Николенко «Как устроено автоматическое frontend-тестир...
Александр Шуров, Олег Николенко  «Как устроено автоматическое frontend-тестир...Александр Шуров, Олег Николенко  «Как устроено автоматическое frontend-тестир...
Александр Шуров, Олег Николенко «Как устроено автоматическое frontend-тестир...
 
Java Tools and Technologies Landscape for 2014 (image gallery)
Java Tools and Technologies Landscape for 2014 (image gallery)Java Tools and Technologies Landscape for 2014 (image gallery)
Java Tools and Technologies Landscape for 2014 (image gallery)
 
Концепция QaAPI: взгляд на тестирование с другой стороны баррикад
Концепция QaAPI: взгляд на тестирование с другой стороны баррикадКонцепция QaAPI: взгляд на тестирование с другой стороны баррикад
Концепция QaAPI: взгляд на тестирование с другой стороны баррикад
 
Мелочь пузатая или Объем тест кейса против его содержательности
Мелочь пузатая или Объем тест кейса против его содержательностиМелочь пузатая или Объем тест кейса против его содержательности
Мелочь пузатая или Объем тест кейса против его содержательности
 
Автоматизация тестирования: отбрасываем лишнее и проверяем суть
Автоматизация тестирования: отбрасываем лишнее и проверяем сутьАвтоматизация тестирования: отбрасываем лишнее и проверяем суть
Автоматизация тестирования: отбрасываем лишнее и проверяем суть
 
Автоматизация функционального тестирования REST API: секреты, тонкости и подв...
Автоматизация функционального тестирования REST API: секреты, тонкости и подв...Автоматизация функционального тестирования REST API: секреты, тонкости и подв...
Автоматизация функционального тестирования REST API: секреты, тонкости и подв...
 
QA Fest 2014. Алексей Лупан. Не тест-кейсы красят тестировщика, а...
QA Fest 2014. Алексей Лупан. Не тест-кейсы красят тестировщика, а...QA Fest 2014. Алексей Лупан. Не тест-кейсы красят тестировщика, а...
QA Fest 2014. Алексей Лупан. Не тест-кейсы красят тестировщика, а...
 
Модель системы Continuous Integration в компании Positive Technologies | Тиму...
Модель системы Continuous Integration в компании Positive Technologies | Тиму...Модель системы Continuous Integration в компании Positive Technologies | Тиму...
Модель системы Continuous Integration в компании Positive Technologies | Тиму...
 
Тренировка служебных тестировщиков
Тренировка служебных тестировщиковТренировка служебных тестировщиков
Тренировка служебных тестировщиков
 
QA Fest 2016. Алексей Виноградов. Цель тестирования. А на самом деле?
QA Fest 2016. Алексей Виноградов. Цель тестирования. А на самом деле?QA Fest 2016. Алексей Виноградов. Цель тестирования. А на самом деле?
QA Fest 2016. Алексей Виноградов. Цель тестирования. А на самом деле?
 
DaKiRY_BAQ2016_QADay_Круглий стіл: "Чи помре ручне тестування з часом" Учасни...
DaKiRY_BAQ2016_QADay_Круглий стіл: "Чи помре ручне тестування з часом" Учасни...DaKiRY_BAQ2016_QADay_Круглий стіл: "Чи помре ручне тестування з часом" Учасни...
DaKiRY_BAQ2016_QADay_Круглий стіл: "Чи помре ручне тестування з часом" Учасни...
 

Basics of assertions in automated testing

  • 1.
  • 2. ASSERTIONS? WTF?? Wikipedia говорит нам: «Утверждение (англ. Assertion) в программировании — предикат, размещѐнный в программе и указывающий на то, что разработчик имеет в виду этот предикат в этом месте программы всегда истинным.»
  • 3. PREDICATE, MY ASS! Какой-то бред сумасшедшего, правда? Как же все-таки работать с этими непонятными ассертами и при этом еще и не прослыть лошарой? В этой презентации мы рассмотрим такие продвинутые техники как курощение, низведение, дуракаваляние и многие другие. Все они широко применяются в автоматизированном тестировании.
  • 4. КУРОЩЕНИЕ Различают несколько видов курощения ассертами. Какие же преимущества они дают? • Посторонние не понимают, что проверяется и почему • Посторонние не понимают, где ожидаемое значение, а где реальное • Посторонние не понимают, почему тот или иной тест падает, хотя на вид все вроде бы в порядке • Посторонние видят, что вы – грамотный специалист с опытом использования разных фреймворков • Количество зависимостей проекта возрастает, а значит, возрастает и шанс, что посторонние отчаются и не станут билдить ваш проект, а это вам только на руку
  • 5. А ЭТО ЗНАЧИТ… ВАС НЕ УВОЛЯТ!
  • 6. КУРОЩЕНИЕ КЛАССАМИ Крайне полезно для проекта употребление всех возможных видов ассертов сразу. Здесь работает принцип «побольше ассертов, хороших и разных». Наилучших результатов удается достичь, когда ассерты из различных фреймворков встречаются в рамках одного и того же класса. Примеры: • junit.framework.Assert.assertEquals(expected, actual) ; • org.junit.Assert.assertEquals(expected, actual); • org.testng.Assert.assertEquals(actual, expected); и т.п. Нельзя забывать и о встроенных ассертах языка программирования: • assert expression : message
  • 7. КУРОЩЕНИЕ СООБЩЕНИЯМИ Общеизвестно, что код должен документировать себя сам. Это в особенности касается столь вредного явления как сообщения в ассертах. Сравним: Assert.assertTrue(«Button „Click Me‟ was not found on the page.», a); и Assert.assertTrue(a); Почти втрое меньше символов! Налицо значительная экономия, код стал более читабельным. Кого волнует, что такое «a» и почему оно должно было равняться true?
  • 8. КУРОЩЕНИЕ ТИПАМИ Весьма хитроумным способом запутывания пользователей считается курощение типами сравниваемых значений. Возьмем следующий пример: Assert.assertEquals(priceTextField.getAttribute(“v alue”), 10 ); При хорошем раскладе есть шанс увидеть в отчете сообщение вида «expected [10] but found [10]», что обязательно поставит в тупик посторонних и лишний раз подтвердит вашу незаменимость на проекте. К сожалению, не для всех классов ассертов это работает.
  • 9. НИЗВЕДЕНИЕ Еще одной полезной техникой является так называемое низведение ассертов, т.е. развертывание их при помощи условных операторов. Это позволяет повысить читабельность кода и увеличить общее число строк, что может служить отличной метрикой его качества. Пример кода: if (element.isPresent()) { Assert.assertTrue(true); } else { Assert.assertTrue(false); }
  • 10. НИЗВЕДЕНИЕ Другой реальный пример низведения: public void verifySomething(Boolean expected) { if (isSomething()) { Assert.assertTrue(expected.equals(false)); } }
  • 11. ДУРАКАВАЛЯНИЕ Иногда бывает полезно пересыпать код так называемыми контрольными ассертами. Подобный подход, называемый еще дуракавалянием, может использоваться для тех же целей, что и курощение, а также для временно-постоянной маркировки участков кода, которые не должны выполняться никогда (но чтобы компилятор не ругался). Примеры использования: • Assert.assertTrue(true); • Assert.assertTrue(false); • Assert.assertEquals(2, 23); и др. Отметим следующее: не стоит в таких случаях прибегать к вызову Assert.fail(). Этот метод написан для дилетантов, которые не умеют пользоваться ассертами.
  • 12. ДУРАКАВАЛЯНИЕ Дополнительно в целях унификации кода и затруднения понимания его посторонними можно использовать такую дуракавалятельную методику как подмена методов: Assert.assertTrue(a == b); вместо Assert.assertEquals(a, b); В сущности абсолютно все виды ассертов можно заменить на assertTrue() без ущерба для функциональности теста. В случае ошибки со сгенерированным сообщением в репорте о том, что true не равно false, будет сложно не согласиться даже самым отъявленным скептикам.
  • 13. ПЕРЕХВАТ АССЕРТОВ Код всегда должен понимать, кто в доме хозяин. Он не должен думать, что может безнаказанно выбрасывать ошибки, как будто ему здесь никто не указ. Ошибки, генерируемые ассертами, легко можно перехватить, так же как и любые другие: try { Assert.assertTrue(false); } catch (AssertionError e) { logger.info(“Обломись, глупый ассерт”); }
  • 14. ЭМУЛЯЦИЯ АССЕРТОВ Если не принять особых мер, будущие пользователи автотестов могут решить, будто код писали какие-нибудь малообразованные неучи, незнакомые с архитектурой фреймворков тестирования, которые только и могут, что дергать библиотечные методы. Вот пример из реальной жизни, демонстрирующий, как это можно предотвратить: if (actual == null && expected != null) { throw new AssertionError("Expected list "+key+" but was null (expected "+expected+")"); } Теперь ни у кого не возникнет и мысли, будто вы не в состоянии сгенерировать AssertionError самостоятельно!
  • 15. НУЛЕВОЙ АССЕРТ Вершиной дзена автоматизированного тестирования является так называемый нулевой ассерт, то есть ассерт, которого в явном виде не существует. @Test public void testThatEverythingsAwright() { doThis(); doThat(); andNowForSomethingEntirelyDifferent(); } Легко видеть, что приведенный код не содержит никаких ассертов, нет их и в вызываемых методах. В чем же смысл данного теста? Если ничего нигде не упало, значит, все ништяк!