Testing 如何在i/o表现不佳的情况下测试应用程序的可靠性

Testing 如何在i/o表现不佳的情况下测试应用程序的可靠性,testing,io,usability,reliability,Testing,Io,Usability,Reliability,几乎每个应用程序都执行i/o操作,无论是使用磁盘还是通过网络 由于我的应用程序在开发时环境下运行良好,我希望确保当Internet连接缓慢或不稳定时,或者当用户试图从写得不好的CD读取数据时,它们仍能正常工作 您建议使用哪些工具来模拟: i/o速度慢(打开文件、关闭文件、读写、目录项枚举) 偶尔的i/o错误 偶尔的“访问被拒绝”响应 tcp/ip协议中的数据包丢失 等等 编辑: 窗口: 完成上述工作最接近的解决方案似乎是holodeck,商业软件(>900美元) Linux: 目前尚未找到

几乎每个应用程序都执行i/o操作,无论是使用磁盘还是通过网络

由于我的应用程序在开发时环境下运行良好,我希望确保当Internet连接缓慢或不稳定时,或者当用户试图从写得不好的CD读取数据时,它们仍能正常工作

您建议使用哪些工具来模拟:

  • i/o速度慢(打开文件、关闭文件、读写、目录项枚举)
  • 偶尔的i/o错误
  • 偶尔的“访问被拒绝”响应
  • tcp/ip协议中的数据包丢失
  • 等等

编辑:

窗口:
完成上述工作最接近的解决方案似乎是holodeck,商业软件(>900美元)

Linux:
目前尚未找到开放式解决方案,但效果相同 可按照smcameron和krosenvold的规定实现


装饰图案是个好主意。 它需要包装我的i/o类,但会产生一个测试框架。 剩下的唯一未经测试的代码将在第三方库中

但我决定不这样做,而是让代码保持原样,从外部模拟I/o错误


我现在知道我需要的是“故障注入”。 我以为这是一个普通的生产线部件,有很多我不知道的解决方案。 (顺便说一下,另一个类似的好主意是“模糊测试”,多亏了Lennart)

在我看来,这个问题仍然不值900美元。 我将基于hook(针对win32)实现我自己的开源工具。
我完成后会更新这篇文章。大约3或4周后回来…

您需要的是一个故障注入测试系统。James Whittaker's是这方面的优秀读物,其中包括一张CD,其中包含了许多所需的工具。

您需要为此设置一个测试实验室。您正在构建什么类型的应用程序?您真的希望应用程序收到损坏的数据吗

据我所知,人们尝试的Microsoft Exchange Server测试技术向服务器发送噪音。基本上是用看似随机的数据输入每一个可能的输入。他们经常以这种方式使服务器崩溃

但是,如果您不能信任尚未签名的输入,则一般规则适用。跟踪每个可能不可信的操作(数据损坏的结果),您应该能够优雅地处理大多数问题

只需在随机输入上测试您的应用程序行为,这将捕获大多数问题,但您永远无法完全保护自己不受损坏数据的影响。这是不可能的,因为数据可能是应用程序内部传递的某些内部缓冲区的一部分


请注意何时以及如何解码数据。这就是全部。

如果你在linux上,你可以用iptables做很多魔术

iptables-I输出-p tcp--dport 7991-j丢弃


也可以模拟上/下连接。有很多教程。

查看“模糊测试”:

在这些情况下,您需要做的第一件事是定义“正确”的含义。您只能根据预期行为的定义进行测试


测试策略将取决于技术。在自动化单元测试的环境中,我发现在Java等OO语言中,使用各种各样的“模拟”或“存根”非常有用例如,为了在编程级别将行为不端的InputStreams传递给使用文件I/O的代码部分,许多框架将允许您包装IO流类并将调用委托给包装的实例。我会这样做,并在关键方法中添加几个等待调用(写入字节、关闭流、抛出IO异常等)。您可以使用不同的失败或问题类型编写其中的一些,并根据需要使用decorator模式进行组合

这将为您提供相当大的灵活性,可以调整哪些操作会变慢,每隔一段时间插入“随机”错误等等


另一个优点是,您可以使用与软件相同的代码开发它,这样维护就不需要任何新技能。

考虑一些故障注入,如果您可以访问备用硬件,您可以使用或基于它的商业产品模拟网络损坏,这比免费的要贵得多,但可能更容易使用。

您不需要说明什么操作系统,但如果是linux或unix ish,您可以使用LD_预加载库来插入故障,将open()、read()、write()或任何库或系统调用等包装起来

按照这些思路:

我没有像我最初认为的那样编写自己的文件系统过滤器,因为有一个更简单的解决方案

1.网络i/o 我在这里找到了至少两种模拟I/o错误的方法

a) 运行虚拟机(如vmware)可以配置带宽和数据包丢失率。Vmware支持机上调试

b) 在本地计算机上运行代理并通过隧道传输所有流量。对于upd/tcp通信,可以使用代理(例如widecap)

2.文件i/o 通过将驱动器号映射到驻留在虚拟机内部的网络共享,我成功地将此场景推断为上一个场景。文件i/o速度将很慢

还有一种更便宜的选择:设置本地ftp服务器(例如FileZilla),配置速度并使用Novell的NetDrive访问