generatorglukoff 03.11.2012 23:11 Досктоп

Пока вы там срали в уткотреде, я тут нарисовал юнит тестирование своего говна через mock objects.
Короче говоря, в плюсах существует три с половиной способа устроить такое тестирование:
1. на базе интерфейсов — ко всем классам, которые мы хотим подменить, выделяем интерфейс из чисто виртуальных функций и наследуемся от него
2. на базе шаблонов — все классы, которые хотим оттестировать, превращаем в шаблонные и параметризуем его вариантами
3. на базе макросов — делаем подмену кода с использованием макросов
4. через линкер — подменяем объектные файлы

Я использовал последние два + google mock.
Идея такова:
1. во всех мокуемых классах функции в хедере оборачиваем в #if defined(TESTING) && !defined(ИМЯМОДУЛЯ_TESTING) — это позволяет указать, что мы собственно тестируемся и что тестируем.
2. во всех мокуемых неймспейсах с free standing functions рисуем интерфейс, а функции через макрос перебрасываем на вызов текущей подмены. Что-то типа:

namespace XXX
{
void somefunc()
{ TestAdapters::xxxCurrentMock→somefunc(); }
}

это позволяет свернуть глобальное состояние в локальное
3. добавляем различные костыли для глобальных переменных и прочего
4. на уровне CMake выбираем нужные файлы (тестируемый, файл с тестами и файлы с костылями)
5. наслаждаемся

Основной профит в том, что изменения в основном коде оказались незначительными и касались только заголовочных файлов.

Do you really want to delete ?