Убедитесь, что функция C вызывается в C ++ CppUTest - PullRequest
0 голосов
/ 09 октября 2018

У меня есть проект Embedded C / C ++, и я хочу написать для него модульные тесты с CppUTest.Один простой тест, который я хочу сделать, - убедиться, что во время теста вызывается определенная функция C.

Допустим, у меня есть две функции C, определенные в function.h:

void success(void)
{
    // ... Do Something on success
}

void bid_process(void)
{
    bool happy = false;
    // ... processing modifiying 'happy' and setting it to 'true'

    if (happy)
        success(); // Call to success
}

Я хочу протестировать функцию big_process и хочу, чтобы мой тест не прошел, если success не вызывается.

Для этого я написал несколько CppUTests в отдельном тестовом файле test.cpp :

#include <CppUTest/CommandLineTestRunner.h>
#include "CppUTest/TestHarness.h"
#include "CppUTestExt/MockSupport.h"

#ifdef __cplusplus
extern "C"
{
    #include "function.h"
}
#endif
TEST_GROUP(TestGroup)
{
    void teardown()
    {
        mock().clear();
    }
};


TEST(TestGroup, Test_big_process)
{
    mock().expectOneCall("success"); // success should be called by the call to big process
    big_process();
    mock().checkExpectations();
}

Я проверил вручную, что big_process работает нормально и вызывает success, но теперь я хочу, чтобы мой тест сделал это.Но тест не пройден и говорит мне:

 Mock Failure: Expected call did not happen.
    EXPECTED calls that did NOT happen:
        success -> no parameters

Поэтому мой вопрос прост: как обеспечить вызов success во время big_process?

Ответы [ 3 ]

0 голосов
/ 09 октября 2018

Вы правильно устанавливаете макетные ожидания, но не связываете макет с функцией success ().

Это объясняет похожую проблему: https://github.com/cpputest/cpputest/issues/1054

0 голосов
/ 09 октября 2018

Вместо библиотеки-макета cpputest вы можете использовать другую фреймворк-фреймворк, такой как, например, фальшивый фреймворк-функция.См. https://github.com/meekrosoft/fff/blob/master/README.md

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

0 голосов
/ 09 октября 2018

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

void success(void)
{
    mock().actualCall("success");
    ....
}

Для неинвазивного модульного тестирования простого C-кода вместо этого вы можете использовать, например, препроцессор или соединительные швы.За подробностями обращайтесь к великой книге Майкла Фезерса Эффективная работа с устаревшим кодом .

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

...