gpt4 book ai didi

c++ - 使用 gtest 进行 Arduino 单元测试

转载 作者:行者123 更新时间:2023-11-28 04:23:10 25 4
gpt4 key购买 nike

我一直在玩我购买的一个小型 Arduino 机器人,发现代码中有几个错误(我可能已经放在那里了哈哈),我想对代码应用 gtest 来定位错误(s ).问题是#include“Arduino.h”不是我可以在我的电脑上运行的东西。这是我很难从我的代码中分离出来的东西。

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

结构:

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

这就是问题开始的地方,Arduino.h被引入构建

类.h

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

public:
int Some_Attribute = 0;

void member_function();

};
#endif

类.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 文件,但失败了。

测试.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);
}

再次,我们将不胜感激,感谢您抽出宝贵时间。

发布解决方案更新:这是我必须在父文件夹中的脚本中输入的示例 header :

#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 high\n");
#endif
}

还有 #ifndef 做相反的事情,它只包含代码如果 ARDUINO_VERSION 没有定义。

现在您可能会问,编译器如何知道它是否是 ARDUINO_VERSION?好问题。基于this看起来 Arduino 会为您定义 ARDUINO,因此您可以使用 #ifdef ARDUINO。或者,由于您应该更好地控制测试的编译方式,您可以使用 #ifdef TEST_VERSION,然后使用 -DTEST_VERSION 选项编译测试。

关于c++ - 使用 gtest 进行 Arduino 单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54995265/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com