93 lines
11 KiB
Markdown
93 lines
11 KiB
Markdown
|
[Вопросы для собеседования на Java Junior](README.md)
|
|||
|
|
|||
|
##Тестирование
|
|||
|
+ [Что такое _«модульное тестирование»_?](#Что-такое-модульное-тестирование)
|
|||
|
+ [Что такое _«интеграционное тестирование»_?](#Что-такое-интеграционное-тестирование)
|
|||
|
+ [Чем интеграционное тестирование отличается от модульного?](#Чем-интеграционное-тестирование-отличается-от-модульного)
|
|||
|
+ [Какие существуют виды тестовых объектов?](#Какие-существуют-виды-тестовых-объектов)
|
|||
|
+ [Чем _stub_ отличается от _mock_?](#Чем-stub-отличается-от-mock)
|
|||
|
+ [Что такое _«фикстуры»_?](#Что-такое-фикстуры)
|
|||
|
+ [Какие аннотации фикстур существуют в JUnit?](#Какие-аннотации-фикстур-существуют-в-junit)
|
|||
|
+ [Для чего в JUnit используется аннотация `@Ignore`?](#Для-чего-в-junit-используется-аннотация-ignore)
|
|||
|
|
|||
|
###Что такое _«модульное тестирование»_?
|
|||
|
__Модульное/компонентное тестирование (unit testing)__ - процесс в программировании, позволяющий проверить на корректность отдельные модули исходного кода программы. Идея состоит в том, чтобы писать тесты для каждой нетривиальной функции или метода. Это позволяет достаточно быстро проверить, не привело ли очередное изменение кода к регрессии, то есть к появлению ошибок в уже оттестированных местах программы, а также облегчает обнаружение и устранение таких ошибок.
|
|||
|
|
|||
|
Модульные тесты можно условно поделить на две группы:
|
|||
|
|
|||
|
+ _тесты состояния (state based)_, проверяющие что вызываемый метод объекта отработал корректно, проверяя состояние тестируемого объекта после вызова метода.
|
|||
|
|
|||
|
+ _тесты взаимодействия (interaction tests)_, в которых тестируемый объект производит манипуляции с другими объектами. Применяются, когда требуется удостовериться, что тестируемый объект корректно взаимодействует с другими объектами.
|
|||
|
|
|||
|
[к оглавлению](#Тестирование)
|
|||
|
|
|||
|
###Что такое _«интеграционное тестирование»_?
|
|||
|
__Интеграционное тестирование (integration testing)__ — это тестирование, проверяющие работоспособность двух или более модулей системы в совокупности — то есть нескольких объектов как единого блока. В тестах взаимодействия же тестируется конкретный, определенный объект и то, как именно он взаимодействует с внешними зависимостями.
|
|||
|
|
|||
|
[к оглавлению](#Тестирование)
|
|||
|
|
|||
|
###Чем интеграционное тестирование отличается от модульного?
|
|||
|
С технологической точки зрения интеграционное тестирование является количественным развитием модульного, поскольку так же, как и модульное тестирование, оперирует интерфейсами модулей и подсистем и требует создания тестового окружения, включая заглушки на месте отсутствующих модулей. Основная разница между модульным и интеграционным тестированием состоит в целях, то есть в типах обнаруживаемых дефектов, которые, в свою очередь, определяют стратегию выбора входных данных и методов анализа.
|
|||
|
|
|||
|
> Допустим, есть класс, который при определенных условиях взаимодействует с web-сервисом через зависимый объект. И нам надо проверить, что определенный метод зависимого объекта действительно вызывается. Если в качестве зависимого класса передать:
|
|||
|
|
|||
|
> + реальный класс, работающий с web-сервисом, то это будет интеграционное тестирование.
|
|||
|
|
|||
|
> + заглушку, то это будет тестирование состояния.
|
|||
|
|
|||
|
> + шпиона, а в конце теста проверить, что определенный метод зависимого объекта действительно был вызван, то это будет тест взаимодействия.
|
|||
|
|
|||
|
[к оглавлению](#Тестирование)
|
|||
|
|
|||
|
###Какие существуют виды тестовых объектов?
|
|||
|
__пустышка (dummy)__ - объект, который обычно передается в тестируемый класс в качестве параметра, но не имеет поведения: с ним ничего не происходит и никакие его методы не вызываются.
|
|||
|
|
|||
|
> Примером dummy-объектов являются new object(), null, «Ignored String» и т.д.
|
|||
|
|
|||
|
__фальшивка (fake object)__ применяется в основном для ускорения запуска ресурсоёмких тестов и является заменой тяжеловесного внешнего зависимого объекта его легковесной реализацией.
|
|||
|
|
|||
|
> Основные примеры — эмулятор базы данных (fake database) или фальшивый web-сервис.
|
|||
|
|
|||
|
__заглушка (test stub)__ используется для получения данных из внешней зависимости, подменяя её. При этом заглушка игнорирует все данные поступающие из тестируемого объекта, возвращая заранее определённый результат.
|
|||
|
|
|||
|
> Тестируемый объект использует чтение из конфигурационного файла? Тогда передаем ему заглушку `ConfigFileStub` возвращающую тестовые строки конфигурации без обращения к файловой системе.
|
|||
|
|
|||
|
__шпион (test spy)__ - разновидность заглушки, которая умеет протоколировать сделанные к ней обращения из тестируемой системы, чтобы проверить их правильность в конце теста. При этом фиксируется количество, состав и содержание параметров вызовов.
|
|||
|
|
|||
|
> Если существует необходимость проверки, что определённый метод тестируемого класса вызывался ровно 1 раз, то шпион - имменно то, что нам нужно.
|
|||
|
|
|||
|
__фикция (mock object)__ похож на _шпиона_, но обладает расширенной функциональностью, заранее заданными поведением и реакцией на вызовы.
|
|||
|
|
|||
|
[к оглавлению](#Тестирование)
|
|||
|
|
|||
|
###Чем _stub_ отличается от _mock_?
|
|||
|
_stub_ используется как заглушка сервисов, методов, классов и т.д. с заранее запрограммированным ответом на вызовы.
|
|||
|
|
|||
|
_mock_ использует подмену результатов вызова, проверяет сам факт взаимодействия, протоколирует и контролирует его.
|
|||
|
|
|||
|
[к оглавлению](#Тестирование)
|
|||
|
|
|||
|
###Что такое _«фикстуры»_?
|
|||
|
__Фикстуры (fixtures)__ - состояние среды тестирования, которое требуется для успешного выполнения теста. Основная задача фикстур заключается в подготовке тестового окружения с заранее фиксированным/известным состоянием, чтобы гарантировать повторяемость процесса тестирования.
|
|||
|
|
|||
|
[к оглавлению](#Тестирование)
|
|||
|
|
|||
|
###Какие аннотации фикстур существуют в JUnit?
|
|||
|
|
|||
|
+ `@BeforeClass` - определяет код, который должен единожды выполниться перед запуском набора тестовых методов.
|
|||
|
+ `@AfterClass` - код, выполняемый один раз после исполнения набора тестовых методово.
|
|||
|
+ `@Before` - определяет код, который должен выполняться каждый раз перд запуском любого тестовым методом.
|
|||
|
+ `@After` - код, выполняемый каждый раз после исполнения любого тестового метода.
|
|||
|
|
|||
|
[к оглавлению](#Тестирование)
|
|||
|
|
|||
|
###Для чего в JUnit используется аннотация `@Ignore`?
|
|||
|
`@Ignore` указывает JUnit на необходимость пропустить данный тестовый метод.
|
|||
|
|
|||
|
[к оглавлению](#Тестирование)
|
|||
|
|
|||
|
##Источники
|
|||
|
+ [Википедия](https://ru.wikipedia.org/wiki/Тестирование_программного_обеспечения)
|
|||
|
+ [Хабрахабр](https://habrahabr.ru/post/116372/)
|
|||
|
+ [Интуит](http://www.intuit.ru/department/se/testing/5/2.html)
|