Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用gtest进行Arduino单元测试_C++_Arduino_Googletest - Fatal编程技术网

C++ 使用gtest进行Arduino单元测试

C++ 使用gtest进行Arduino单元测试,c++,arduino,googletest,C++,Arduino,Googletest,我一直在玩我买的一个小Arduino机器人,发现我可能放在那里的代码中有几个bug,哈哈,我想对代码应用gtest来定位bug。问题是包含Arduino。h不是我可以在我的PC上运行的东西。我很难从代码中分离出来 我想在我的测试文件夹中构建一个测试可执行文件,它可以在我的PC上运行,但仍将大部分功能代码保留在上面的目录中,这样Arduino IDE也可以构建。任何帮助都将不胜感激 结构: <Folder> -ArduinoBuild.ino -Class.h -Class.cpp -

我一直在玩我买的一个小Arduino机器人,发现我可能放在那里的代码中有几个bug,哈哈,我想对代码应用gtest来定位bug。问题是包含Arduino。h不是我可以在我的PC上运行的东西。我很难从代码中分离出来

我想在我的测试文件夹中构建一个测试可执行文件,它可以在我的PC上运行,但仍将大部分功能代码保留在上面的目录中,这样Arduino IDE也可以构建。任何帮助都将不胜感激

结构:

<Folder>
-ArduinoBuild.ino
-Class.h
-Class.cpp
-<test folder>
 --test.cpp
 --CMakeList.txt
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);
}
使用宏

您可以使用ifdef有选择地包含代码。。。恩迪夫。例如:

#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_版本的情况下包含代码


现在您可能会问,编译器如何知道它是否是ARDUINO_版本?好问题。基于线程,看起来Arduino将为您定义Arduino,所以您可以使用ifdef Arduino。或者,由于您应该对测试的编译方式有更多的控制,因此可以使用ifdef TEST_版本,然后使用-DTEST_版本选项编译测试。

Perfect!非常感谢。我不知道ARDUINO_版本的存在。我会补充我对这个问题的解答,这样也许它能帮助下一个问题。@Saero它没有。这就是一个例子。但是ARDUINO可能存在。ARDUINO存在。本周末开始构建单元测试,发现了几个bug。谢谢
#ifndef ARDUINO 
#include<cmath>                                                                                          
#define floor std::round                                                                                 
void delay(int i){} 
#endif           
#include "test/FakeLib.XX"
#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
}