SlideShare a Scribd company logo
Unit-тесты: Java
Ляховец Вадим
САНКТ-ПЕТЕРБУРГ, 2016
Содержание
UNIT и INTEGRATION тесты
Приемущества модульного тестирования (UNIT
тестов)
JUnit — библиотека для модульного тестирования
Mock-библиотеки
2
UNIT и INTEGRATION тесты
3
Unit test: процесс в программировании, позволяющий проверить на
корректность отдельные модули исходного кода программы.Идея
состоит в том, чтобы писать тесты для каждого нетривиального
метода.
Integration test: одна из фаз тестирования программного
обеспечения, при котором отдельные программные модули
объединяются и тестируются в группе.
Преимущества UNIT тестов
Поощрение изменений
Модульное тестирование позже позволяет программистам проводить рефакторинг, будучи
уверенными, что модуль по-прежнему работает корректно .
Упрощение интеграции
Модульное тестирование помогает устранить сомнения по поводу отдельных модулей и
может быть использовано для подхода к тестированию «снизу вверх»: сначала тестируются
отдельные части программы, затем программа в целом.
Документирование кода
Модульные тесты можно рассматривать как «живой документ» для тестируемого класса.
Клиенты, которые не знают, как использовать данный класс, могут использовать юнит-тест в
качестве примера.
Отделение интерфейса от реализации
Поскольку некоторые классы могут использовать другие классы, тестирование отдельного
класса часто распространяется на связанные с ним. Например, класс пользуется базой
данных; в ходе написания теста программист обнаруживает, что тесту приходится
взаимодействовать с базой. Это ошибка, поскольку тест не должен выходить за границу
класса. В результате разработчик абстрагируется от соединения с базой данных и реализует
этот интерфейс, используя свой собственный mock-объект. Это приводит к менее связанному
коду, минимизируя зависимости в системе.
4
Ограничения UNIT тестов
Ошибки интеграции системного уровня
Происходит тестирование каждого из модулей по отдельности. Это
означает, что ошибки интеграции, системного уровня, функций,
исполняемых в нескольких модулях не будут определены.
Производительность
Данная технология бесполезна для проведения тестов на
производительность.
Таким образом, модульное тестирование более эффективно при
использовании в сочетании с другими методиками тестирования.
5
JUnit
6
JUnit - библиотека для модульного тестирования, принадлежит
семье фреймворков xUnit для разных языков программирования
JUnit породил систему расширений —
JMock, EasyMock, DbUnit, HttpUnit
JUnit. Функциональность
JUnit полностью построен на аннотациях.
◦ Все, что вам нужно сделать, – это обозначить тестовый метод с
помощью аннотации @Test.
◦ Настройка тестов @Before @After @BeforeClass @AfterClass
◦ Тестирование исключений @Test(expected=AnyException.class)
◦ TimeOut @Test(timeout=5000)
◦ Игнорирование @Ignore("Not running because <fill in a good reason
here>")
◦ Наборы тестов @RunWith(value=Suite.class)
@SuiteClasses(value={Test1.class, Test2.class})
◦ Параметризированные тесты @RunWith(value=Parameterized.class)
7
JUnit в примерах
8
JUnit4 в примерах
9
JUnit дополнительные
возможности
10
Правила(@Rule)
@Rulepublic finalTemporaryFolderfolder= new TemporaryFolder();//временные файлы
@Rulepublic finalTimeouttimeout= new Timeout(1000);//для задания таймаута
@Rulepublic finalExpectedExceptionthrown=ExpectedException.none();//для исключений
Правила - это некое подобие утилит для тестов, которые добавляют
функционал до и после выполнения теста.
TestNG
11
TestNG — это фреймворк для тестирования, написанный Java, он взял много
чего с JUnit и NUnit, но он не только унаследовался от существующей
функциональности Junit, а также внедрения новых инновационных функций,
которые делают его мощным, простым в использовании.
Какие возможности в TestNG?
1) Annotations. (Аннотация);
2) Использование XML для гибкого конфигурирования тестов;
3) Поддержка data-driven тестирования (с помощью аннотации
@DataProvider);
4) Тестирование кода проходит многопоточно, что дает безопасность и
быстродействие;
5) Легкий переход от JUnit.
TestNG. Аннотации
12
@BeforeSuite, @AfterSuite методы, которые исполняются единожды до/после исполнения
всех тестов.
@BeforeTest, @AfterTest методы, которые исполняются единожды до/после исполнения
теста.
@BeforeClass, @AfterClass методы, которые исполняются единожды до/после исполнения
всех тестов в классе. Идентичны предыдущим, но применимы к тест-классам.
@BeforeMethod, @AfterMethod методы, которые исполняются каждый раз до/после
исполнения тестового метода.
@BeforeGroups, @AfterGroups методы, которые исполняются до/после
первого/последнего теста принадлежащего к заданным группам.
Аннотация @Test обозначает сами тесты.
TestNG. Параметры
аннотаций
13
enabled — можно временно отключить, установив значение в false
groups — обозначает, для каких групп будет исполнен
inheritGroups — если true, метод будет наследовать группы от тест-класса
timeOut — время, после которого метод «свалится» и потянет за собой все зависимые от него
тесты
description — название, используемое в отчете
dependsOnMethods — методы, от которых зависит, сначала будут выполнены они, а затем данный
метод
dependsOnGroups — группы, от которых зависит
alwaysRun — если установить в true, будет вызываться всегда независимо от того, к каким группам
принадлежит, не применим к @BeforeGroups, @AfterGroups
Mocks
Mock-объект (от англ. mock object, буквально: объект-пародия, объект-
имитация) — тип объектов, реализующих заданные аспекты моделируемого
программного окружения.
Mock-объект представляет собой конкретную фиктивную
реализацию интерфейса, предназначенную исключительно для тестирования.
В процедурном программировании аналогичная конструкция называется
«dummy» (англ. — заглушка). Функция, выдающая константу, или случайную
величину из допустимого диапазона значений.
Mock-объекты активно используются в разработке через тестирование.
Моки это такие классы-заглушки (и соответсвенно объекты), которые
позволяют избавиться от внешних зависимостей при модульном (unit)
тестировании — ибо тестирование с зависимостями уже интеграционное или
системное и требует больших ресурсов, состояния данных и как следствие -
большей сложности.
С моками же можно тестировать контроллеры, где код с большей
ответсвенностью, который вызывает тяжёлые модели, у которых вся тяжёлая
логика веб-сервисов, баз данных, парсеров.. но которые уже покрыты тестами.
14
Mockito
Что умеет Mockito?
Создавать моки
Определять значение, возвращаемое методом мока
Выбрасывать исключение при вызове метода мока
Проверять:
порядок вызовов
количество вызовов
отсутствие вызовов
15
Mockito
Задание результата.
Используйте метод when() совместно со следующими методами:
◦ thenAnswer()
◦ thenReturn()
◦ thenThrow()
Если возвращаемый объект не задать, то по умолчанию будут возвращаться null, 0, false.
Матчеры
Если нужно одинаковое выполнение для некоторого набора параметров, то используйте
матчеры:
when(obj.c(anyString(), anyString())).thenReturn(true);
16
Mockito
Проверка вызова.
Используйте метод verify():
verify(obj).c(“”, “”);
verify(obj, times(1)).c(“”, “”);
verify(obj, atLeast(2)).c(“”, “”);
verify(obj, atMost(2)).c(“”, “”);
verify(obj, never()).c(“”, “”);
17
PowerMock
Расширение Mockito и EasyMock
Позволяет создавать моки на:
◦ static-методы
◦ private-методы
◦ final-методы
◦ конструкторы
18
PowerMock
Назначение.
Тестирование сторонних библиотек, к которым нет доступа на уровне исходников
Быстрое тестирование собственного плохого кода без проведения длительного рефакторинга
Использование.
Добавляем перед тестом аннотацию:
@RunWith(PowerMockRunner.class)
@PrepareForTest({ClassToBeMocked.class})
Либо используем JUnitRule (Junit 4.7+):
@PrepareForTest(X.class);
public class MyTest {
@Rule
PowerMockRule rule = new PowerMockRule();
// Tests goes here
}
19
Спасибо за внимание
10/18/2016 20

More Related Content

PPTX
Использование Mock объектов в модульном тестировании
PPTX
обработка исключений в Java
PDF
C++ осень 2012 лекция 3
PDF
Тестируем тесты с PIT (мутационное тестирование)
PPTX
Java Core. Lecture# 3. Part# 2. Exceptions.
PPT
4. java lecture exceptions
PPTX
Unit tests
PDF
Rambler.iOS #3: Test-Driven Development в iOS
Использование Mock объектов в модульном тестировании
обработка исключений в Java
C++ осень 2012 лекция 3
Тестируем тесты с PIT (мутационное тестирование)
Java Core. Lecture# 3. Part# 2. Exceptions.
4. java lecture exceptions
Unit tests
Rambler.iOS #3: Test-Driven Development в iOS

What's hot (19)

PPTX
Java mocking frameworks: Mockito and PowerMock
PDF
Victor Kuliamin.CSEDays
PPTX
Dependency Injection на примере Unity и NInject
PPTX
Unit tests final
PPTX
Java Core. Lecture# 3. Part# 3. Multithreading.
ODP
Исключительные ситуации
PPTX
Java весна 2013 лекция 9
PDF
PPT
05 Обработка Исключений
PPTX
ОЛЕКСАНДР ЄПІШЕВ «Мутаційне тестування: тести для тестів» Lviv QA Day 2019
PPT
Msu.Center.Lectures.J05 Handling Exceptions
PDF
Unit тестирование
PPT
Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.
PDF
Анастасия Бордонос - Проектирование тестов
PPT
Java. Lecture 05. Handling Exceptions and Debugging
PDF
Статический анализ исходного кода на примере WinMerge
PPTX
тестирование черного и белого ящиков презентация
PPTX
Автоматизация тестирования многопоточности
PPTX
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Java mocking frameworks: Mockito and PowerMock
Victor Kuliamin.CSEDays
Dependency Injection на примере Unity и NInject
Unit tests final
Java Core. Lecture# 3. Part# 3. Multithreading.
Исключительные ситуации
Java весна 2013 лекция 9
05 Обработка Исключений
ОЛЕКСАНДР ЄПІШЕВ «Мутаційне тестування: тести для тестів» Lviv QA Day 2019
Msu.Center.Lectures.J05 Handling Exceptions
Unit тестирование
Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.
Анастасия Бордонос - Проектирование тестов
Java. Lecture 05. Handling Exceptions and Debugging
Статический анализ исходного кода на примере WinMerge
тестирование черного и белого ящиков презентация
Автоматизация тестирования многопоточности
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Ad

Similar to Unit тесты java (20)

PPT
Unit Testing
PPTX
Mva stf module 2 - rus
PDF
C++ STL & Qt. Занятие 10.
KEY
iPhone Unit Testing (Google tool Box)
PDF
Александр Ярулин - Автоматизация тестирования с xUnit
PPTX
Unit tests Python examples
KEY
Testing RIA with Selenium
ODP
Java 9 - Back to the Future
PDF
Дело тестера боится: как в опытных руках могут заиграть Java и TestNg
PPT
Unit testing and TDD
PPT
ClubQA #2. Unit testing and TDD
PPT
Unit testing
PPTX
Автоматизация.pptx
PDF
Tech Talks @NSU: Организация тестирования в IT-компаниях Академгородка. Карье...
PPTX
Тестирование ПО
ODT
TAP
PDF
C# Desktop. Занятие 17.
PPTX
Do you know what you are testing?
PPTX
А вы знаете что тестируют ваши тесты?
PPTX
Test levels
Unit Testing
Mva stf module 2 - rus
C++ STL & Qt. Занятие 10.
iPhone Unit Testing (Google tool Box)
Александр Ярулин - Автоматизация тестирования с xUnit
Unit tests Python examples
Testing RIA with Selenium
Java 9 - Back to the Future
Дело тестера боится: как в опытных руках могут заиграть Java и TestNg
Unit testing and TDD
ClubQA #2. Unit testing and TDD
Unit testing
Автоматизация.pptx
Tech Talks @NSU: Организация тестирования в IT-компаниях Академгородка. Карье...
Тестирование ПО
TAP
C# Desktop. Занятие 17.
Do you know what you are testing?
А вы знаете что тестируют ваши тесты?
Test levels
Ad

Unit тесты java

  • 2. Содержание UNIT и INTEGRATION тесты Приемущества модульного тестирования (UNIT тестов) JUnit — библиотека для модульного тестирования Mock-библиотеки 2
  • 3. UNIT и INTEGRATION тесты 3 Unit test: процесс в программировании, позволяющий проверить на корректность отдельные модули исходного кода программы.Идея состоит в том, чтобы писать тесты для каждого нетривиального метода. Integration test: одна из фаз тестирования программного обеспечения, при котором отдельные программные модули объединяются и тестируются в группе.
  • 4. Преимущества UNIT тестов Поощрение изменений Модульное тестирование позже позволяет программистам проводить рефакторинг, будучи уверенными, что модуль по-прежнему работает корректно . Упрощение интеграции Модульное тестирование помогает устранить сомнения по поводу отдельных модулей и может быть использовано для подхода к тестированию «снизу вверх»: сначала тестируются отдельные части программы, затем программа в целом. Документирование кода Модульные тесты можно рассматривать как «живой документ» для тестируемого класса. Клиенты, которые не знают, как использовать данный класс, могут использовать юнит-тест в качестве примера. Отделение интерфейса от реализации Поскольку некоторые классы могут использовать другие классы, тестирование отдельного класса часто распространяется на связанные с ним. Например, класс пользуется базой данных; в ходе написания теста программист обнаруживает, что тесту приходится взаимодействовать с базой. Это ошибка, поскольку тест не должен выходить за границу класса. В результате разработчик абстрагируется от соединения с базой данных и реализует этот интерфейс, используя свой собственный mock-объект. Это приводит к менее связанному коду, минимизируя зависимости в системе. 4
  • 5. Ограничения UNIT тестов Ошибки интеграции системного уровня Происходит тестирование каждого из модулей по отдельности. Это означает, что ошибки интеграции, системного уровня, функций, исполняемых в нескольких модулях не будут определены. Производительность Данная технология бесполезна для проведения тестов на производительность. Таким образом, модульное тестирование более эффективно при использовании в сочетании с другими методиками тестирования. 5
  • 6. JUnit 6 JUnit - библиотека для модульного тестирования, принадлежит семье фреймворков xUnit для разных языков программирования JUnit породил систему расширений — JMock, EasyMock, DbUnit, HttpUnit
  • 7. JUnit. Функциональность JUnit полностью построен на аннотациях. ◦ Все, что вам нужно сделать, – это обозначить тестовый метод с помощью аннотации @Test. ◦ Настройка тестов @Before @After @BeforeClass @AfterClass ◦ Тестирование исключений @Test(expected=AnyException.class) ◦ TimeOut @Test(timeout=5000) ◦ Игнорирование @Ignore("Not running because <fill in a good reason here>") ◦ Наборы тестов @RunWith(value=Suite.class) @SuiteClasses(value={Test1.class, Test2.class}) ◦ Параметризированные тесты @RunWith(value=Parameterized.class) 7
  • 10. JUnit дополнительные возможности 10 Правила(@Rule) @Rulepublic finalTemporaryFolderfolder= new TemporaryFolder();//временные файлы @Rulepublic finalTimeouttimeout= new Timeout(1000);//для задания таймаута @Rulepublic finalExpectedExceptionthrown=ExpectedException.none();//для исключений Правила - это некое подобие утилит для тестов, которые добавляют функционал до и после выполнения теста.
  • 11. TestNG 11 TestNG — это фреймворк для тестирования, написанный Java, он взял много чего с JUnit и NUnit, но он не только унаследовался от существующей функциональности Junit, а также внедрения новых инновационных функций, которые делают его мощным, простым в использовании. Какие возможности в TestNG? 1) Annotations. (Аннотация); 2) Использование XML для гибкого конфигурирования тестов; 3) Поддержка data-driven тестирования (с помощью аннотации @DataProvider); 4) Тестирование кода проходит многопоточно, что дает безопасность и быстродействие; 5) Легкий переход от JUnit.
  • 12. TestNG. Аннотации 12 @BeforeSuite, @AfterSuite методы, которые исполняются единожды до/после исполнения всех тестов. @BeforeTest, @AfterTest методы, которые исполняются единожды до/после исполнения теста. @BeforeClass, @AfterClass методы, которые исполняются единожды до/после исполнения всех тестов в классе. Идентичны предыдущим, но применимы к тест-классам. @BeforeMethod, @AfterMethod методы, которые исполняются каждый раз до/после исполнения тестового метода. @BeforeGroups, @AfterGroups методы, которые исполняются до/после первого/последнего теста принадлежащего к заданным группам. Аннотация @Test обозначает сами тесты.
  • 13. TestNG. Параметры аннотаций 13 enabled — можно временно отключить, установив значение в false groups — обозначает, для каких групп будет исполнен inheritGroups — если true, метод будет наследовать группы от тест-класса timeOut — время, после которого метод «свалится» и потянет за собой все зависимые от него тесты description — название, используемое в отчете dependsOnMethods — методы, от которых зависит, сначала будут выполнены они, а затем данный метод dependsOnGroups — группы, от которых зависит alwaysRun — если установить в true, будет вызываться всегда независимо от того, к каким группам принадлежит, не применим к @BeforeGroups, @AfterGroups
  • 14. Mocks Mock-объект (от англ. mock object, буквально: объект-пародия, объект- имитация) — тип объектов, реализующих заданные аспекты моделируемого программного окружения. Mock-объект представляет собой конкретную фиктивную реализацию интерфейса, предназначенную исключительно для тестирования. В процедурном программировании аналогичная конструкция называется «dummy» (англ. — заглушка). Функция, выдающая константу, или случайную величину из допустимого диапазона значений. Mock-объекты активно используются в разработке через тестирование. Моки это такие классы-заглушки (и соответсвенно объекты), которые позволяют избавиться от внешних зависимостей при модульном (unit) тестировании — ибо тестирование с зависимостями уже интеграционное или системное и требует больших ресурсов, состояния данных и как следствие - большей сложности. С моками же можно тестировать контроллеры, где код с большей ответсвенностью, который вызывает тяжёлые модели, у которых вся тяжёлая логика веб-сервисов, баз данных, парсеров.. но которые уже покрыты тестами. 14
  • 15. Mockito Что умеет Mockito? Создавать моки Определять значение, возвращаемое методом мока Выбрасывать исключение при вызове метода мока Проверять: порядок вызовов количество вызовов отсутствие вызовов 15
  • 16. Mockito Задание результата. Используйте метод when() совместно со следующими методами: ◦ thenAnswer() ◦ thenReturn() ◦ thenThrow() Если возвращаемый объект не задать, то по умолчанию будут возвращаться null, 0, false. Матчеры Если нужно одинаковое выполнение для некоторого набора параметров, то используйте матчеры: when(obj.c(anyString(), anyString())).thenReturn(true); 16
  • 17. Mockito Проверка вызова. Используйте метод verify(): verify(obj).c(“”, “”); verify(obj, times(1)).c(“”, “”); verify(obj, atLeast(2)).c(“”, “”); verify(obj, atMost(2)).c(“”, “”); verify(obj, never()).c(“”, “”); 17
  • 18. PowerMock Расширение Mockito и EasyMock Позволяет создавать моки на: ◦ static-методы ◦ private-методы ◦ final-методы ◦ конструкторы 18
  • 19. PowerMock Назначение. Тестирование сторонних библиотек, к которым нет доступа на уровне исходников Быстрое тестирование собственного плохого кода без проведения длительного рефакторинга Использование. Добавляем перед тестом аннотацию: @RunWith(PowerMockRunner.class) @PrepareForTest({ClassToBeMocked.class}) Либо используем JUnitRule (Junit 4.7+): @PrepareForTest(X.class); public class MyTest { @Rule PowerMockRule rule = new PowerMockRule(); // Tests goes here } 19