-
Тестирование — это та же программа со своим кодом
-
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>
class DwtTest: 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);
}
void SetUp() {}
void TearDown() {}
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 раза и фиксировать параметры системы
-
построить кривую параметров от объёма нагрузки
-
эстраполировать результаты
-