Куда должны идти модульные тесты в Arduino IDE
У меня есть проект Arduino, файловая структура которого выглядит так
myProject/
myProject.ino
ImportantClass1.hpp
ImportantClass1.cpp
ImportantClass2.hpp
ImportantClass2.cpp
Etc….
Он компилируется и работает нормально. Нет проблем с переносом файлов cpp и hpp в программу ino. Однако, чтобы действительно убедиться в надежности, я хочу создать дополнительные файлы ino для модульного тестирования ImportantClass1 & и т.д. Я сделал файлы importantClass1UnitTest.ino
& importantClass2UnitTest.ino
, однако они не могут находиться в том же каталоге, что и соответствующие исходные файлы, поскольку компилятор arduino требует, чтобы файл ino и каталог имели одинаковое имя.
Тесты запускаются, когда я перемещаю файлы. Но меня это не устраивает, я хочу иметь возможность запускать тесты в любое время с помощью стандартного компилятора arduino без необходимости писать команды копирования файлов.
Если я помещу модульный тест в отдельный каталог отдельно от источника класса и #include
, используя полный путь, он также будет работать. Однако это решение не является переносимым, когда я (или любой соавтор) извлекаю проект из git hub на любом другом компьютере, пути неверны, и он не работает.
Где я ошибаюсь? Как мне это сделать, чтобы не перемещать/копировать файлы, а также не использовать полные пути?
@Hubert B, 👍2
Обсуждение2 ответа
Один из способов сделать это — использовать условные операторы препроцессора. Назовите файл проекта и файлы модульного тестирования с расширениями .cpp
и поместите их во вложенную папку (в моем примере она называется «источники»). Тогда ваш файл .ino
будет использоваться только для указания препроцессору, какой из нескольких "main" файл для начала компиляции:
myProject.ino:
/*
* myProject.ino
* define which "main" CPP file to compile:
*/
#define PRODUCTION
// # определить UNITTEST1
// # определить UNITTEST2
// # определить UNITTEST3
// Компиляция начинается здесь с запрошенного "main" файл:
#if defined PRODUCTION
#include "sources/myProject.cpp"
#elif defined UNITTEST1
#include "sources/unitTest1.cpp"
#elif defined UNITTEST2
#include "sources/unitTest2.cpp"
#elif defined UNITTEST3
#include "sources/unitTest3.cpp"
#else
// Если ничего не определено, скомпилировать для производства
#include "sources/myProject.cpp"
#endif
/* END */
Для компиляции одного из модульных тестов потребуется отредактировать только файл .ino, и потребуется только один файл проекта.
Обновление: " ты пробовал? "
Да, и это работает. Единственное предостережение, которое я хотел бы добавить: не называйте свою подпапку "src" - это похоже на волшебное имя для IDE, и вы получите жалобы на ошибки компиляции (несколько определений), если вы его используете. И дальше, если попробуешь, просто сменой имени папки (на диске и в коде) обратно не вернешься; вам также придется перезапустить IDE.
Я протестировал его с версией 1.8.19 среды IDE.
Учитывая, что два файла, которые я поместил в папку, представляли собой полный скетч Arduino «blink» и полный скетч «Hello, World», но с расширениями .cpp, и что выбор одного или другого, как я показал в своем ответе и компиляция и загрузка дали ожидаемые результаты, после чего, да, я точно могу сказать, что они были скомпилированы. Но не верьте мне на слово; попробуй сам., @JRobert
Извините. да. cpp не был cpp. это был просто включенный файл. он может иметь txt или ino в качестве расширения имени файла., @Juraj
Спасибо за ответ. Я не собираюсь делать это таким образом, хотя. Похоже, мне придется создавать сценарии запуска тестов, которые преодолевают отсутствие поддержки относительных путей, копируя файлы из каталога проекта в каталог модульных тестов и, возможно, запуская модульные тесты с помощью Arduino CLI., @Hubert B
@HubertB, было бы здорово, если бы вы могли поделиться примером своего предполагаемого альтернативного решения в качестве другого ответа здесь., @RowanP
ОК. Обновление, лучше поздно, чем никогда. Чтобы решить эту проблему, я использовал программные ссылки.
Окончательная структура каталогов выглядит следующим образом:
myProject/
.git/
myProject.ino
Class1.hpp
Class1.cpp
Class2.hpp
Class2.cpp
...
UnitTests/TestClass1/TestClass1.ino
UnitTests/TestClass1/Class1.cpp -> ../../Class1.cpp
UnitTests/TestClass1/Class1.h -> ../../Class1.h
...
И основная программа, и все модульные тесты работают нормально при компиляции в компиляторе Arduino, и я хочу протестировать только одну копию файлов классов.
- C++ против языка Arduino?
- ошибка: ожидаемое первичное выражение перед токеном ','
- Ввести идентификатор чипа ESP32 в строковую переменную (новичок в Arduino/C++)
- Передача функции-члена класса в качестве аргумента
- Улучшенное циклическое переключение цветов RGB.
- Какие есть другие IDE для Arduino?
- Несовместимые типы при назначении «uint8_t {aka unsigned char}» на «uint8_t [1] {aka unsigned char [1]}»
- Как преобразовать массив символов в строку в arduino?
Я не думаю, что существует стандартный «способ Arduino» для хранения модульных тестов, и это отличный вопрос, который, надеюсь, поможет выявить лучшие практики. Я бы предложил
#include
_относительный_ (а не _абсолютный_) путь., @Edgar BonetСпасибо @EdgarBonet. Я пробовал относительные пути и не могу заставить их работать. Если путь указан относительно файла unitTest.ino, тогда относительный путь должен начинаться с ../../location источника. Но это не работает для меня. Где относительный путь будет относительно?, @Hubert B
Без рабочей среды я бы использовал «../myProject», если «myProject» находится на том же уровне, что и «importantClass1UnitTest»., @the busybee
@EdgarBonet, Arduino IDE/CLI компилируется и собирается во временной папке. относительные пути не работают., @Juraj
Подтвержденный. Относительные пути не работают., @Hubert B
Можете ли вы использовать [символические ссылки](https://en.wikipedia.org/wiki/Symbolic_link)?, @Edgar Bonet
ХОРОШО. Спасибо @ЭдгарБонет. Нашли способ сделать это на основе сим-ссылок. Ниже напишу ответ..., @Hubert B