58
Модульное тестирование Влад Алюков

Тестирование весна 2014 смешанное занятие 2

Embed Size (px)

Citation preview

Page 1: Тестирование весна 2014 смешанное занятие 2

Модульное тестирование

Влад Алюков

Page 2: Тестирование весна 2014 смешанное занятие 2

О чём

Зачем нужны модульные(unit) тесты Что они из себя представляют Подходы к написанию тестов Анализ существующих тестов Антипаттерны в проектировании тестов Как написать нетестопригодный код Статический анализ кода

2

Page 3: Тестирование весна 2014 смешанное занятие 2

3

Модульное тестирование

Page 4: Тестирование весна 2014 смешанное занятие 2

UNIT test

4

Page 5: Тестирование весна 2014 смешанное занятие 2

Зачем писать unit-тесты?

Уменьшение количества итераций Разработка > Тестирование > Разработка

Качество кода Более лёгкое внесение изменений Документация

5

Page 6: Тестирование весна 2014 смешанное занятие 2

Зачем: Качество кода

6

Page 7: Тестирование весна 2014 смешанное занятие 2

Зачем: Простое внесение изменений

7

Page 8: Тестирование весна 2014 смешанное занятие 2

Зачем: Документация

8

Page 9: Тестирование весна 2014 смешанное занятие 2

Пирамида тестирования

9

Page 10: Тестирование весна 2014 смешанное занятие 2

Превосходство модульных тестов

Скорость Надёжность Стабильность

10

Page 11: Тестирование весна 2014 смешанное занятие 2

Скорость

11

Page 12: Тестирование весна 2014 смешанное занятие 2

Надёжность

12

Page 13: Тестирование весна 2014 смешанное занятие 2

Стабильность

13

Page 14: Тестирование весна 2014 смешанное занятие 2

Анатомия теста

14

Инициализация контекста (опционально)

Выполнение проверок Очистка контекста (опционально) Отчётность

Page 15: Тестирование весна 2014 смешанное занятие 2

Задачи фрэймворка

Структура для написания тестов Запуск тестов Отчёты

15

Page 16: Тестирование весна 2014 смешанное занятие 2

Пример использования фрэймворка

16

Page 17: Тестирование весна 2014 смешанное занятие 2

Репорты

Html Report xUnit Report Text Report

17

Page 18: Тестирование весна 2014 смешанное занятие 2

Тестовые фрейморки xUnit

18

unit test framework #{lang}unit test framework #{lang}

Page 19: Тестирование весна 2014 смешанное занятие 2

Пример тестов на фибоначчи

Разбор тестируемого метода Определение граничных значений Определение классов эквивалентности

19

Page 20: Тестирование весна 2014 смешанное занятие 2

Виды проверок (ассертов)

20

Page 21: Тестирование весна 2014 смешанное занятие 2

21

Антипаттерны в тестировании

Page 22: Тестирование весна 2014 смешанное занятие 2

False Positive

assertTrue(True) Пустое тело метода

22

Page 23: Тестирование весна 2014 смешанное занятие 2

Зависимый

Зависит от окружения Операционная система Расположение файлов

Зависит от других тестов Один тест подготавливает данные для другого

23

Page 24: Тестирование весна 2014 смешанное занятие 2

Inspector

Использует знание о структуре объектов (reflection api) Изменение атрибутов доступа тестируемого

класса Получение приватных значение тестируемого

класса

24

Page 25: Тестирование весна 2014 смешанное занятие 2

GodTest

Задействует много посторонних объектов и подсистем В случае падения трудно определить причину По большому счёту является уже больше

интеграционным тестом, нежели unit

25

Page 26: Тестирование весна 2014 смешанное занятие 2

Неинформативные имена

26

Page 27: Тестирование весна 2014 смешанное занятие 2

Медленные тесты

27

Unit-test не должны выполнятся больше секунды

Что замедляет Ввод/вывод Обработка сложных структур данных sleep

Page 28: Тестирование весна 2014 смешанное занятие 2

Заглушки

Эмуляция hardware интерфейсов Внешние зависимости

Виды Stub ― заглушка для объекта Mock ― эмул яция объекта Dummy – Пустой объект

28

Page 29: Тестирование весна 2014 смешанное занятие 2

Mock/Stub (Demo)

29

Page 30: Тестирование весна 2014 смешанное занятие 2

Альтернативный подход (DocTest)

30

Классический тест:

Page 31: Тестирование весна 2014 смешанное занятие 2

Альтернативный подход (DocTest)

31

Page 32: Тестирование весна 2014 смешанное занятие 2

DocTest

Преимущества Актуальные примеры использования Простота написания

Недостатки Развесистая документация Нецелевое использование docstring Неудобно работать с фикстурами

32

Page 33: Тестирование весна 2014 смешанное занятие 2

33

Практики написания тестов

Page 34: Тестирование весна 2014 смешанное занятие 2

TDD

34

Page 35: Тестирование весна 2014 смешанное занятие 2

TDD

Плюсы Отслеживание прогресса Документирование Архитектура “в нагрузку” Перенос процесса отладки на начальную

стадию

Минусы Высокий порог вхождения

35

Page 36: Тестирование весна 2014 смешанное занятие 2

Пример TDD (ruby)

36

Page 37: Тестирование весна 2014 смешанное занятие 2

37

Анализ существующих

тестов

Page 38: Тестирование весна 2014 смешанное занятие 2

Анализ покрытия

38

Page 39: Тестирование весна 2014 смешанное занятие 2

Метрики

По файлам По классам По состояниями По линиям кода

39

Page 40: Тестирование весна 2014 смешанное занятие 2

Обманчивое покрытие

Примеры когда покрытие лжет!

40

Page 41: Тестирование весна 2014 смешанное занятие 2

Инструменты

Emma(java) Simplecover (ruby) Sonar

41

Page 42: Тестирование весна 2014 смешанное занятие 2

Mutation Testing

42

Page 43: Тестирование весна 2014 смешанное занятие 2

Возможные мутации (мутанты)

43

Page 44: Тестирование весна 2014 смешанное занятие 2

Эквивалентные мутанты

44

Page 45: Тестирование весна 2014 смешанное занятие 2

45

Антипаттерны в разработке

Page 46: Тестирование весна 2014 смешанное занятие 2

Сильно связанный код

Монолитная кодовая база (инициализация классов внутри класса)

Сложность в разделении на модули Перегруженные тесты

46

Page 47: Тестирование весна 2014 смешанное занятие 2

“Тяжёлые” конструкторы

Конструкторы содержащие создание или настройку членов класса

Не поддаются изоляции от членов класса, для тестирования необходимо подгружать другие модули.

47

Page 48: Тестирование весна 2014 смешанное занятие 2

“Тяжёлые” методы

Очень большое тело метода Много аргументов на вход Передача контекстного объекта в тело

метода

Проблемы в тестировании Более сложные тесты

Вероятно метод реализует слишком много логики, необходимо разделение на объекты.

48

Page 49: Тестирование весна 2014 смешанное занятие 2

Цикломатическая сложность

Количество путей выполнения программы

Выше цикломатическая сложность – сложнее тестировать

Каждый дополнительный операнд у if увеличивает количество необходимых тестов минимум на 2

49

Page 50: Тестирование весна 2014 смешанное занятие 2

God Object

Класс «всё включено» Обычно содержит в себе тяжёлые

методы, и тяжёлый конструктор

Слишком много логики сосредоточено в объекте, сложность в тестовой декомпозиции, сложность дизайна тестов.

50

Page 51: Тестирование весна 2014 смешанное занятие 2

Singleton

Паттерн позволяющий создавать единственный экземпляр объекта

Отравляемый контекст

Минусы: Применение данного паттерна может

привести к неприятным side-эффектам. Конкуренции за доступ (в highload

проектах)

51

Page 52: Тестирование весна 2014 смешанное занятие 2

Dependency Injection

Паттерн проектирования понижающий связанность кода

Фреймворки: Guice (java) Spring (java)

52

Page 53: Тестирование весна 2014 смешанное занятие 2

Статический анализ кодовой базы

Связанность кода Опасные конструкции Опечатки Копипаст Утечки памяти Code Convention Цикломатическая сложность

53

Page 54: Тестирование весна 2014 смешанное занятие 2

Sonar

54

Page 55: Тестирование весна 2014 смешанное занятие 2

Sonar

55

Page 56: Тестирование весна 2014 смешанное занятие 2

Домашнее задание

Сделать форк проекта server с моего гитхаба

Обеспечить его тестовое покрытие не ниже 85%

Замеряем покрытие cobertura Метрика branch coverage Задание выполняется индивидуально

56

Page 57: Тестирование весна 2014 смешанное занятие 2

57

Вопросы?

Page 58: Тестирование весна 2014 смешанное занятие 2

Спасибо за внимание

Влад Алюков [email protected]