如何在 Linux 上模拟内存 I/O 设备进行单元测试?
我正在为嵌入式部署的一些源代码编写单元测试。
代码正在访问特定地址空间以与芯片通信。
- 我想在 Linux 上对这段代码进行单元测试 (UT)。
- 单元测试必须能够在没有人为干预的情况下运行。
- 我需要以普通用户身份运行 UT。
- 必须测试的代码必须是在目标系统上运行的源代码。
关于如何解决这个问题,我可以从哪里获得灵感?
普通用户能否以某种方式告诉 MMU 必须在特定地址分配特定内存。 或者一个数据 block 必须在特定的内存区域?
据我了解:
sigsegv 无法使用;因为从处理程序返回后,将再次调用相同的内存访问代码并再次失败。 (或者意外地,内存区域实际上可能有有效数据,只是不是我想要的)
谢谢
亨利
最佳答案
首先,让要读取的地址成为代码的注入(inject)依赖,而不是硬编码的依赖。现在您不必担心测试条件下的位置,它可以是您喜欢的任何位置。
然后,您可能还需要注入(inject)一个函数来作为依赖项从魔法地址读取/写入魔法地址,这取决于您正在测试的内容。现在您不必担心它会如何欺骗被测试的代码,使其认为它正在执行 I/O。您可以 stub /模拟/任何硬件 I/O 行为。
在您描述的条件下测试低级代码非常困难,同时还要在非测试模式下保持超高效,因为您不想引入太多间接级别。
不过,“确切的源代码”可以隐藏许多错误,这取决于您如何解释它。例如,您的“依赖项注入(inject)”可以通过宏进行,因此单元源是“相同的”,但是您已经使用偷偷摸摸的 -D
编译器选项完全改变了它的作用。
关于c - 如何模拟内存 I/O 设备以在 Linux 上进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10841410/