2

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

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

你会推荐什么工具来模拟:

  • 慢速 i/o(打开文件、关闭文件、读写、目录项枚举)
  • 偶尔的 i/o 错误
  • 偶尔的“拒绝访问”响应
  • tcp/ip 丢包
  • ETC...

编辑:

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

Linux:
目前还没有找到开放的解决方案,但可以达到smcameron和krosenvold指定的相同效果。


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

然而我决定不走这条路,而是让我的代码保持原样并从外部模拟 i/o 错误。


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

在我看来,这个问题仍然不值 900 美元。我将实现我自己的基于 hooks 的开源工具(针对 win32)。完成后我会更新这篇文章。三四个星期后回来...

4

9 回答 9

3

您需要的是一个故障注入测试系统。James Whittaker 的“如何破解软件”是关于这个主题的好读物,其中包括一张包含许多所需工具的 CD。

于 2009-02-18T13:15:25.430 回答
1

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

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

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

于 2009-02-18T13:16:27.863 回答
1

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

于 2009-02-18T13:18:23.037 回答
1

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

这应该会给你很大的灵活性,可以调整哪些操作会变慢,每隔一段时间插入“随机”错误等等。

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

于 2009-02-18T13:19:20.353 回答
1

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

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

于 2009-02-19T06:09:06.057 回答
1

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

1. 网络输入/输出

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

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

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

2.文件输入/输出

通过将驱动器号映射到驻留在虚拟机内部的网络共享,我设法将这种情况推导出到前一种情况。文件 i/o 会很慢。

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

于 2009-02-26T15:10:31.317 回答
0

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

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

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

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

注意解码数据的时间和方式。就这些。

于 2009-02-18T13:15:46.727 回答
0

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

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

于 2009-02-18T13:19:07.780 回答
0

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

于 2009-02-19T05:50:20.750 回答