Скачать презентацию
Идет загрузка презентации. Пожалуйста, подождите
Презентация была опубликована 10 лет назад пользователемДарья Булгакова
1 Saint Petersburg, 2012 Java Lecture #3 Test Frameworks
2 Agenda UNIT и INTEGRATION тесты Приемущества модульного тестирования (UNIT тестов) JUnit библиотека для модульного тестирования Mock-библиотеки Разработка через тестирование TDD (test-driven development) 2
3 UNIT и INTEGRATION тесты 3 Unit test: процесс в программировании, позволяющий проверить на корректность отдельные модули исходного кода программы.Идея состоит в том, чтобы писать тесты для каждого нетривиального метода. Integration test : одна из фаз тестирования программного обеспечения, при котором отдельные программные модули объединяются и тестируются в группе.
4 Приемущества UNIT тестов Поощрение изменений Модульное тестирование позже позволяет программистам проводить рефакторинг, будучи уверенными, что модуль по-прежнему работает корректно. Упрощение интеграции Модульное тестирование помогает устранить сомнения по поводу отдельных модулей и может быть использовано для подхода к тестированию «снизу вверх»: сначала тестируются отдельные части программы, затем программа в целом. Документирование кода Модульные тесты можно рассматривать как «живой документ» для тестируемого класса. Клиенты, которые не знают, как использовать данный класс, могут использовать юнит-тест в качестве примера. Отделение интерфейса от реализации Поскольку некоторые классы могут использовать другие классы, тестирование отдельного класса часто распространяется на связанные с ним. Например, класс пользуется базой данных; в ходе написания теста программист обнаруживает, что тесту приходится взаимодействовать с базой. Это ошибка, поскольку тест не должен выходить за границу класса. В результате разработчик абстрагируется от соединения с базой данных и реализует этот интерфейс, используя свой собственный mock-объект. Это приводит к менее связанному коду, минимизируя зависимости в системе.mock-объект 4
5 Ограничения UNIT тестов Ошибки интеграции системного уровня Происходит тестирование каждого из модулей по отдельности. Это означает, что ошибки интеграции, системного уровня, функций, исполняемых в нескольких модулях не будут определены. Производительность Данная технология бесполезна для проведения тестов на производительность. Таким образом, модульное тестирование более эффективно при использовании в сочетании с другими методиками тестирования. 5
6 JUnit библиотека для модульного тестирования 6 JUnit принадлежит семье фреймворков xUnit для разных языков программированияxUnit JUnit породил систему расширений JMock, EasyMock, DbUnit, HttpUnitJMockEasyMockDbUnitHttpUnit
7 Функциональность JUnit 4 JUnit 4 полностью построен на аннотациях. Все, что вам нужно сделать, – это обозначить тестовый метод с помощью Тестирование Игнорирование running because ") Test2.class}) Параметризированные 7
8 JUnit4 в примерах 8 public class Calculator { public Integer maxValue(Integer a, Integer b) { if (a == null || b == null) { throw new IllegalArgumentException("Param must be not null"); } if (a < b) { return b; } return a; }
9 JUnit4 в примерах 9 public class CalculatorTest { private Calculator public void initCalculator() { calculator = new Calculator(); public void maxValueTest() { Integer actual = calculator.maxValue(Integer.valueOf(10), Integer.valueOf(20)); Assert.assertEquals(Integer.valueOf(20), actual); = IllegalArgumentException.class) public void exceptionTest() { calculator.maxValue(Integer.valueOf(10), null); }
10 JUnit4 дополнительные возможности 10 public final TemporaryFolder folder = new TemporaryFolder(); // временные public final Timeout timeout = new Timeout(1000); // для задания public final ExpectedException thrown = ExpectedException.none();// для исключений Правила это некое подобие утилит для тестов, которые добавляют функционал до и после выполнения теста.
11 JUnit4 дополнительные возможности 11 Runner JUnit4 по умолчанию предназначена для запуска JUnit 4 тестов. Suite для запуска последовательности тестов. Для настройки запускаемых тестов используется – организация тестов в категории
12 JUnit4 дополнительные возможности 12 Multithreaded unit tests public interface Counter { int incrementAndGet(); } public class DumbCounter implements Counter { private int public int incrementAndGet() { return ++counter; }
13 JUnit4 дополнительные возможности 13 Multithreaded unit tests public class AtomicIntCounter implements Counter { private AtomicInteger atomicInt = new public int incrementAndGet() { return atomicInt.incrementAndGet(); }
14 TestNG 14 Фреймовик для тестирования TestNG, аналог Junit Иерархия: +- suite/ +- test0/ | +- class0/ | | +- method0(integration group)/ | | +- method1(functional group)/ | | +- method2/ | +- class1 | +- method3(optional group)/ +- test1/ +- class3(optional group, integration group)/ +- method4/
15 TestNG before suite/ +- before group/ +- before test/ +- before class/ +- before method/ +- test/ +- after method/ after class/ after test/ after group/ after suite/
16 TestNG 16 Фреймовик для тестирования TestNG, аналог обозначают методы, которые исполняются единожды до/после исполнения всех тестов. Здесь удобно располагать какие-либо тяжелые настройки общие для всех тестов, например, здесь можно создать пул соединений с базой обозначают методы, которые исполняются единожды до/после исполнения теста(тот, который включает в себя тестовые классы, не путать с тестовыми методами). Здесь можно хранить настройки какой-либо группы взаимосвязанных сервисов, либо одного сервиса, если он тестируется несколькими обозначают методы, которые исполняются единожды до/после исполнения всех тестов в классе, идентичны предыдущим, но применимы к тест-классам. Наиболее применим для тестирования какого-то определенного сервиса, который не меняет свое состояние в результате обозначают методы, которые исполняются каждый раз до/после исполнения тестового метода. Здесь удобно хранить настройки для определенного бина или сервиса, если он не меняет свое состояние в результате обозначает методы, которые исполняются до/после первого/последнего теста принадлежащего к заданным группам. обозначает сами тесты. Здесь размещаются проверки. Также применима к классам
17 TestNG 17 У всех этих аннотаций есть следующие параметры: enabled можно временно отключить, установив значение в false groups обозначает, для каких групп будет исполнен inheritGroups если true(а по умолчанию именно так), метод будет наследовать группы от тест- класса timeOut время, после которого метод «свалится» и потянет за собой все зависимые от него тесты description название, используемое в отчете dependsOnMethods методы, от которых зависит, сначала будут выполнены они, а затем данный метод dependsOnGroups группы, от которых зависит alwaysRun если установить в true, будет вызываться всегда независимо от того, к каким группам принадлежит, не
18 Mocks 18 Mock-объект (от англ. mock object, буквально: объект-пародия, объект- имитация) тип объектов, реализующих заданные аспекты моделируемого программного окружения.англ.объектов Mock-объект представляет собой конкретную фиктивную реализацию интерфейса, предназначенную исключительно для тестирования.интерфейса В процедурном программировании аналогичная конструкция называется «dummy» (англ. заглушка). Функция, выдающая константу, или случайную величину из допустимого диапазона значений. Mock-объекты активно используются в разработке через тестирование. Моки это такие классы-заглушки (и соответсвенно объекты), которые позволяют избавиться от внешних зависимостей при модульном (unit) тестировании ибо тестирование с зависимостями уже интеграционное или системное и требует больших ресурсов, состояния данных и как следствие - большей сложности. С моками же можно тестировать контроллеры, где код с большей ответсвенностью, который вызывает тяжёлые модели, у которых вся тяжёлая логика веб-сервисов, баз данных, парсеров.. но которые уже покрыты тестами.
19 Mockito 19 Что умеет Mockito? Создавать моки Определять значение, возвращаетмое методом мока Выбрасывать исключение при вызове метода мока Проверять: порядок вызовов количество вызовов отсутствие вызовов
20 Mockito 20 Задание результата. Используйте метод when() совместно со следующими методами: thenAnswer() thenReturn() thenThrow() Если возвращаемый объект не задать, то по умолчанию будут возвращаться null, 0, false. Матчеры Если нужно одинаковое выполнение для некоторого набора параметров, то используйте матчеры: when(obj.c(anyString(), anyString())).thenReturn(true);
21 Mockito 21 Проверка вызова. Используйте метод verify(): verify(obj).c(, ); verify(obj, times(1)).c(, ); verify(obj, atLeast(2)).c(, ); verify(obj, atMost(2)).c(, ); verify(obj, never()).c(, );
22 PowerMock 22 Расширение Mockito и EasyMock Позволяет создавать моки на: static-методы private-методы final-методы конструкторы
23 PowerMock 23 Назначение. Тестирование сторонних библиотек, к которым нет доступа на уровне исходников Быстрое тестирование собственного плохого кода без проведения длительного рефакторинга Использование. Добавляем перед Либо используем JUnitRule (Junit public class MyTest PowerMockRule rule = new PowerMockRule(); // Tests goes here }
24 Разработка через тестирование Разработка через тестирование (test-driven development, TDD) техника разработки программного обеспечения, которая основывается на повторении очень коротких циклов разработки: сначала пишется тест, покрывающий желаемое изменение, затем пишется код, который позволит пройти тест, и под конец проводится рефакторинг нового кода к соответствующим стандартам. 24
25 Разработка через тестирование 25 Добавление теста( фокусирует внимание девелопера на бизнес требованиях а не на написании кода ) Запуск тестов и получение отрицательных результатов Написание кода под имеющиеся тесты Запуск тестов и проверка их прохождения Рефакторинг кода
Еще похожие презентации в нашем архиве:
© 2024 MyShared Inc.
All rights reserved.