测试容错代码

Rob*_*ert 5 testing fault-tolerance

我目前正在研究服务器应用程序,我们已同意尝试并维持一定的服务水平.我们要保证的服务级别是:如果服务器接受了请求,并且服务器向客户端发送确认,我们要保证请求将发生,即使服务器崩溃.由于请求可以长时间运行并且确认时间需要很短,我们通过持久化请求,然后向客户端发送确认,然后执行各种操作来完成请求来实现.当执行操作时,它们也是持久的,因此服务器知道启动时请求的状态,并且还有与外部系统的各种协调机制来检查我们的日志的准确性.

这一切看起来都运行得相当好,但是我们很难说有任何信念,因为我们发现很难测试我们的容错代码.到目前为止,我们已经提出了两个策略,但两者都不完全令人满意:

  • 让外部进程监视服务器代码,然后尝试在外部进程认为是测试中的适当点时将其终止
  • 添加代码应用程序将导致它崩溃某些已知的关键点

我的第一个策略的问题是外部进程无法知道应用程序的确切状态,因此我们无法确定我们是否遇到了代码中最有问题的问题.我的第二个策略的问题,虽然它给出了更多的控制权,但是我不喜欢让代码在我的应用程序中注入错误,即使是可选的编译等等.我担心过于容易看错注入点,让它滑入生产环境.

Jus*_*tin 3

我认为有三种方法可以解决这个问题,如果可用的话,我可以建议对这些不同的代码进行一套全面的集成测试,使用依赖项注入或工厂对象在这些集成期间产生损坏的操作。

其次,使用随机kill -9 运行应用程序,并禁用网络接口可能是测试这些事情的好方法。

我还建议测试文件系统故障。如何执行此操作取决于您的操作系统,在 Solaris 或 FreeBSD 上,我将在文件中创建 zfs 文件系统,然后在应用程序运行时 rm 该文件。

如果您使用数据库代码,那么我建议也测试数据库的故障。

依赖注入的另一种替代方案(可能也是我会使用的解决方案)是拦截器,您可以在代码中启用崩溃测试拦截器,这些拦截器将了解应用程序的状态并在正确的时间引入上面列出的故障,或者您可以使用的任何其他故障。可能想要创建。它不需要更改现有代码,只需要一些额外的代码来包装它。