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