Как я могу вручную указать исходные файлы, которые Ceedling не может подобрать?
Я разрабатываю функцию для встроенного приложения и использую Ceedling (который основан на тестовой среде Unity), чтобы протестировать ее. У меня проблема в том, что мне нужно использовать функциональность в исходных файлах C, которые Ceedling не компилирует / не связывает с моими файлами модульного теста.
Согласно документации Ceedling:
Ceedling знает, какие файлы нужно скомпилировать и связать в каждом отдельном исполняемом тестовом файле, используя список #include, содержащийся в каждом тестовом файле. Любые исходные файлы C в сконфигурированных каталогах поиска, которые соответствуют заголовочным файлам, включенным в тестовый файл, будут скомпилированы и связаны с результирующим исполняемым файлом тестового устройства.
Проблема в том, что я включаю заголовочный файл "RTOS.h" в мои модульные тесты, чтобы получить доступ к функциям RTOS embOS, но эти функции определены в "RTOSInit.c" и "os7m_tl__dp.a", и в соответствии с этим Документация Ceedling будет искать "RTOS.c" только тогда, когда он видит #include "RTOS.h"
в коде модульного теста.
То, что я ищу, - это способ вручную указать, что эти дополнительные файлы должны быть скомпилированы и связаны при создании исполняемого файла тестового бегуна. Это кажется очень основным требованием к Ceedling, но я не вижу способа сделать это из документации.
Я также затронул эту проблему на сайте Ceedling Github.
Для справки, мой текущий файл "project.yml" (используемый Ceedling) приведен ниже:
:project:
:use_exceptions: FALSE
:use_test_preprocessor: FALSE
:use_auxiliary_dependencies: TRUE
:build_root: build
:release_build: FALSE
:test_file_prefix: test_
:environment:
- :path:
- 'C:\Program Files (x86)\IAR Systems\Embedded Workbench 6.5\arm\bin'
- 'C:\Program Files (x86)\IAR Systems\Embedded Workbench 6.5\common\bin'
- #{ENV['PATH']}
:extension:
:executable: .out
:paths:
:test:
- +:test/**
- -:test/support
:source:
- src/main/c/**
- src/main/include/**
- src/main/resources/**
:support:
- test/support
:defines:
:commmon: &common_defines []
:test:
- *common_defines
- TEST
:test_preprocess:
- *common_defines
- TEST
:cmock:
:mock_prefix: mock_
:when_no_prototypes: :warn
:enforce_strict_ordering: TRUE
:plugins:
- :ignore
- :callback
:treat_as:
uint8: HEX8
uint16: HEX16
uint32: UINT32
int8: INT8
bool: UINT8
:tools:
:test_compiler:
:executable: iccarm
:name: 'IAR test compiler'
:arguments:
- -D _DLIB_FILE_DESCRIPTOR=1
- --debug
- --endian=little
- --cpu=Cortex-M3
- -e
- --fpu=None
- -Ol
- --preprocess "${3}"
- --dlib_config "C:/Program Files (x86)/IAR Systems/Embedded Workbench 6.5/arm/INC/c/DLib_Config_Normal.h"
- -I"$": COLLECTION_PATHS_TEST_TOOLCHAIN_INCLUDE
- -I"$": COLLECTION_PATHS_TEST_SUPPORT_SOURCE_INCLUDE_VENDOR
- -o "${2}"
- --diag_suppress=Pa050
- '"${1}"'
:test_linker:
:executable: ilinkarm
:name: 'IAR test linker'
:arguments:
- --vfe
- --redirect _Printf=_PrintfFull
- --redirect _Scanf=_ScanfFull
- --semihosting
- --config "C:/Program Files (x86)/IAR Systems/Embedded Workbench 6.5/arm/config/generic_cortex.icf"
- --map "${3}"
- -o "${2}"
- '"${1}"'
:test_fixture:
:executable: cspybat
:name: 'CSpyBat test runner'
:arguments:
- '"C:\Program Files (x86)\IAR Systems\Embedded Workbench 6.5\arm\bin\armproc.dll"'
- '"C:\Program Files (x86)\IAR Systems\Embedded Workbench 6.5\arm\bin\armsim2.dll"'
- '"${1}"'
- --plugin "C:\Program Files (x86)\IAR Systems\Embedded Workbench 6.5\arm\bin\armbat.dll"
- --backend -B
- --endian=little
- --cpu=Cortex-M3
- --fpu=None
- --semihosting
:plugins:
:load_paths:
- vendor/ceedling/plugins
:enabled:
- stdout_pretty_tests_report
- module_generator
...
2 ответа
У меня была такая же проблема при тестировании ОСРВ nOS, и я использовал пустые файлы заголовков, чтобы заставить Ceedling скомпилировать соответствующие исходные файлы. К счастью, в Unity был добавлен новый макрос, который решает проблему. Просто добавьте что-то похожее вверху ваших тестовых файлов:
TEST_FILE("source_file_to_compile.c")
Убедитесь, что вы указали каталог, содержащий файл вproject.yml
источники. Ceedling не выдаст вам никаких ошибок, если не сможет найти указанный файл. Вместо этого он может найти другой файл с тем же именем, но в другом месте (которое уже указано в качестве источника).