Тестирование — это та же программа со своим кодом
Unit-тесты
Тестирование белого, серого, чёрного ящика
Нагрузочное тестирование
Стресс-тестирование
Интеграционное тестирование
TDD, BDD
Feature — предлагаемая функциональность
Bug — неправильная реализация функциональности
Спецификация — набор функциональностей, которым обладает система
Unit test — модульный тест
Framework — движок (библиотека) для реализации конкретной функциональности
тестовый движок (gtest, catch2)
движок пользовательского интерфейса (Qt, Gtk)
Boost — это не движок, это набор библиотек
НО! boost::async — это движок для сетевого взаимодействия
Fixture, Suite, Case — способы иерархического представления тестов
Тестирование одного модуля без каких-либо зависимостей от других модулей
Разновидность серого/чёрного ящика
Уже готовый пример использования кода
Возможнность регрессионного тестирования
CUnit, Boost test, GTest, Catch, …
#include<gtest/gtest.h>classDwtTest: public ::testing::Test { protected:DwtTest() : img(kWidth * kHeight) { std::fill(img.begin(), img.end(), 0); auto it = img.begin() + kHeight/2 * kWidth; for (auto i = 0; i < kHeight/5; ++i) std::fill_n(it + i * kWidth + kWidth/4, kWidth/2, 255); } voidSetUp() {} voidTearDown() {} protected: std::vector<float> img; }; TEST_F(DwtTest, DwtIDwt) { std::vector<float> subbands(img); ASSERT_EQ(wt2d_cdf97_fwd(subbands.data(), kHeight, kWidth, 3), 0); std::vector<float> restored(subbands); ASSERT_EQ(wt2d_cdf97_inv(restored.data(), kHeight, kWidth, 3), 0); ASSERT_EQ(restored.size(), img.size()); for (int i = 0; i < img.size(); ++i) EXPECT_NEAR(restored[i], img[i], 1) << "Index " << i; }
ASSERT, EXPECT — примитивы сравнения (ядро теста)
WARN, ERROR — уровни остановки теста
Иерархии тестов: TestSuite (Fixture), TestCase — зависит от тестового движка
TearUp/Down, FixtureSetup/Cleanup — ин(де)ициализация уровня теста
Механизм добавления теста
Система оповещения пользователя об ошибках
Разные уровни тестов необходимы для организации генерации тестируемых данных
Автоматическое добавление тестов
Изменённая иерархия тестов:
нулевой уровень — глобальное пространство имён
первый уровень —
TEST_CASE
второй уровень —
SECTION
Поддержка BDD-стиля тестирования
Привычные методы сравнения
Разработка через тестирование
Каждая функционально сначала обретает тест, а потом непосредственный код
Согласование интерфейса происходит раньше согласования реализации функциональности
Является идеалогией, а не типом тестирования
Тесты всегда свежие, так как сначала пишутся именно они
Тестирование целиком
Тестирование взаимодействия библиотек, систем или компонентов одной системы
Подходят сторонние инструменты (expect)
Неустойчиво к ошибкам компонент системы: ошибки могут интерферировать
Найденная уязвимость должна приводить к возникновению дополнительных модульных тестов
Имитаторы и заглушки
Ограничения:
компоненты должны находится в разных библиотеках
невозможно имитировать внутренние объкты классов или функций
имитируемые объкты должны иметь абстрактный интерфейс или быть шаблонным параметром
решение возможно на уровне системы (
LD_PRELOAD
)
Заглушки — константы, частный случай имитаторов
Имитаторы — способны имитировать действия
Плохо автоматизируется
Подходит для нереализованных или недоделанных компонентов системы
Стресс-тесты
Абсолютно произвольные данные
Показывает насколько система устройчива, а не степень её отладки
В большинстве случаев ошибки являются архитектурными
Бенчмарки (benchmark)
Тестирование скорости всей системы или отдельных компонент
Тестирование устройчивости системы под нагрузкой
Определение параметров системы: максимальное количество пользователей, время ожидания и т.д.
Самая простая утилита —
time
Метод понижения нагрузки:
для определения максимальной нагрузки
понижать нагрузку в 2 раза и фиксировать параметры системы
построить кривую параметров от объёма нагрузки
эстраполировать результаты