Общее модульное тестирование: возможно ли имитировать собственные функции? (ceedling/CMock)

Можно ли в принципе имитировать функции тестируемого файла?

Например, я хочу протестировать файл self_test.c, состоящий из этих функций:

#include "self_test.h"

uint8_t function_1(uint8_t argument)
{
    return function_2(argument);
}

uint8_t function_2(uint8_t argument)
{
    return (argument+1);
}

с тестовым файлом, который в основном выглядит так:

#include "mock_self_test.h"

void test_function_1(void)
{
    uint8_t input_value = 8;
    stest_function_2_ExpectAndReturn(input_value, 10);
    uint8_t output_value = function_1(input_value);
    TEST_ASSERT_EQUAL_UINT8(10, output_value);
}

и для завершения файл self_test.h:

uint8_t function_1(uint8_t argument);
uint8_t function_2(uint8_t argument);

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

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

Выход Ceedling:

[==========] Running 1 tests from 1 test cases.
[----------] Global test environment set-up.
[----------] 1 tests from test_self_test.c
[ RUN      ] test_self_test.c.test_function_1
test_self_test.c(22): error: Function function_1.  Called more times than expected.
 Actual:   FALSE
 Expected: TRUE
[  FAILED  ] test_self_test.c.test_function_1 (0 ms)
[----------] 1 tests from test_self_test.c (0 ms total)

1 ответ

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

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

Очевидно, у тестируемого проекта плохой дизайн программного обеспечения.;-)

Другие вопросы по тегам