使用GTEST进行Arduino单元测试

Arduino unit testing using gtest

本文关键字:单元测试 Arduino 进行 GTEST 使用      更新时间:2023-10-16

我一直在玩我购买的一个小arduino机器人定位错误的代码。问题是#include" arduino.h"不是我可以在PC上运行的东西。这是我很难与代码解耦。

我想在我的测试文件夹中构建一个可以在我的PC上运行的测试可执行文件,但仍将大部分功能代码保留在上面的目录中,以便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 for Arduino时的class.h/cpp文件,并且失败了。

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);
}

再次,对此的任何帮助将不胜感激,谢谢您的时间。

发布解决方案更新:这是我必须输入的示例标头:

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

并访问文件到模拟库文件,您需要做的就是:

#include "test/FakeLib.XX"

使用宏。

您可以使用#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 highn");
#endif
}

也有相反的 #ifndef,仅当arduino_version 未定义时,它才包含代码。

现在您可能会问,编译器如何知道是否是Arduino_version?好问题。基于此线程,看起来Arduino将为您定义ARDUINO,因此您可以使用#ifdef ARDUINO。另外,由于您应该对测试的编译方式有更多控制权,因此可以使用#ifdef TEST_VERSION,然后使用-DTEST_VERSION选项编译测试。