嵌入式软件的开发过程始终落后于Web开发的过程。在查看单元测试,自动构建和代码分析时,流行工具有很多限制。

从经验上,我已经放弃了Arduino IDE,转而将PlatformIO与VS Code一起使用,因为就CI而言提供了改进的依赖项安装和构建配置自动化。

问题是哪些工具和过程已经存在,哪些可以重新使用以在Arduino框架内使用,以实现与Web开发一样的CI。

Meta:下一个最相关的堆栈交换组将是IoT,但没有任何一篇文章提到持续集成

评论

也有arduino.stackexchange.com,但是我在这里很好。 arduino.stackexchange.com/questions/8058/…似乎是一个类似的问题。

这个问题涵盖了基础知识,但是我希望对目标代码进行单元测试,并从valgrind一直到CD进行一些分析。

#1 楼

由于无法使用CI系统完成对IoT设备的“部署”,尤其是批量部署。然后,CI系统的目的主要是确保它可以正常运行。

这意味着您主要希望使用CI运行一些测试。对于单元测试和集成测试,绝对都可以进行自动化测试。

单元测试最重要的事情通常是运行时间很短,反馈回路也很短。对于大型代码库,如果可能的话,可以使用主机的本机编译器编译部分代码并在其中运行单元测试-这是一个不错的选择。如果需要,还可以交叉编译到目标平台,并使用某些模拟器运行单元测试以达到必要的速度。所有这些都可能在CI“构建+测试”作业期间发生。如果正确完成,为目标编译并在目标上运行单元测试会非常缓慢,但也可以完成-只要确保仅刷新最小的代码段,并通过它处理过的Serial报告即可

对于集成测试,如果可能的话,将代码安装在实际设备上,并使用串行接口与该设备进行一些聊天-您可以确保该代码在目标设备上实际可用。如果由于某种原因代码失败或无法正常工作,可能会消耗过多的电源和/或重新启动,则集成测试将抓住这一点。您还可以让另一台测试设备通过串行接口执行测量并向CI作业报告。可以使用Arduino或其他ESP在执行代码部分的过程中测量电压和/或安培数,并根据已知的良好值进行检查。您不希望设备在深度睡眠模式下产生400mA的电流,例如,使用“测试线束”即可轻松进行测试。

所有这些单元测试和集成测试都可以在CI服务器上完全自动触发。自然,您可能会在内部运行此“服务器”,而不依赖可能支持或可能不支持最新集成测试的云解决方案。

使用硬件,冒烟测试更“真实” ,因为您实际上可以连接设备并看到魔烟冒出来。通常,您甚至不需要在代码烧录之前就运行代码,因为问题通常出在硬件上。如果您具有良好的测试工具,可以通过对其进行测试来检查设备是否工作正常,则可以使用相同的测试工具在以后生产设备的工厂中进行质量控制。关于制作这些测试台的信息很多。例如:https://www.sparkfun.com/tutorials/138。

评论


感谢您涵盖难题的硬件和软件方面。关于整个IO测试方面的链接是有用的

–莫里茨
18年1月10日在16:30

#2 楼

从您的评论中


我希望对目标代码进行单元测试,从valgrind到CD一直进行一些分析


提到的Arduino StackExchange问​​题的答案,解决了其中的一些问题。但是,自从写出答案以来,我已经为arduino_ci添加了一些内存检查功能[其中,全部披露,我是作者]。运行单元测试时出现的各种内存问题:

==2284==ERROR: AddressSanitizer: heap-use-after-free on address 0x603000000280 at pc 
0x0001032b987e bp 0x7ffeec94c0b0 sp 0x7ffeec94c0a8
READ of size 1 at 0x603000000280 thread T0
    #0 0x1032b987d in Adafruit_WS2801::show() Adafruit_WS2801.cpp:203
    #1 0x1032b84b1 in Strip::init(unsigned char, unsigned char) Strip.cpp:10
    #2 0x1032baaff in test_set_strip_values::task() strip.cpp:10
    #3 0x1032bd900 in Test::test() ArduinoUnitTests.h:165
    #4 0x1032bcfd4 in Test::run(Test::ReporterTAP*) ArduinoUnitTests.h:137
    #5 0x1032bcb79 in Test::run_and_report(int, char**) ArduinoUnitTests.h:155
    #6 0x1032bcab8 in main strip.cpp:43
    #7 0x7fff769d0114 in start (libdyld.dylib:x86_64+0x1114)


pull请求中的更多上下文可解决此问题