Тестирование программного обеспечения: что, зачем и почему?
1. Tестирование программного обеспечения
Что, зачем и почему?
Software Testing 101
Марат Ахин
Санкт-Петербургский государственный политехнический университет
2014
Марат Ахин (СПбГПУ)
Intro
2014
1 / 313
4. Прелюдия
Обеспечение качества ПО
Обеспечение качества ПО
Функциональные требования
Адекватность
Нефункциональные требования
Надежность
Точность
Эффективность
Интероперабельность
Поддерживаемость
Безопасность
Переносимость
Как можно их проверять?
Марат Ахин (СПбГПУ)
Intro
2014
4 / 313
6. Прелюдия
Обеспечение качества ПО
Обеспечение качества ПО
Thinking is hard, running is simple. (c)
Запустить программу просто и это можно сделать всегда
Думать о программе сложно и требует «высшего знания»
Будем запускать программу, чтобы проверить, отвечает ли она
предъявленным требованиям
Марат Ахин (СПбГПУ)
Intro
2014
6 / 313
8. Прелюдия
Тестирование ПО
Что за вопрос лежит в основе тестирования?
Работает ли это ПО правильно?
НЕТ
Работает ли это ПО неправильно?
ДА
=
Тестирование
Разрушение
Марат Ахин (СПбГПУ)
Intro
2014
8 / 313
9. Прелюдия
Тестирование ПО
Что за вопрос лежит в основе тестирования?
Работает ли это ПО правильно?
НЕТ
Работает ли это ПО неправильно?
ДА
=
Тестирование
Разрушение
Марат Ахин (СПбГПУ)
Intro
2014
8 / 313
10. Прелюдия
Тестирование ПО
Что за вопрос лежит в основе тестирования?
Работает ли это ПО правильно?
НЕТ
Работает ли это ПО неправильно?
ДА
=
Тестирование
Разрушение
Марат Ахин (СПбГПУ)
Intro
2014
8 / 313
11. Прелюдия
Тестирование ПО
Что за вопрос лежит в основе тестирования?
Работает ли это ПО правильно?
НЕТ
Работает ли это ПО неправильно?
ДА
=
Тестирование
Разрушение
Марат Ахин (СПбГПУ)
Intro
2014
8 / 313
12. Прелюдия
Тестирование ПО
Что за вопрос лежит в основе тестирования?
Работает ли это ПО правильно?
НЕТ
Работает ли это ПО неправильно?
ДА
=
Тестирование
Разрушение
Марат Ахин (СПбГПУ)
Intro
2014
8 / 313
13. Прелюдия
Тестирование ПО
Кому помогает тестирование?
Лучший друг верификации и валидации ПО
В чем разница?
Верификация – «мы сделали это правильно»
Валидация – «мы сделали то, что надо»
Марат Ахин (СПбГПУ)
Intro
2014
9 / 313
14. Прелюдия
Тестирование ПО
Можем ли мы что-то гарантировать при тестировании?
Данное ПО никогда не упадет
Потоки никогда не заблокируются
Вычисления всегда выполняются корректно
Временные характеристики всегда выдерживаются
Мы можем дать такие гарантии лишь в самых тривиальных случаях,
когда обычно все ясно и без тестирования
Марат Ахин (СПбГПУ)
Intro
2014
10 / 313
15. Прелюдия
Тестирование ПО
Можем ли мы что-то гарантировать при тестировании?
Данное ПО никогда не упадет
Потоки никогда не заблокируются
Вычисления всегда выполняются корректно
Временные характеристики всегда выдерживаются
Мы можем дать такие гарантии лишь в самых тривиальных случаях,
когда обычно все ясно и без тестирования
Марат Ахин (СПбГПУ)
Intro
2014
10 / 313
16. Прелюдия
Тестирование ПО
Почему тестировать сложно?
Brian Kernighan
«Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are, by
definition, not smart enough to debug it.»
Massimo Arnoldi (feat. Kent Beck)
«Unfortunately at least for me (and not only) testing goes against human
nature. If you realize the pig in you, you will see that you program without
tests.»
Марат Ахин (СПбГПУ)
Intro
2014
11 / 313
17. Прелюдия
Тестирование ПО
Почему тестировать нужно?
Если отложить сегодняшние дела на послезавтра, у вас появятся два
свободных дня! (с)
Марат Ахин (СПбГПУ)
Intro
2014
12 / 313
19. Тестирование за 45 минут
Содержание
1
Прелюдия
2
Тестирование за 45 минут
Тестирование ПО с точки зрения дилетанта
Модель программной ошибки
Модель тестирования ПО
Процесс тестирования ПО
3
Тестирование в процессе разработки ПО
Марат Ахин (СПбГПУ)
Intro
2014
14 / 313
20. Тестирование за 45 минут
Тестирование ПО с точки зрения дилетанта
Тестирование ПО с точки зрения дилетанта
Запустили приложение
Проверили результаты выполнения на предмет наличия в них
ошибок
aka
aka
aka
aka
«багов»
«сбоев»
«дефектов»
«неудач»
Сперва надо разобраться, а что же такое «программная ошибка»?
Марат Ахин (СПбГПУ)
Intro
2014
15 / 313
21. Тестирование за 45 минут
Модель программной ошибки
Модель программной ошибки
FAILURE
FAULT
ERROR
Неудача – наблюдаемое снаружи
некорректное поведение программы
Сбой – некорректное состояние
программы из-за ошибки
Ошибка – ошибка в самой
программе, внесенная на этапе
разработки
Рассмотрим данную модель на примере
Марат Ахин (СПбГПУ)
Intro
2014
16 / 313
22. Тестирование за 45 минут
Модель программной ошибки
Модель программной ошибки
Найдите ошибку в следующей программе на Java
1 int sumCollection ( final @NotNull Collection < Integer > c ) {
2
int sum = 0;
3
for ( int i : c ) {
4
sum += i ;
5
}
6
return sum ;
7 }
Возможное переполнение в строке 4
Марат Ахин (СПбГПУ)
Intro
2014
17 / 313
23. Тестирование за 45 минут
Модель программной ошибки
Модель программной ошибки
Найдите ошибку в следующей программе на Java
1 int sumCollection ( final @NotNull Collection < Integer > c ) {
2
int sum = 0;
3
for ( int i : c ) {
4
sum += i ;
5
}
6
return sum ;
7 }
Возможное переполнение в строке 4
Марат Ахин (СПбГПУ)
Intro
2014
17 / 313
24. Тестирование за 45 минут
Модель программной ошибки
Модель программной ошибки
c = {}
Что будет?
1 int sumCollection ( final @NotNull Collection < Integer > c ) {
2
int sum = 0;
3
for ( int i : c ) {
4
sum += i ;
5
}
6
return sum ;
7 }
Нет ни сбоя, ни неудачи – программа работает корректно
Марат Ахин (СПбГПУ)
Intro
2014
18 / 313
25. Тестирование за 45 минут
Модель программной ошибки
Модель программной ошибки
c = {}
Что будет?
1 int sumCollection ( final @NotNull Collection < Integer > c ) {
2
int sum = 0;
3
for ( int i : c ) {
4
sum += i ;
5
}
6
return sum ;
7 }
Нет ни сбоя, ни неудачи – программа работает корректно
Марат Ахин (СПбГПУ)
Intro
2014
18 / 313
26. Тестирование за 45 минут
Модель программной ошибки
Модель программной ошибки
c = {1, 2, 3, 5}
Что будет?
1 int sumCollection ( final @NotNull Collection < Integer > c ) {
2
int sum = 0;
3
for ( int i : c ) {
4
sum += i ;
5
}
6
return sum ;
7 }
Нет ни сбоя, ни неудачи – программа работает корректно
Марат Ахин (СПбГПУ)
Intro
2014
19 / 313
27. Тестирование за 45 минут
Модель программной ошибки
Модель программной ошибки
c = {1, 2, 3, 5}
Что будет?
1 int sumCollection ( final @NotNull Collection < Integer > c ) {
2
int sum = 0;
3
for ( int i : c ) {
4
sum += i ;
5
}
6
return sum ;
7 }
Нет ни сбоя, ни неудачи – программа работает корректно
Марат Ахин (СПбГПУ)
Intro
2014
19 / 313
28. Тестирование за 45 минут
Модель программной ошибки
Модель программной ошибки
c = {1, 2, 3, 5, Integer.MAX_VALUE, Integer.MIN_VALUE}
Что будет?
1 int sumCollection ( final @NotNull Collection < Integer > c ) {
2
int sum = 0;
3
for ( int i : c ) {
4
sum += i ;
5
}
6
return sum ;
7 }
Сбой есть – программа проходит через некорректное состояние
Но неудачи нет – результат работы программы корректен
Марат Ахин (СПбГПУ)
Intro
2014
20 / 313
29. Тестирование за 45 минут
Модель программной ошибки
Модель программной ошибки
c = {1, 2, 3, 5, Integer.MAX_VALUE, Integer.MIN_VALUE}
Что будет?
1 int sumCollection ( final @NotNull Collection < Integer > c ) {
2
int sum = 0;
3
for ( int i : c ) {
4
sum += i ;
5
}
6
return sum ;
7 }
Сбой есть – программа проходит через некорректное состояние
Но неудачи нет – результат работы программы корректен
Марат Ахин (СПбГПУ)
Intro
2014
20 / 313
30. Тестирование за 45 минут
Модель программной ошибки
Модель программной ошибки
c = {1, 2, 3, 5, Integer.MAX_VALUE}
Что будет?
1 int sumCollection ( final @NotNull Collection < Integer > c ) {
2
int sum = 0;
3
for ( int i : c ) {
4
sum += i ;
5
}
6
return sum ;
7 }
Сбой есть – программа проходит через некорректное состояние
Неудача тоже есть – результат работы программы неправильный
Марат Ахин (СПбГПУ)
Intro
2014
21 / 313
31. Тестирование за 45 минут
Модель программной ошибки
Модель программной ошибки
c = {1, 2, 3, 5, Integer.MAX_VALUE}
Что будет?
1 int sumCollection ( final @NotNull Collection < Integer > c ) {
2
int sum = 0;
3
for ( int i : c ) {
4
sum += i ;
5
}
6
return sum ;
7 }
Сбой есть – программа проходит через некорректное состояние
Неудача тоже есть – результат работы программы неправильный
Марат Ахин (СПбГПУ)
Intro
2014
21 / 313
32. Тестирование за 45 минут
Модель тестирования ПО
Что мы делали?
Запускали ПО (мысленно)
Сравнивали результаты работы с ожидаемыми (логически)
Можно ли придумать другой способ тестирования?
Марат Ахин (СПбГПУ)
Intro
2014
22 / 313
33. Тестирование за 45 минут
Модель тестирования ПО
Модель тестирования ПО
Эталонная модель может быть
представлена множеством различных
способов
неформальное представление о том,
«как должна работать программа»
формальная техническая
спецификация
набор тестовых примеров
корректные результаты работы
программы
другая (априори корректная)
реализация той же исходной
спецификации
Марат Ахин (СПбГПУ)
Intro
2014
23 / 313
34. Тестирование за 45 минут
Процесс тестирования ПО
Процесс тестирования ПО
Что может случиться?
Марат Ахин (СПбГПУ)
Intro
2014
24 / 313
35. Тестирование за 45 минут
Процесс тестирования ПО
Тест прошел
A-WE-SO-ME!
Марат Ахин (СПбГПУ)
Intro
2014
25 / 313
36. Тестирование за 45 минут
Процесс тестирования ПО
Тест не прошел
OH-MI-GOD!
Марат Ахин (СПбГПУ)
Intro
2014
26 / 313
37. Тестирование за 45 минут
Процесс тестирования ПО
Ошибка в ПО
Все просто и понятно, да?
Марат Ахин (СПбГПУ)
Intro
2014
27 / 313
38. Тестирование за 45 минут
Процесс тестирования ПО
Ошибка в эталонной модели
Некорректный тест? Ошибка в спецификации?
Марат Ахин (СПбГПУ)
Intro
2014
28 / 313
39. Тестирование за 45 минут
Процесс тестирования ПО
Ошибка в тестовом окружении
Баг в тестовой библиотеке?
Марат Ахин (СПбГПУ)
Intro
2014
29 / 313
40. Тестирование за 45 минут
Процесс тестирования ПО
Ошибка в платформе
Баг в ОС? Аппаратный сбой? Ошибка компилятора?
Марат Ахин (СПбГПУ)
Intro
2014
30 / 313
41. Тестирование за 45 минут
Процесс тестирования ПО
Процесс тестирования ПО
Является ли данная модель самодостаточной?
Марат Ахин (СПбГПУ)
Intro
2014
31 / 313
42. Тестирование за 45 минут
Процесс тестирования ПО
Процесс тестирования ПО
Откуда брать эталонную модель?
Как сравнивать результаты работы программы и модели?
Марат Ахин (СПбГПУ)
Intro
2014
32 / 313
43. Тестирование за 45 минут
Процесс тестирования ПО
Процесс тестирования ПО
Когда останавливать процесс тестирования?
Марат Ахин (СПбГПУ)
Intro
2014
33 / 313
44. Тестирование за 45 минут
Процесс тестирования ПО
Процесс тестирования ПО
Как подобрать входные данные, чтобы:
дойти до места с программной ошибкой (Reachibility)
испортить состояние программы с появлением сбоя (Corruption)
вызвать неудачу в работе программы (Propagation)
Марат Ахин (СПбГПУ)
Intro
2014
34 / 313
45. Проблемы тестирования
Проблемы тестирования
Проблемы тестирования
What’s up, Doc? (с)
Проблема тестовых входных данных
Проблема наблюдаемости
Проблема «останова»
Проблема тестового оракула
Марат Ахин (СПбГПУ)
Intro
2014
35 / 313
46. Тестирование в процессе разработки ПО
Содержание
1
Прелюдия
2
Тестирование за 45 минут
3
Тестирование в процессе разработки ПО
Модели разработки ПО
Проблемы тестирования ПО
Марат Ахин (СПбГПУ)
Intro
2014
36 / 313
47. Тестирование в процессе разработки ПО
Модели разработки ПО
Модели разработки ПО
Чем активнее используется тестирование в процессе разработки,
тем важнее его правильное использование
Марат Ахин (СПбГПУ)
Intro
2014
37 / 313
48. Тестирование в процессе разработки ПО
Модели разработки ПО
Водопадная модель
Строго последовательная модель
разработки
Тестирование выполняется над всей
программой сразу
Имеется хорошая эталонная модель
Стоимость поиска и исправления
ошибок очень высока
Марат Ахин (СПбГПУ)
Intro
2014
38 / 313
49. Тестирование в процессе разработки ПО
Модели разработки ПО
Инкрементальная модель
Разработка проходит в несколько
итераций
Тестируются отдельные версии
программы
Имеется неплохая эталонная модель
Стоимость поиска и исправления
ошибок высока
Марат Ахин (СПбГПУ)
Intro
2014
39 / 313
50. Тестирование в процессе разработки ПО
Модели разработки ПО
Гибкая модель
Все этапы разработки неразрывно
связаны друг с другом
Тестированию подвергаются как сама
программа, так и ее компоненты
Эталонная модель есть не всегда
Стоимость поиска и исправления
ошибок относительно низка
Марат Ахин (СПбГПУ)
Intro
2014
40 / 313
51. Тестирование в процессе разработки ПО
Проблемы тестирования ПО
Проблемы тестирования ПО
Разве что-то может пойти совсем плохо?
Марат Ахин (СПбГПУ)
Intro
2014
41 / 313
52. Тестирование в процессе разработки ПО
Проблемы тестирования ПО
Розовые очки
Марат Ахин (СПбГПУ)
Intro
2014
42 / 313
53. Тестирование в процессе разработки ПО
Проблемы тестирования ПО
Розовые очки
Неправильное тестирование создает иллюзию, что все хорошо...
...тогда как на самом деле все может быть очень и очень плохо
Все тесты проходят
Выпускаем код в релиз
...
BOOM!
Марат Ахин (СПбГПУ)
Intro
2014
43 / 313
54. Тестирование в процессе разработки ПО
Проблемы тестирования ПО
Наводнение
Марат Ахин (СПбГПУ)
Intro
2014
44 / 313
55. Тестирование в процессе разработки ПО
Проблемы тестирования ПО
Наводнение
Неправильное тестирование создает иллюзию, что все плохо...
...тогда как на самом деле все вполне себе ничего
Большинство тестов не проходит
Садимся и исправляем ошибки
...
UNREACHABLE!
Марат Ахин (СПбГПУ)
Intro
2014
45 / 313
56. Тестирование в процессе разработки ПО
Проблемы тестирования ПО
Прятки
Марат Ахин (СПбГПУ)
Intro
2014
46 / 313
57. Тестирование в процессе разработки ПО
Проблемы тестирования ПО
Прятки
Неправильное тестирование создает иллюзию, что все плохо...
...тогда как на самом деле все плохо в другом месте
Некоторые тесты не проходит
Садимся и ищем ошибки
...
HUH?
Марат Ахин (СПбГПУ)
Intro
2014
47 / 313
58. Что же делать?
Что же делать?
Что же делать?
Марат Ахин (СПбГПУ)
Intro
2014
48 / 313
59. Что же делать?
Что же делать?
Что же делать?
Марат Ахин (СПбГПУ)
Intro
2014
49 / 313