模拟框架模拟各种物理设备的相关性和好处

时间:2009-05-11 16:36:22

标签: mocking testing

使用多个物理设备并模拟它们是一个好主意吗?

我的公司的主要目标是将我们的软件与几个品牌的影院投影仪(barco,sony ......),声音处理器,IO控制器(barionet,wago)连接。

有时供应商会为通信提供一个API,有时它是通过套接字完成的,有时它真的是“特定于供应商”

到目前为止,这是我们的方法:

  • - 如果这很容易:写一个假的“devicexxxMock”classe,听取命令,并在每个问题回答“是”
  • - 使用ethereal或Hercule
  • - 如果真的需要:编写模拟器(与第一种方法相同,但回答是或否,取决于我们想要测试的内容)
  • 我们正在寻找一种测试代码的一致方法,而不需要真正的设备。而且不浪费时间去编写模拟器。

    编辑: 我们谈论4种类型的设备:

  • 我们不得不谈论的大多数设备在套接字中以字节数组的形式回答。
  • 一些使用 SNMP
  • 一些是启用HTTP的(http://ip/commandToExecute
  • 有些人使用Java编写API
  • 5 个答案:

    答案 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

    上的论文