Модульное тестирование Arduino с использованием gtest - PullRequest
0 голосов
/ 05 марта 2019

Я играл с маленьким роботом Arduino, который я купил, и обнаружил, что в коде бегают несколько ошибок (которые я, возможно, разместил там, ха-ха), и хотел применить gtest к коду, чтобы найти ошибку (ы).).Проблема в том, что #include «Arduino.h» не может быть запущен на моем ПК.И это то, что мне трудно отделить от моего кода.

Я хотел бы создать тестовый исполняемый файл в моей тестовой папке, который может работать на моем ПК, но при этом хранить большую часть функционального кода в указанном выше каталоге, чтобы Arduino IDE также могла собираться.Любая помощь будет принята с благодарностью.

Структура:

<Folder>
-ArduinoBuild.ino
-Class.h
-Class.cpp
-<test folder>
 --test.cpp
 --CMakeList.txt

Здесь начинается проблема, Arduino.h вводится в сборку

Class.h

#ifndef CLASS_H_
#define CLASS_H_
#include "Arduino.h"
class Class{

  public:
    int Some_Attribute = 0;

  void member_function();

};
#endif 

Class.cpp

#include "Class.h"
void Class::member_function(){
  Some_Attribute = Some_ArduinoFunc(this->Some_Attribute);
}

Теперь, если бы я мог вытащить Arduino.h из моей сборки, я мог бы поместить фиктивные функции в свой тестовый скрипт, чтобы заполнить пробел, но я бы хотел сохранить Arduino.h где-нибудь впроцесс сборки, поэтому мне не нужно добавлять его каждый раз, когда я хочу собрать для своего Arduino.Я пробовал несколько вещей, одна из которых - перемещение файла #include "Arduino.h" в файл .ino в надежде, что он будет передан в файл Class.h / cpp при сборке для Arduino, и это не удалось.

test.cpp

// Class_test.cpp
#include <gtest/gtest.h>
#include "../Class.cpp"
TEST(buildbin, member_function) {
  Class car;
  car.member_function(1);
  ASSERT_EQ(1, car.Some_Attribute);
}

Опять же, любая помощь с этим будет принята с благодарностью, спасибо за ваше время.

POST SOLUTION Обновления: Вот пример заголовкак тому, что я должен был ввести в сценарии в родительской папке:

#ifndef ARDUINO 
#include<cmath>                                                                                          
#define floor std::round                                                                                 
void delay(int i){} 
#endif           

и получить доступ к файлам для имитации файлов библиотеки, все, что вам нужно сделать, это:

#include "test/FakeLib.XX"

1 Ответ

0 голосов
/ 05 марта 2019

Использовать макрос.

Вы можете выборочно включать код, используя #ifdef ... #endif.Пример:

#ifdef ARDUINO_VERSION
#include "Arduino.h"
#endif

void setup() {
    // no setup
}

void loop() {
#ifdef ARDUINO_VERSION
    digitalWrite(1, HIGH);
#else
    printf("Setting pin 1 high\n");
#endif
}

Также есть #ifndef, который делает обратное, он включает код, только если ARDUINO_VERSION не определен .

Теперь вы, вероятно,Спрашивает, как компилятор узнает, ARDUINO_VERSION это или нет?Хороший вопрос.На основе этого потока похоже, что Arduino определит для вас ARDUINO, поэтому вы можете использовать #ifdef ARDUINO.В качестве альтернативы, поскольку вы должны лучше контролировать компиляцию тестов, вы можете использовать #ifdef TEST_VERSION и затем компилировать свои тесты с опцией -DTEST_VERSION.

...