Используя друга класс по сравнению с добавляющими средствами доступа для поблочного тестирования в C++?

Идея Jeremy Ruten использовать символьную ссылку инициировала мысль, которая не пересекла никакой другой ответ. Используйте:

CDPATH=:$HOME/projects

ведущее двоеточие важно; это означает что, если будет каталог 'dir' в текущем каталоге, то' cd dir' изменится на это, а не остановки где-то в другом месте. С набором значений как показано, можно сделать:

cd java

и, если не будет никакого подкаталога, названного Java в текущем каталоге, то это возьмет Вас непосредственно к $HOME/projects/java - никакие псевдонимы, никакие сценарии, никакие сомнительные должностные лица или отметит точкой команды.

Мой $HOME является/Users/jleffler; мой $CDPATH:

:/Users/jleffler:/Users/jleffler/mail:/Users/jleffler/src:/Users/jleffler/src/perl:/Users/jleffler/src/sqltools:/Users/jleffler/lib:/Users/jleffler/doc:/Users/jleffler/work
11
задан bias 19 July 2009 в 06:35
поделиться

5 ответов

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

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

И как вы правильно сказали, загромождение общедоступной поверхности класса неиспользуемым материалом также нежелательно по своим причинам.

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

вернемся к моему предыдущему биту о деталях реализации.

И, как вы правильно сказали, загромождение общедоступной поверхности класса неиспользуемым материалом также нежелательно по своим причинам.

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

вернемся к моему предыдущему биту о деталях реализации.

И, как вы правильно сказали, загромождение общедоступной поверхности класса неиспользуемым материалом также нежелательно по своим причинам.

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

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

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

12
ответ дан 3 December 2019 в 04:14
поделиться

Я не согласен с принятым ответом и вместо этого рекомендую использовать дружественный класс.

Часть состояния, которое вы тестируете, вероятно, зависит от реализации вашего класса; вы тестируете детали, о которых другой код обычно не знает, о которых не заботится и на которые не следует полагаться. Открытые функции доступа делают эти детали реализации частью интерфейса класса. Если внутреннее состояние, которое вы тестируете, не является частью предполагаемого интерфейса, оно не должно быть видно через общедоступные функции. С точки зрения пуриста вы застряли между двумя неправильными ответами, поскольку классы друзей также технически являются частью общедоступного интерфейса. На мой взгляд, возникает вопрос: какой вариант с меньшей вероятностью приведет к неправильному выбору кода в будущем? Использование набора общедоступных функций доступа, зависящих от реализации, будет непреднамеренно стимулировать концептуальную модель класса, зависящую от реализации, что приведет к использованию класса в зависимости от реализации. Единственный дружественный класс, правильно названный и задокументированный, менее подвержен злоупотреблениям.

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

9
ответ дан 3 December 2019 в 04:14
поделиться

Я рекомендую использовать средства доступа, а не разрешать доступ через общедоступных членов или классов друзей.

Я не знаю Не думаю, что использование класса друзей на самом деле приносит вам какие-то преимущества и может значительно ухудшить вашу жизнь в будущем. Если ваш код будет использоваться в течение долгого времени, есть большая вероятность, что его можно будет использовать способами, о которых вы не ожидаете. Сейчас функции доступа можно использовать только для тестирования, но кто знает, что будет в будущем? Использование средств доступа вместо прямого доступа к переменным дает вам гораздо больше гибкости и имеет очень низкую стоимость.

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

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

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

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

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

Выработка хороших привычек - важный навык программиста.

Выработка хороших привычек - важный навык программиста.

1
ответ дан 3 December 2019 в 04:14
поделиться

Как насчет того, чтобы сделать внутреннее состояние «защищенным»? А затем выполните unittest с использованием производного класса.

0
ответ дан 3 December 2019 в 04:14
поделиться

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

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

Мое предпочтительное решение для этого - предоставить защищенный аксессор функции для четкого общения с классом ' s пользователям, что они не являются частью общедоступного интерфейса. Затем ваши тесты создадут минимальный производный класс оригинала, который будет содержать заглушки вызова для родительских функций, но также сделает доступными методы доступа, чтобы вы могли использовать их в тестовых примерах.

0
ответ дан 3 December 2019 в 04:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: