使用gtest

时间:2019-03-05 04:12:31

标签: c++ arduino googletest

我一直在玩我购买的一个小型Arduino机器人,发现代码中有几个错误在运行(我可能已经把它们放在哈哈了),并想将gtest应用于代码中以查找错误)。问题是#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文件,以期在为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);
}

再次感谢您的帮助。

POST SOLUTION更新: 这是我必须在父文件夹中的脚本中输入的内容的示例标头:

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

要访问文件以模仿库文件,您需要做的是:

#include "test/FakeLib.XX"

1 个答案:

答案 0 :(得分:0)

使用宏。

您可以使用#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?好问题。基于this线程,Arduino似乎将为您定义ARDUINO,因此您可以使用#ifdef ARDUINO。另外,由于应该对测试的编译方式有更多的控制,因此可以使用#ifdef TEST_VERSION,然后使用-DTEST_VERSION选项来编译测试。