通过模拟IP套接字、串行端口和共享库来测试应用程序的有效测试策略是什么?

2024-10-16 20:49:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望为C++应用程序编写一些自动化集成测试,使用外部共享库——特别是树莓PI上的WiRIPPI。此库用于读取/写入RPi上的GPIO。我目前在Intel/AMDLinux主机上使用WiringPi-Sim,这只是一组基本存根,只允许在非RPi主机上构建和运行应用程序,我更喜欢在非RPi主机上运行测试。你知道吗

测试中的C++应用程序将少量的TCP连接到其他进程,并从另一个进程接收UDP数据报。它还将一些数据写入串行TTY(通常是外部RS485适配器)。你知道吗

对于测试,我需要检查一些东西,将AuT视为一个黑盒,并尽可能消除对RPi、串行设备、外部进程等的依赖:

  • AuT正确启动并将一组GPIO初始化为特定值。你知道吗
  • AuT在执行期间将一组GPIO更改为特定值。你知道吗
  • AuT响应TCP和UDP套接字上的传入数据。你知道吗
  • AuT在串行TTY上写入和读取特定数据。你知道吗
  • AuT在收到适当的信号(例如SIGINT)时正确关闭,结果在TTY上看到特定的数据,并且GPIO设置为特定的最终值。你知道吗

我目前的想法是使用Python(例如pytest)来实现测试:

  • 可以在Python测试应用程序中创建简单的TCP服务器,假装是AuT可以连接的外部TCP服务器应用程序
  • Python测试应用程序中的一个简单UDP发送器可以将适当的数据发送到AuT上的UDP套接字。你知道吗
  • 可以创建一个假TTY作为串行端口,python测试应用程序可以从中读/写(可能通过socat?),AuT也可以
  • 可以编写一个基于wiringpisim的库或共享对象,允许Python测试应用程序监视和影响GPIO状态(AuT所能看到的)。你知道吗
  • 然后python应用程序可以启动主进程并发送适当的信号来检查行为。你知道吗

我不太确定的是WiringPi“mock”共享对象。我知道它可以用LD_PRELOAD注入AuT进程,但是我不知道如何与来自Python测试应用程序的模拟对象通信。我是否需要使用共享内存或某种IPC来允许AuT中的库实例与Python测试应用程序通信?Python测试应用程序是否可以运行TCP服务器,WiringPi mock是否可以“在幕后”连接以将数据/控制中继到测试应用程序?mock对象能否以某种Python友好的方式与Python集成?你知道吗

模拟的共享对象能否通过UNIX套接字或管道与测试应用程序通信?你知道吗

<>我有C++的AUT的全部源,所以我可以用C++来实现大部分或全部,而不是Python,但是一些方面(例如简单的TCP服务器)在Python中写起来会更快更简单。我也很喜欢它。你知道吗

我想知道是否已经有了这种测试工具的解决方案。它不需要基于Python,但我已经习惯了。有什么想法吗?你知道吗

编辑:另一种思想是提取AUT的核心,并使用C++语言绑定,依赖注入和C++模拟。但是,一个重要的要求是测试构建的应用程序,而不是对应用程序进行源代码级的修改,因为出于安全和审计的原因,在所提供的相同二进制文件上运行这些测试是很重要的。你知道吗


Tags: 数据对象服务器应用程序gpio信号进程mock
1条回答
网友
1楼 · 发布于 2024-10-16 20:49:14

这是一个怎样做的建议。这只是一个想法-我还没有尝试过。你知道吗

首先,Python手册中描述了Python和C之间的交互:https://docs.python.org/3/extending/extending.html。您可以在Python中编写测试环境,然后从Python中的一些测试用例调用,在C++中实现AUT。而且,从这个C++代码中,你可以再调用一些Python代码。你知道吗

因此,可能接近您要查找的内容的是以下调用链:

python-test-case -> AuT -> wiringPi-sim -> python-test-callbacks

python-test-case中,您可以配置相应的python-test-callbacks,使其按照这个特定测试用例的需要进行操作。在这个设置之后,python-test-case将调用AuT,后者依次调用一个或多个wiringPi-sim函数,每个函数都调用其相应的python-test-callback。你知道吗

问题是,目前wiringpisim实现接口的方式非常简单,不支持注入特定行为。例如,digitalRead函数的存根如下:

int digitalRead(int pin) {
    return 1;
}
;

为了使它更有用,您必须扩展它的功能,这样您就可以为digitalRead函数调用一些Python回调,而不是执行return 1,该函数可以从Python测试用例中配置。这将需要修改wiringPi sim或编写自己的。然而,据我所知,wiringpisim只是一小部分代码,所以为您这样做可能是可行的。你知道吗

相关问题 更多 >