Насмешка над стандартной библиотекой C ++ - PullRequest
0 голосов
/ 07 июля 2011

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

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

- Также я не могу ни изменить источник, ни использовать библиотеки насмешек.

Ответы [ 4 ]

1 голос
/ 03 марта 2016

Для таких целей я бы порекомендовал вам Typemock Isolator ++ API, который позволяет имитировать глобальные методы без каких-либо переопределений.Посмотрите, как это просто:

FAKE_GLOBAL(fopen);
WHEN_CALLED(fopen(0,0)).Return(_anotherFile);

И вам даже не нужно менять исходный код.

1 голос
/ 07 июля 2011

Если вы пытаетесь провести тестирование закрытых методов класса в whitebox, возможно, ваш компилятор позволит вам обойти контроль доступа? GCC, по крайней мере, допускает -fno-access-control, который я с большим успехом использовал как для модульных тестов whitebox, так и для самоанализа в структурах данных, то есть коллизии хешей в unordered_{set,map}.

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

1 голос
/ 07 июля 2011

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

Поэтому придумайте пространство имен, назовите его mstd.В вашем смоделированном режиме это будет ваше ложное пространство имен.В немокативном режиме это будет просто псевдоним std.

. Для файлов заголовков вам следует избегать непосредственного включения стандартных заголовков, но использовать слой насмешки.Таким образом, вместо включения <map> вы можете включить <mk-map>.Этот заголовочный файл будет затем выбирать между стандартной библиотекой и вашей версией.Возможно, так:

#ifdef MOCK_MODE
    #include "mock/map.hpp"
#else
    #include <map>
#endif

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

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

0 голосов
/ 07 июля 2011

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

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

...