c - 一般单元测试:可以模拟自我功能吗?(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_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)
解决方案
不,您不能模拟从同一编译单元调用的函数。大多数编译器不会引用被调用函数的符号,而是将直接(可重定位)地址或偏移量放入生成的机器代码中。如果可能的话,他们甚至可以优化呼叫。
您可以将源文件切割成更小的文件,这也是一项繁重的工作。您可以尝试通过脚本自动执行此操作。
显然,要测试的项目有一个糟糕的软件设计。;-)
推荐阅读
- git - 在 Jenkins 管道结帐中禁用更改日志
- java - re.findall 从 python 到 Java 匹配、模式
- c# - OwnerDrawn时如何在组合框中显示选定的项目?
- c++ - 为什么要声明复制构造函数?
- javascript - 如何在某个父 DOM 元素的 html 字符串中包含用户输入?
- python - 当我尝试使用 python 脚本将文件上传到 GCP 时出现错误
- spring-boot - 考虑到异步设计基于弹簧的高吞吐量 Web 服务的标准方法是什么
- vue.js - 动态决定何时使用 vue router
- angular6 - 我想根据角色限制路由访问
- angular - Angular Universal Bundle 继续加载空白页