Software Design Модульное тестирование Бреслав А. А. Код постоянно модифицируется Добавление новых функций  Исправление ошибок  Улучшение дизайна (рефакторинг)   Каждое изменение кода может внести ошибку Бреслав А.

Download Report

Transcript Software Design Модульное тестирование Бреслав А. А. Код постоянно модифицируется Добавление новых функций  Исправление ошибок  Улучшение дизайна (рефакторинг)   Каждое изменение кода может внести ошибку Бреслав А.

Software Design
Модульное тестирование
Бреслав А. А.
Код постоянно модифицируется
Добавление новых функций
 Исправление ошибок
 Улучшение дизайна (рефакторинг)


Каждое изменение кода может внести
ошибку
Бреслав А. А.
Паттерны проектирования. Введение
Защита от ошибок при
модификации


Статические проверки
Динамические проверки
 Контракт
 Утверждения

(assertions)
Тестирование
 Приемочное (acceptance tests)
 проверка системы в целом или ее крупных частей
 Модульное (блочное, unit tests)
 проверка отдельных методов
Бреслав А. А.
Паттерны проектирования. Введение
Необходимость тестирования
Статические проверки не позволяют
обнаружить логические ошибки
 Не все динамические проверки
обязательно выполнятся при
отладочном запуске
 Тесты позволяют гарантировать, что
проверка состоялась

Бреслав А. А.
Паттерны проектирования. Введение
Кто тестирует

QA-инженер (тестер)
 Приемочные
тесты
 Со значительной задержкой

Разработчик
 Не
только приемочные, но и блочные тесты
 Как только понадобится
Бреслав А. А.
Паттерны проектирования. Введение
Автоматические тесты

Тестировать вручную слишком долго и
скучно 
 Что-нибудь
забудешь

проверить обязательно
Если каждый тест – это программа, то
один разработчик может
протестировать весь проект при каждом
изменении кода
Бреслав А. А.
Паттерны проектирования. Введение
Старый анекдот 
― Папа,
почему Солнышко каждый день
встает?
― Откуда ты знаешь? Ты проверял?
Работает? Каждый день работает?
Тогда сынок, ради Бога, НИЧЕГО НЕ
ТРОГАЙ!
У папы не было автоматических тестов 
Бреслав А. А.
Паттерны проектирования. Введение
Тесты не должны быть
«полуавтоматическими»


Код теста должен однозначно говорить,
правильно работает программа или нет
Если человеку необходимо проверить, что
 на
экран выводится нужная последовательность
чисел
 нужные файлы созданы и имеют нужный размер
…
то это уже не автоматические тесты
Бреслав А. А.
Паттерны проектирования. Введение
Тесты не должны быть
случайными
Автоматический тест должен находить
ошибку ВСЕГДА
 Тест на случайных данных сообщает,
что ошибка есть, но не позволяет ее
обнаружить
 Случайные данные тесты можно
применять для поиска тестовых
случаев, а не для проверки

Бреслав А. А.
Паттерны проектирования. Введение
Автоматизация тестов

Приемочные
 Сложно
создать систему для приемочного
тестирования GUI
 Долго писать тестовые сценарии

Модульные
 Просто
писать
 Позволяют обнаружить значительную часть
ошибок
Бреслав А. А.
Паттерны проектирования. Введение
Блочные тесты

Проверяем маленькие участки
функциональности
 часто

это отдельные методы
Создаем в процессе разработки
 Возможно
даже ДО написания
тестируемого кода

Запускаем после каждой модификации
системы
Бреслав А. А.
Паттерны проектирования. Введение
Польза от тестов
Улучшение понимания системы ее
разработчиком
 Раннее обнаружение ошибок
 Уверенность при модификации кода
 Дополнительное описание
функциональности
 Улучшение API

Бреслав А. А.
Паттерны проектирования. Введение
Когда писать и запускать тесты

При создании нового кода
 Писать
и запускать тесты вместо отладочных
запусков кода
 Создавать тесты как можно раньше

При обнаружении ошибки
 Написать
тест, воспроизводящий ошибку
 Исправить ошибку
 Убедиться, что все тесты проходят без ошибок
Бреслав А. А.
Паттерны проектирования. Введение
Масштаб одного теста
Один тест – один сценарий
использования
 Не нужно тестировать все одним тестом
 Даже если тестируется один метод
часто бывают нужны несколько тестов

Бреслав А. А.
Паттерны проектирования. Введение
Полнота тестирования
Невозможно быстро создать полную
систему тестов
 С этим нужно смириться
 Неполные тесты лучше отсутствия
тестов
 Обнаружатся ошибки – добавим еще
тестов

Бреслав А. А.
Паттерны проектирования. Введение
JUnit

Авторы: Эрих Гамма и Кент Бек
3 использует reflection
 JUnit 4 использует аннотации
 JUnit
Тест – это метод
 Тесты объединяются в классы

 Обычно
один класс тестов соответствует
одному классу системы
Бреслав А. А.
Паттерны проектирования. Введение
Пример: тесты для стека (1)
public class StackTests extends TestCase {
public void testPush() {
Stack s = new Stack();
s.push(“abc”);
s.push(“abc”);
assertTrue(s.size() == 2);
}
Бреслав А. А.
Паттерны проектирования. Введение
Пример: тесты для стека (2)
public void testPop() {
Stack s = new Stack();
s.push(“abc”);
s.push(“def”);
assertEquals(s.pop(), “def”);
assertTrue(s.size() == 1);
}
Бреслав А. А.
Паттерны проектирования. Введение
Пример: тесты для стека (3)
public void testPopFail() {
Stack s = new Stack();
try {
s.pop();
fail();
} except (StackUnderflowException e) {
}
}
Бреслав А. А.
Паттерны проектирования. Введение
JUnit 3
Базовый класс TestCase
 Имя тестового метода начинается со
слова test
 assertTrue(), assertFalse(),
assertEquals(), assertNull(),
assertNotNull(), assertSame()
 fail() – тест не прошел

Бреслав А. А.
Паттерны проектирования. Введение
JUnit 4
Базового класса нет
 Имя метода любое
 Аннотация @Test
 Класс Assert

 статические
Бреслав А. А.
методы assert*()
Паттерны проектирования. Введение
Фикстура (fixture)

Часто для запуска каждого теста
требуется создать и
проинициализировать объект
тестируемого класса
 Тесты

стека: создать стек
Метод setUp() запускается перед
вызовом каждого теста
 JUnit
Бреслав А. А.
4: @Before
Паттерны проектирования. Введение
Внешняя фикстура

Иногда фикстура задействует внешние
ресурсы
 файлы
 сетевые
соединения
…

Метод tearDown() запускается после
каждого теста
 JUnit
Бреслав А. А.
4: @After
Паттерны проектирования. Введение
Общая фикстура

JUnit 4
 @BeforeClass
– перед запуском тестов из
этого класс
 @AfterClass – после окончания работы
тестов из этого класса
Бреслав А. А.
Паттерны проектирования. Введение
Наборы тестов

Запускать классы тестов по одному неудобно
 JUnit

public class AllTests {



Бреслав А. А.
3: TestSuite, метод suite()
public static Test suite() {
 TestSuite suite = new TestSuite(“Suite");
 suite.addTest(TestStack.class);
 suite.addTest(TestQueue.class);
 return suite;
}
}
Паттерны проектирования. Введение
Test-Driven Development (XP)

Сначала тесты – потом код
 Написать
тест
 Сделать так, чтобы все скомпилировалось

ТОЛЬКО СКОМПИЛИРОВАЛОСЬ
 Убедиться,
что тест не проходит
 Сделать минимум действий, чтобы этот тест
проходил
 Убедиться, что тест проходит
 Устранить все дублирование
Бреслав А. А.
Паттерны проектирования. Введение
Чем это хорошо
Сначала думаем, потом пишем
 Тесты помогают понять, что нужно
сделать следующим шагом
 Тест является заказом «идеального
API»
 То, что тест сначала не проходит – это
«тест для теста»

Бреслав А. А.
Паттерны проектирования. Введение
Некоторые рекомендации
Начинать тест с assert*()
 Использовать понятные тестовые
данные
 Использовать тесты, чтобы понять, как
что-то работает
 Нашли ошибку – сразу напишите тест

Бреслав А. А.
Паттерны проектирования. Введение
Источники
1.
Бек К., Экстремальное
программирование: разработка
через тестирование. Библиотека
программиста. – СПб.: Питер,
2003. – 224 с.: ил.
Бреслав А. А.
Паттерны проектирования. Введение
Вопросы
Бреслав А. А.
Паттерны проектирования. Введение