Куда должны идти модульные тесты в Arduino IDE

arduino-ide c++ testing

У меня есть проект 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 на любом другом компьютере, пути неверны, и он не работает.

Где я ошибаюсь? Как мне это сделать, чтобы не перемещать/копировать файлы, а также не использовать полные пути?

, 👍2

Обсуждение

Я не думаю, что существует стандартный «способ 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


2 ответа


1

Один из способов сделать это — использовать условные операторы препроцессора. Назовите файл проекта и файлы модульного тестирования с расширениями .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


1

ОК. Обновление, лучше поздно, чем никогда. Чтобы решить эту проблему, я использовал программные ссылки.

Окончательная структура каталогов выглядит следующим образом:

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, и я хочу протестировать только одну копию файлов классов.

,