|
|
1
9
在过去,我们就是这样测试和调试设备驱动程序的。调试这样一个系统的最好方法是工程师使用嵌入式系统作为开发系统,一旦达到足够的系统成熟度,就把原来的交叉开发系统拿走! 针对您的情况,我想到了几种方法:
|
|
|
2
7
真正依赖于硬件的代码( 除了在硬件上或硬件的高质量模拟之外,在任何地方都无法真正进行测试。 如果您的驱动程序具有以下组件: 高级 不直接依赖于硬件的功能(例如,以特定格式向硬件发送消息的协议处理程序),如果该部分在代码中完全独立,则可以在基于PC的单元测试框架中单独进行单元测试。 回到最低级别如果它依赖于硬件,那么测试夹具需要包括硬件。您可以制作一个包含硬件、驱动程序和一些测试软件的测试夹具。我认为,主要的事情是让普通产品的应用程序代码脱离测试,并加入一些测试代码。测试代码可以系统地测试所有驱动程序的功能和转角情况(应用程序代码可能没有),也可以在短时间内对驱动程序进行密集的测试(应用程序可能没有)。因此,它比仅仅运行应用程序更有效地使用有限的硬件,并为您提供更好的结果。 如果你能让电脑进入循环,那么电脑可能会帮助测试。例如,如果您正在为嵌入式设备编写串行端口驱动程序,那么您可以:
你可以用以太网驱动程序,Wi-Fi驱动程序做类似的事情。 如果您正在测试存储设备驱动程序,例如EEPROM或闪存芯片,那么PC无法以同样的方式参与其中。在这种情况下,测试线束可以测试各种写入条件(单字节、块…),并使用各种读取条件验证数据完整性。 |
|
|
3
3
就在两个月前,我刚刚完成了这项任务。 让我猜猜: 您可能有向设备讲述低级细节的“代码片段”。您知道这些代码段是有效的,但是您无法覆盖它们,因为它们依赖于设备驱动程序。 同样,单独测试其中的每一行也没有意义。它们永远不会单独运行,您的单元测试最终看起来就像生产代码的镜像。 例如,如果希望启动设备,则需要创建连接,向其传递特定的低级别重置命令,然后初始化参数struct等。 如果您需要添加一个配置,这可能需要您将其脱机,添加配置,然后将其联机。 你不想测试低级的东西。然后,您的单元测试将只反映您 设备在没有任何确认的情况下工作。 这里的关键是创建三项:控制器、抽象和该抽象的适配器实现。在Cpp、Java或C#中,您可以创建基类或接口来表示此抽象。我假设您创建了一个接口。 您可以将代码片段分解为原子操作。例如,在接口中创建名为“开始”和“添加(参数)”的方法。您将代码片段放入设备适配器中。 控制器通过接口作用于适配器。 识别放置在适配器中的代码段中的逻辑片段。然后,您需要确定该逻辑是低级别的(协议处理细节等),还是应该属于控制器的逻辑。 *有一个作用于混凝土适配器的简单测试面板应用程序。这用于确认适配器是否实际工作。当你按下“开始”时,它开始。例如,如果您依次按“脱机”、“传输(192)”和“联机”,则设备会按预期响应。这是您的集成测试。 您不需要对适配器中的详细信息进行单元测试。您可以手动测试它,因为唯一的成功标准是设备如何响应。 但是, 控制器 完全经过单元测试。它只依赖于抽象,而抽象是在测试代码中模拟出来的。因此,您的代码对设备驱动程序没有依赖性,因为不涉及具体的适配器。 然后编写单元测试以确认,例如,方法“Add(1)”实际上在模拟的抽象上调用“gooffline”,然后调用“Transmit(1)”,然后调用“goonline”。 这里的挑战是区分适配器和控制器。什么去哪里?对我来说,首先创建前面提到的测试面板,然后通过它操纵设备。
|
|
|
4
3
首先,当您进行单元测试时,您正在测试一个软件。当您在测试中包括真实设备时,您也在测试该设备。有时,硬件或硬件文档可能存在问题。当你们在设计软件时,若你们已经清楚地描述了每个功能的行为,那个么进行单元测试是非常容易的,例如,考虑功能;
好的,这里您只是测试readMessageTime是否正在做它应该做的事情。您不必测试calculateMessageAddr是否计算正确的结果,或者读取正确的地址。这是其他一些单元测试的责任。。因此,您需要做的是为calculateMessageAddr和read(OS函数)编写存根,并检查它是否使用正确的参数调用函数。如果您不是直接从驱动程序访问内存,则会出现这种情况。你可以在没有任何操作系统或设备的情况下测试任何类型的驱动程序代码。
在这里,do_something和do_something在设备上做一些工作,使其准备好阅读。开发人员总是问自己“如果设备无法永远准备好,我的代码在这里出现死锁怎么办”,他们倾向于在设备上测试这种东西。 嗯,你必须相信设备制造商和技术作者。如果他们说设备将在1-2秒内准备好,您不必担心这一点。如果您的代码在这里失败,您必须向设备制造商报告,您的工作不是找到解决此问题的方法。你明白我的意思了吗?
|
|
|
5
2
我建议进行基于应用程序的测试。即使脚手架很难建造,成本也很高,但这里有很多好处:
就命名而言,这可以称为组件测试。 应用程序可以像目标操作系统一样初始化设备驱动程序,也可以直接使用驱动程序的实习生。前者成本更高,但覆盖范围更广。然后,链接器将告诉哪些函数丢失,存根它们,可能使用 exploding stubs . |
|
|
6
1
词汇
然后,您将退出单元测试。也许你可以用其中一个来代替?
“真实”单元测试的优势
但要取得超越某一点的进展是非常困难的(读作“非常昂贵”),所以
|
|
|
GIZ · 伪设备是否在内核中实现为设备驱动程序? 8 年前 |
|
|
Bakus123 · Cuda-编译本地并运行远程 10 年前 |
|
|
mmk · 将x86驱动程序代码放在环1和环2中而不是0中有什么好处吗? 11 年前 |