如何在性能不佳的i / o下测试应用程序的可靠性

时间:2009-02-18 13:04:38

标签: testing io usability reliability

几乎每个应用程序都可以通过磁盘或网络执行i / o操作。

由于我的应用程序在开发时环境下工作正常,我想确保当Internet连接缓慢或不稳定时,或者当用户尝试从写得不好的CD中读取数据时,它们仍然可以。

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

  • 慢速i / o(打开文件,关闭文件,读写,目录项枚举)
  • 偶尔的i / o错误
  • 偶尔会有“拒绝访问”的回复
  • tcp / ip中的数据包丢失
  • 等...

编辑:

视窗:
如上所述完成工作的最接近的解决方案似乎是全息测试,商业软件(> 900美元)。

Linux操作系统:
现在还没有找到开放式解决方案,但效果相同 可以按照smcameron和krosenvold的规定获得。


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

然而我决定不采用这种方式,但保留我的代码并模拟来自外部的i / o错误。


我现在知道我需要的是'故障注入'。 我认为这是一个常见的生产线部分,有很多我不知道的解决方案。 (顺便说一句,另一个类似的好主意是'模糊测试',感谢Lennart)

在我看来,问题仍然不值900美元。 我将基于钩子(针对win32)实现我自己的开源工具。 当我完成它时,我会更新这篇文章。在3或4周左右回来......

9 个答案:

答案 0 :(得分:3)

您需要的是故障注入测试系统。詹姆斯·惠特克的'How to break software'是一本关于这个主题的好读物,包含一张CD,里面有许多所需的工具。

答案 1 :(得分:1)

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

iptables -I OUTPUT -p tcp --dport 7991 -j DROP

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

答案 2 :(得分:1)

查看“模糊测试”:http://en.wikipedia.org/wiki/Fuzzing

答案 3 :(得分:1)

在编程级别,许多框架将允许您包装IO流类并将调用委托给包装的实例。我会这样做,并在密钥方法中添加几个等待调用(写入字节,关闭流,抛出IO异常等)。您可以使用不同的故障或问题类型编写其中一些,并根据需要使用装饰器模式进行组合。

这应该给你很大的灵活性,可以调整哪些操作会减慢,经常插入“随机”错误等等。

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

答案 4 :(得分:1)

你没有说什么操作系统,但如果它是linux或unix-ish,你可以用一个LD_PRELOAD-able库包装open(),read(),write()或任何库或系统调用等注入缺陷。

沿着这些方向: http://scaryreasoner.wordpress.com/2007/11/17/using-ld_preload-libraries-and-glibc-backtrace-function-for-debugging/

答案 5 :(得分:1)

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

1。网络i / o

我在这里找到了至少两种模拟i / o错误的方法。

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

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

2。文件i / o

我设法通过将驱动器号映射到驻留在虚拟机内的网络共享来将此方案推断到前一个方案。文件i / o会很慢。

存在更便宜的替代方案:设置本地ftp服务器(例如FileZilla),配置速度并使用Novell的NetDrive访问它。

答案 6 :(得分:0)

你想为此设置一个测试实验室。你还在构建什么类型的应用程序?你真的希望应用程序被输入损坏的数据吗?

我知道Microsoft Exchange Server人员试过的一种测试技术是向服务器发送噪音。基本上用看似随机的数据为每个可能的输入提供信息。他们设法以这种方式经常崩溃服务器。

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

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

请注意解码数据的时间和方式。就是这样。

答案 7 :(得分:0)

您需要做的第一件事就是在这些情况下定义“正确”的含义。您只能针对行为的定义进行测试。

测试策略取决于技术。在自动化单元测试的上下文中,我发现在诸如Java的OO语言中使用各种各样的“模拟”或“存根”来传递它是非常有用的。行为不端InputStreams到我使用文件I / O的部分代码。

答案 8 :(得分:0)

对于某些故障注入,请考虑holodeck,如果您可以使用Netem或基于Mini-Maxwell的商业产品访问备用硬件,则可以模拟网络损伤,这是{{3}}比免费贵,但可能更容易使用。