Всем хорош Cpp Unit?, но есть у него пара недостатков...
Рассмотрим, как определяется набор тестов в Cpp Unit? «прямо из коробки»:
Заголовочный файл:
cpp-файл:
Файл с регистрацией всех тестов:
Довольно многословно и скоро это начинает утомлять. Упростить можно добавлением в проект таких макросов:
Теперь определение набора тестов выглядит так:
Заголовок:
В cpp-файле CPPUNIT_TEST_SUITE_NAMED_REGISTRATION писать больше не надо.
В файле с описанием тестов регистрация теста теперь выглядит так:
Скорее всего, можно упростить больше, но пока достаточно и так.
В Йокселе основной тестовый модуль достиг размера в 11Мб. При этом линковка стала занимать уже вполне заметное время. Не такая уж большая проблема, но «стало интересно»... Проблема оказалась в макросе CPPUNIT_ASSERT. Макрос выглядит следующим образом:
Как видно из кода, макрос выполняет вызов метода failIf структуры Asserter и передает ему два объекта: Message и Source Line?. Конструкторы этих передаваемых объектов определены в заголовочном файле и, поэтому, инлайнятся при вызове. В результате получается, что для каждого использования CPPUNIT_ASSERT генерится очень немаленький объем кода. Для пробы макрос был заменен на такой:
Функция Spread Sheet Tests?::Fail If? выглядит так:
Эта нехитрая замена сразу же привела к уменьшению основного тестового модуля с 11Мб до 8Мб. При этом получено некоторое ускорение проверок. В исходном варианте аргументы Asserter::failIf конструировались даже для случая, когда проверка проходила успешно. В новом варианте они конструируются только при ошибке. Правда, визуального ускорения получено не было – все и так работает достаточно быстро.
Ссылок на эту страницу нет