通用单元测试:可以模拟自我功能吗? (上限/ CMock)

时间:2019-09-25 09:55:16

标签: c unit-testing cmock ceedling

原则上可以模拟待测试文件的功能吗?

例如我要测试包含以下功能的文件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_2测试function_1。 而且我正在处理遗留代码,因此不幸的是,不能使用更好的测试界面重写所有内容。

关闭输出:

[==========] 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 个答案:

答案 0 :(得分:0)

否,您不能模拟从同一编译单元调用的函数。大多数编译器不会引用被调用函数的符号,而是直接(可重定位)地址或所生成机器代码中的偏移量。他们甚至可以在可能的情况下优化通话。

您可以将源文件切成较小的文件,这也需要大量工作。您可以尝试通过脚本将其自动化。

显然,要测试的项目的软件设计错误。 ;-)