我参与了一个项目,除其他外,必须控制各种实验室仪器(机器人,读者等......)
大多数这些仪器都是通过基于DCOM的驱动程序,串行端口或通过启动具有各种参数的专有程序来控制的.其中一些程序或驱动程序包括模拟模式,有些则不包括.显然,我的开发计算机无法连接到所有仪器,虽然我可以为驱动程序包含模拟模式的仪器启动虚拟机,但如果没有实际仪器,则无法测试某些内容.
现在,我自己的代码主要不是关于仪器的实际操作,而是关于启动操作,确保一切正常,并在它们之间进行同步.它是用Java编写的,使用各种库与仪器及其驱动程序进行交互.
我想为各种仪器控制模块编写单元测试.但是,因为仪器可以在很多方面失败(其中一些是记录的,其中一些不是),因为代码依赖于这些部分随机输出,我对于如何为这些部分编写单元测试有点迷失.我的代码.我考虑过以下解决方案:
只测试连接的实际仪器,可能是最准确的方法,但它根本不实用(在读卡器中插入板,运行单元测试,移除板,运行单元测试等......),更不用说有潜在危险了,
使用模拟对象来模拟与事物实际通信的部分; 虽然这个肯定更容易实现(和运行),但它可能无法再现所有潜在的失败(如上所述,很多都是无证的,有时会导致不良意外)
虽然我目前正在考虑与后者合作,但我错过了一些东西吗?有一个更好的方法吗?
您的两个要点都是有效的选项,但它们分别代表两种不同的测试.
在非常高的层次上,使用Mock对象(按照你的第二个项目符号点)非常适合单元测试 - 它只是测试你的代码(测试中的系统或SUT),而没有任何其他内容.任何其他依赖项都被模拟出来.然后,您可以编写测试用例以抛出尽可能多的不同错误条件(当然也可以测试"快乐路径").您的错误条件域未记录的事实是不幸的,并且您应该努力尽可能地减少错误.每次使用实际的外部设备遇到新的错误情况时,您应该弄清楚如何通过代码重现它,然后编写另一个新的单元测试,通过模拟框架重新创建该条件.
此外,使用连接的实际仪器(按照您的第一个项目符号点)进行测试对于集成测试来说非常有用 - 它可以更好地测试您的代码以及实际的外部依赖性.
一般来说,单元测试应该很快(理想情况下,在10分钟内编译代码并运行整个单元测试套件.)这意味着如果您编写的任何新代码导致您从单元测试中快速获得反馈任何失败的测试.集成测试本质上可能需要更长时间(例如,如果您的一个外部设备需要1分钟来计算结果或执行任务,并且您正在测试15种不同的输入,那么15分钟就可以了有一小组测试.)你的CI服务器(你应该有一个自动编译和运行所有测试的服务器)应该在提交到源控制存储库时自动触发.它应该编译并运行单元测试作为一步.在完成该部分之后,它应该为您提供反馈(好的或坏的),然后如果单元测试全部通过,它应该自动启动您的集成测试.这假设有一个实际设备连接到您的CI服务器,或者是一个合适的替代品(无论在您的特定环境中是什么意思).
希望有所帮助.