【发布时间】:2022-08-04 20:48:13
【问题描述】:
我正在为一些非开源继承代码开发一些单元测试。现在我刚刚测试了 ceedling 框架,使用自动生成的测试来确保一切正常运行。
当我对没有依赖项的模块运行测试时,一切正常,但是当对具有一堆依赖项的模块之一运行测试时(我必须将其包含为模拟):
#ifdef TEST
#include \"unity.h\"
#include \"conn.h\"
#include \"mock_log.h\"
#include \"mock_memory.h\"
#include \"mock_rxbuffer.h\"
#include \"mock_txbuffer.h\"
void setUp(void)
{
}
void tearDown(void)
{
}
void test_conn_NeedToImplement(void)
{
TEST_IGNORE_MESSAGE(\"Need to Implement conn\");
}
#endif // TEST
Ceedling 在模拟以下函数时遇到错误:
void tx_push (struct txbuffer *tx, const char *format, va_list ap)
错误如下:
Test \'test_conn.c\'
------------------
Generating runner for test_conn.c...
Compiling test_conn_runner.c...
Compiling mock_txbuffer.c...
build/test/mocks/mock_txbuffer.c: In function ‘CMockExpectParameters_tx_push’:
build/test/mocks/mock_txbuffer.c:420:31: warning: ‘sizeof’ on array function parameter ‘ap’ will return size of ‘__va_list_tag *’ [-Wsizeof-array-argument]
sizeof(va_list[sizeof(ap) == sizeof(va_list) ? 1 : -1])); /* add va_list to :treat_as_array if this causes an error */
^
build/test/mocks/mock_txbuffer.c:414:149: note: declared here
void CMockExpectParameters_tx_push(CMOCK_tx_push_CALL_INSTANCE* cmock_call_instance, struct txbuffer* tx, int tx_Depth, const char* format, va_list ap)
^~
build/test/mocks/mock_txbuffer.c:420:24: error: size of unnamed array is negative
sizeof(va_list[sizeof(ap) == sizeof(va_list) ? 1 : -1])); /* add va_list to :treat_as_array if this causes an error */
^
ERROR: Shell command failed.
因此,正如我将 va_list 添加到 :treat_as_array 的消息所建议的那样:
:cmock:
:mock_prefix: mock_
:when_no_prototypes: :warn
:enforce_strict_ordering: TRUE
:plugins:
- :array
- :ignore
- :callback
:treat_as:
uint8: HEX8
uint16: HEX16
uint32: UINT32
int8: INT8
bool: UINT8
:treat_as_array:
- va_list
:includes:
- <assert.h>
- <getopt.h>
- <libgen.h>
- <stdbool.h>
- <stdint.h>
- <stdio.h>
- <stdlib.h>
- <string.h>
这样做之后,我最终得到了一个新错误(在调试中运行 ceedling)形式为:
TypeError:没有将字符串隐式转换为整数
** Invoke test:conn (first_time) ** Invoke test/test_conn.c (first_time, not_needed) ** Execute test:conn ** Invoke test_deps (first_time) ** Invoke directories (first_time) ** Invoke build/test/mocks (first_time, not_needed) ** Invoke build/artifacts (first_time, not_needed) ** Invoke build/test (first_time, not_needed) ** Invoke build/artifacts/test (first_time, not_needed) ** Invoke build/test/runners (first_time, not_needed) ** Invoke build/test/results (first_time, not_needed) ** Invoke build/test/out (first_time, not_needed) ** Invoke build/test/out/asm (first_time, not_needed) ** Invoke build/test/out/c (first_time, not_needed) ** Invoke build/test/cache (first_time, not_needed) ** Invoke build/test/dependencies (first_time, not_needed) ** Invoke build/logs (first_time, not_needed) ** Invoke build/temp (first_time, not_needed) ** Invoke build/test/preprocess/includes (first_time, not_needed) ** Invoke build/test/preprocess/files (first_time, not_needed) ** Invoke build/gcov/out (first_time, not_needed) ** Invoke build/gcov/results (first_time, not_needed) ** Invoke build/gcov/dependencies (first_time, not_needed) ** Invoke build/artifacts/gcov (first_time, not_needed) ** Execute directories ** Execute test_deps Test \'test_conn.c\' ------------------ Verbose: exec(): gcc -E -MM -MG -I\"/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/unity/src\" -I\"/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/src\" -I\"build/test/mocks\" -I\"test\" -I\"test/support\" -I\"src\" -DTEST -DTEST -DGNU_COMPILER \"build/temp/_test_conn.c\" > Shell executed command: \'gcc -E -MM -MG -I\"/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/unity/src\" -I\"/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/src\" -I\"build/test/mocks\" -I\"test\" -I\"test/support\" -I\"src\" -DTEST -DTEST -DGNU_COMPILER \"build/temp/_test_conn.c\"\' > Produced output: _test_conn.o: build/temp/_test_conn.c \\ /var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/unity/src/unity.h \\ /var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/unity/src/unity_internals.h \\ @@@@unity.h src/conn.h @@@@conn.h mock_log.h @@@@mock_log.h \\ mock_memory.h @@@@mock_memory.h mock_rxbuffer.h @@@@mock_rxbuffer.h \\ mock_txbuffer.h @@@@mock_txbuffer.h ** Invoke build/test/preprocess/includes/log.h (first_time, not_needed) ** Invoke src/log.h (first_time, not_needed) Verbose: exec(): gcc -E -I\"/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/unity/src\" -I\"/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/src\" -I\"build/test/mocks\" -I\"test\" -I\"test/support\" -I\"src\" -DTEST -DTEST -DGNU_COMPILER \"src/log.h\" -o \"build/test/preprocess/files/log.h\" > Shell executed command: \'gcc -E -I\"/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/unity/src\" -I\"/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/src\" -I\"build/test/mocks\" -I\"test\" -I\"test/support\" -I\"src\" -DTEST -DTEST -DGNU_COMPILER \"src/log.h\" -o \"build/test/preprocess/files/log.h\"\' ** Invoke build/test/preprocess/includes/memory.h (first_time, not_needed) ** Invoke src/memory.h (first_time, not_needed) Verbose: exec(): gcc -E -I\"/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/unity/src\" -I\"/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/src\" -I\"build/test/mocks\" -I\"test\" -I\"test/support\" -I\"src\" -DTEST -DTEST -DGNU_COMPILER \"src/memory.h\" -o \"build/test/preprocess/files/memory.h\" > Shell executed command: \'gcc -E -I\"/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/unity/src\" -I\"/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/src\" -I\"build/test/mocks\" -I\"test\" -I\"test/support\" -I\"src\" -DTEST -DTEST -DGNU_COMPILER \"src/memory.h\" -o \"build/test/preprocess/files/memory.h\"\' ** Invoke build/test/preprocess/includes/rxbuffer.h (first_time, not_needed) ** Invoke src/rxbuffer.h (first_time, not_needed) Verbose: exec(): gcc -E -I\"/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/unity/src\" -I\"/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/src\" -I\"build/test/mocks\" -I\"test\" -I\"test/support\" -I\"src\" -DTEST -DTEST -DGNU_COMPILER \"src/rxbuffer.h\" -o \"build/test/preprocess/files/rxbuffer.h\" > Shell executed command: \'gcc -E -I\"/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/unity/src\" -I\"/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/src\" -I\"build/test/mocks\" -I\"test\" -I\"test/support\" -I\"src\" -DTEST -DTEST -DGNU_COMPILER \"src/rxbuffer.h\" -o \"build/test/preprocess/files/rxbuffer.h\"\' ** Invoke build/test/preprocess/includes/txbuffer.h (first_time, not_needed) ** Invoke src/txbuffer.h (first_time, not_needed) Verbose: exec(): gcc -E -I\"/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/unity/src\" -I\"/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/src\" -I\"build/test/mocks\" -I\"test\" -I\"test/support\" -I\"src\" -DTEST -DTEST -DGNU_COMPILER \"src/txbuffer.h\" -o \"build/test/preprocess/files/txbuffer.h\" > Shell executed command: \'gcc -E -I\"/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/unity/src\" -I\"/var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/src\" -I\"build/test/mocks\" -I\"test\" -I\"test/support\" -I\"src\" -DTEST -DTEST -DGNU_COMPILER \"src/txbuffer.h\" -o \"build/test/preprocess/files/txbuffer.h\"\' ** Invoke build/test/mocks/mock_log.c (first_time) ** Invoke build/test/cache/log.h (first_time, not_needed) ** Execute build/test/mocks/mock_log.c Creating mock for log... rake aborted! TypeError: no implicit conversion of String into Integer /var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/lib/cmock_header_parser.rb:421:in `block in parse_args\' /var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/lib/cmock_header_parser.rb:411:in `each\' /var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/lib/cmock_header_parser.rb:411:in `parse_args\' /var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/lib/cmock_header_parser.rb:588:in `parse_declaration\' /var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/lib/cmock_header_parser.rb:45:in `block in parse\' /var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/lib/cmock_header_parser.rb:44:in `map\' /var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/lib/cmock_header_parser.rb:44:in `parse\' /var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/lib/cmock.rb:48:in `generate_mock\' /var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/lib/cmock.rb:32:in `block in setup_mocks\' /var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/lib/cmock.rb:31:in `each\' /var/lib/gems/2.5.0/gems/ceedling-0.31.1/vendor/cmock/lib/cmock.rb:31:in `setup_mocks\' /var/lib/gems/2.5.0/gems/ceedling-0.31.1/lib/ceedling/generator.rb:50:in `generate_mock\' /var/lib/gems/2.5.0/gems/ceedling-0.31.1/lib/ceedling/rules_cmock.rake:8:in `block in <top (required)>\' /var/lib/gems/2.5.0/gems/ceedling-0.31.1/lib/ceedling/task_invoker.rb:60:in `block in invoke_test_mocks\' /var/lib/gems/2.5.0/gems/ceedling-0.31.1/lib/ceedling/task_invoker.rb:58:in `invoke_test_mocks\' /var/lib/gems/2.5.0/gems/ceedling-0.31.1/lib/ceedling/preprocessinator.rb:28:in `preprocess_test_and_invoke_test_mocks\' /var/lib/gems/2.5.0/gems/ceedling-0.31.1/lib/ceedling/test_invoker.rb:84:in `block in setup_and_invoke\' /var/lib/gems/2.5.0/gems/ceedling-0.31.1/lib/ceedling/test_invoker.rb:51:in `each\' /var/lib/gems/2.5.0/gems/ceedling-0.31.1/lib/ceedling/test_invoker.rb:51:in `setup_and_invoke\' /var/lib/gems/2.5.0/gems/ceedling-0.31.1/lib/ceedling/rules_tests.rake:70:in `block (2 levels) in <top (required)>\' /var/lib/gems/2.5.0/gems/ceedling-0.31.1/bin/ceedling:345:in `block in <top (required)>\' /var/lib/gems/2.5.0/gems/ceedling-0.31.1/bin/ceedling:332:in `<top (required)>\' /usr/local/bin/ceedling:23:in `load\' /usr/local/bin/ceedling:23:in `<main>\' Tasks: TOP => build/test/mocks/mock_log.c (See full trace by running task with --trace) -------------------- OVERALL TEST SUMMARY -------------------- No tests executed.如果我从
:treat_as_array中删除va_list,我可以成功地测试具有依赖关系的模块,只要它们没有将va_list作为输入的函数。否则即使没有va_list函数,我仍然会收到相同的错误:TypeError:没有将字符串隐式转换为整数
所以在我看来,我将
va_list包含到:treat_as_array的方式可能存在问题?达到这一点,我对尝试什么的想法更少了。我还打开了issue on the github for ceedling 说明这个问题,但我希望从其他可能也遇到这个问题的用户那里得到一些意见。
我的 ceedling 版本如下(Ubuntu 18.04.2):
Ceedling:: 0.31.1 Unity:: 2.5.4 CMock:: 2.5.4 CException:: 1.3.3在堆栈交换中有一个类似的问题,我看到了here,但没有将
va_list添加到:treat_as_array的额外步骤。并且有几个 github 问题谈论缺乏对可变函数的支持:
所以我想我只是想弄清楚这是一个不受支持的功能还是我做错了什么。
任何帮助将不胜感激。
此致, GCT。
标签: c unit-testing embedded cmock ceedling