Эффект избыточных функций тестирования внутри класса C++

63
5

При проектировании функций внутри класса C++ я часто помню об этом. Поэтому, когда я заканчиваю всех функционалистов класса, очень часто в класс добавляются несколько функций, которые используются только для целей тестирования. Возьмем следующий пример:

class SimpleClass
{
public:
int a;
int b;
void fun1();
void fun2();
void testIntermediateResult();
private:
void _fun1();
void _fun2();

};

В этой функции testIntermediateResult требуется только для целей тестирования. Является ли хорошая практика просто оставить функцию внутри класса или я должен сделать что-то вроде этого:

 class SimpleClass
{
public:
int a;
int b;
void fun1();
void fun2();
#ifdef TESTING
void testIntermediateResult();
#endif
private:
void _fun1();
void _fun2();

};

Философия здесь заключается в том, когда этот класс завершил тестирование и будет предоставлен клиентам, тогда будет определено TESTING, и эта функция не будет находиться внутри класса. Поэтому мой вопрос: действительно ли нужно удалить функцию тестирования, когда класс предоставляется клиенту? Предположим, что клиент не будет использовать функцию тестирования, каков эффект добавления нескольких избыточных функций тестирования внутри класса? Благодарю.

спросил(а) 2021-01-25T18:17:54+03:00 4 месяца, 2 недели назад
1
Решение
88

Я предполагаю, что ваш клиент не будет участвовать в тестировании класса, который вы передаете. Я бы не хотел добавлять тестовые функции непосредственно в сам класс, так как есть вероятность, что они могут нарушить поведение класса. Что касается клиента, я бы предпочел не давать им что-то с функцией тестирования, поскольку:

    Это не нужно - это не их задача проверить его. Они могут решить попытаться использовать его - кто знает, что тогда произойдет?

Это просто проще, если они этого не видят. Что касается использования препроцессора, это может быть сопряжено с проблемами, особенно если у вас есть атрибуты, которые необходимо охранять одинаково. Если какой-либо из них пропущен или ваш макрос переопределен в процессе сборки клиентом, тогда вы можете получить сбои во время выполнения из-за несоответствий размера класса и т.д.

Я бы предпочел иметь один-к-одному внешний класс для тестирования ваших классов, которые можно будет выполнять. Что-то вроде TestSimpleClass который выполняет тестирование. Для такого подхода есть ряд преимуществ:

Он полностью отделен от вашего кода и не встроен в него, поэтому вы не раздуваете код или не вызываете никаких потенциальных проблем с ним. Он собирается проверить ваш интерфейс класса так, как его видит клиент (т.е. Тестирование черного ящика) Поскольку он отдельный, вам не нужно давать его своему клиенту - им никогда не нужно об этом знать.

Если вы действительно хотите протестировать внутренности класса, вы всегда можете сделать свой тестовый класс другом вашего поставляемого класса. Это только одна строка в классе поставки, и вам все равно не нужно отправлять ваши тестовые классы или библиотеки.

ответил(а) 2021-01-25T18:17:54+03:00 4 месяца, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема