使用多个物理设备并模拟它们是一个好主意吗?
我的公司的主要目标是将我们的软件与几个品牌的影院投影仪(barco,sony ......),声音处理器,IO控制器(barionet,wago)连接。
有时供应商会为通信提供一个API,有时它是通过套接字完成的,有时它真的是“特定于供应商”
到目前为止,这是我们的方法:
我们正在寻找一种测试代码的一致方法,而不需要真正的设备。而且不浪费时间去编写模拟器。
编辑: 我们谈论4种类型的设备:
答案 0 :(得分:2)
哎呀。我认为这是一个模拟框架的完美场所。只需创建一个界面层,将硬件(或硬件API)与控制它的代码分开...... IProjector,ISoundProcessor等。
一旦将硬件与软件分离并且您不直接依赖于硬件,您就可以使用模拟框架来编写模拟或存根,假装IProjector是真正的硬件。如果您知道HardwareX使用特定值响应某个方法,请捕获它并使用您的模拟框架返回它。
请注意,不需要模拟框架本身。你总是可以按照你的建议创建一个假的,但有时假的太复杂了,因为它们被太多的测试使用了,你的假装中就会出现bug。在这种情况下,模拟框架会出现,您只能定义特定测试中所需的行为......
答案 1 :(得分:1)
正如Brian Genisio所说,这听起来像是嘲笑的完美候选人,而他对嘲讽与假货的争论非常引人注目。我没有使用模拟测试与硬件的交互,但我已经用它们来测试与供应商提供的第三方本机API的接口,这是一个非常相似的用例。一般模式是: - 有一个接口,用于销售一个对象,该对象表示由本机API(或您的硬件设备)产生的输入 - 模拟它以产生测试用例所需的输入 - 声明您的代码以正确的方式处理此输入
这样您就可以测试您的功能,而无需使用实际的硬件(或供应商API,或其他代码等)。模拟对象不仅适用于测试与硬件或第三方api的交互 - 它们可用于各种测试。一旦你开始使用模拟,你会想知道如何在不使用它们的情况下编写代码。
我用Java编写代码,使用JUnit作为我的测试框架,并使用了EasyMock(http://easymock.org)和JMock(http://www.jmock.org)。我更喜欢(现在使用)JMock,但是值得尝试,因为他们的哲学是相当不同的。我也听说过Mockito(http://mockito.org)非常好,但还没有真正用过它。
答案 2 :(得分:0)
将“是”替换为self.Responder.Next()
。将类实例(取决于您的语言)Responder
传递给您的mocker构造函数。 Next
的简单实现是return "yes";
,但您也可以让它返回其他内容,具体取决于它的构造方式。这种技术的实际细节将根据嘲弄者的语言而有所不同。
答案 3 :(得分:0)
不要模拟设备。我曾经嘲笑我的烤面包机,它试图让我的房子着火。风险不值得,伙计。
答案 4 :(得分:0)
一家名为Atomic Object的公司在使用嵌入式设备时有一些很好的报告,说明他们在C中使用Mock Objects。请参阅http://www.atomicobject.com/pages/Papers
上的论文