分布式应用异常测试一二说

异常测试按性质分为应用层的业务逻辑异常测试、系统硬件/网络/文件/数据库/缓存/中间件异常测试,其中包含了许多的场景(单机、分布式),但所有的场景均和这两项有直接的关系。

业务逻辑异常测试体现在当上述的第二种异常发生时,是否能根据业务的需要或者架构的设计做出合理的业务处理反应,这是建立在第二种异常测试之上的,因此异常测试的关系也已经非常明确了,第一种测试根据业务的不同,范围和流程有不确定性,第二种测试则是在一些明确的规则和约定下进行。

当架构演进到分布式,往往在测试过程中给人无从下手的错觉,尤其在异常测试方面,其实不然,前面提到的单机和分布式看似是两种类型,单独看,单机的异常影响范围可能会小一些,但事实上他们在分布式环境中会产生互相影响:

单机:从系统层面来说就是指单一进程,从异常测试角度来看,影响范围发生在线程或进程级别,线程级别的异常可能导致线程的结束,且没有启动新的线程来代替,进程级别可能导致线程锁的不释放,导致其他线程都挂起等待。

分布式:分布式是一个协同工作的应用环境,这种异常往往容易引起其他进程的挂起,或者数据库、缓存、中间件的问题,主要有网络调用所占用的资源、数据库访问等。

单机的异常如果处理不当,会引起整个环境中的资源不可用,从而导致环境中的每个单机都出现异常。根据上述的一些概念,可以列出异常测试中最重要的一些场景:

系统资源:cpu、内存使用率过高,能否能将请求切到到资源利用率低的服务器上;

数据量大小和形式:数据到底应该注入多少满足后续的压力测试,各服务对数据格式的要求和转换;

文件读写:

本地写:对同一个文件打开的的数量过多,或者只打开不关闭,导致文件句柄数超过系统阈值;

本地读:打开一个不存在的文件,是否有对应处理逻辑;

网络存储:服务不可用;

应用连接:

短连接:请求方未设置超时时间,长时间等待响应方的响应,从而导致请求的大量堆积,线程池的处理线程被用完,导致大量新的用户请求被拒绝;

长连接:在网络出现异常状况后,断开的连接是否能重新建立,请求方如拿到失效的连接,是否能处理异常;

数据库:

数据源切换:如果所切换的数据源连接处于不可用状态或宕机时,是否会长时间等待或重试;

表锁、行锁:长时间更新操作,导致其他对此表的修改操作被挂起;

慢SQL的预防:通过对SQL的提前分析,来预防慢SQL相关的问题,及时告知DBA进行优化;

缓存:

key的失效:在获取不到key后,是否能正常处理;

锁的释放:申请到锁的一方如果意外重启,是否能在重启后释放锁;

缓存服务不可用;

消息中间件:

消息记录表切换:是否丢失;

清除消息记录:是否丢失记录;

服务发现:

服务不可用:是否有其他处理措施;

单台不可用:是否能重新选举,重新建立连接;

应用容器:

连接数:配置优化;

请求处理线程:配置优化;

jvm堆栈大小:参数优化;

前端静态化页面:

后端服务不可用;

缓存不可用;

数据库中间件:

数据访问是否在错误发生后进行了正确的转移;

对于上层业务来说是否进行了正确的向下隔离;

-----------------------------END---------------------------------

本文来自企鹅号 - 龙腾测试媒体

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏诸葛青云的专栏

C语言指针指向你的时候,菜鸡原型毕露!

所以先介绍一下如何完全理解一个复杂类型,要理解复杂类型其实很简单,一个类型里会出现很多运算符,他们也像普通的表达式一样,有优先级,其优先级和运算优先级一样。

663
来自专栏决胜机器学习

《Redis设计与实现》读书笔记(三十六) ——Redis 慢查询日志实现

《Redis设计与实现》读书笔记(三十六) ——Redis 慢查询日志实现 (原创内容,转载请注明来源,谢谢) 一、基本功能 redis的慢查询日志,用于记录执...

3084
来自专栏前端说吧

JS-提取字符串—>>普通方法VS正则表达式

2706
来自专栏深度学习思考者

Python学习(三) 八大排序算法的实现(上)

   本文Python实现了直接插入排序、基数排序、冒泡排序、快速排序、直接选择排序、堆排序、归并排序、希尔排序。    上篇来介绍前四种排序方式:  ...

1828
来自专栏北京马哥教育

提升Python程序性能的7个习惯

使用局部变量替换模块名字空间中的变量,例如 ls = os.linesep。一方面可以提高程序性能,局部变量查找速度更快;另一方面可用简短标识符替代冗长的模块变...

540
来自专栏分布式系统和大数据处理

.Net Remoting(远程方法回调) - Part.4

根据这三点的变化,我们可以看出:客户端含有客户端对象,但它还需要远程服务对象的元数据来构建代理;服务端含有服务对象,但它还需要客户端对象的元数据来构建代理。因此...

692
来自专栏前端桃园

JavaScript核心概念之执行上下文和栈

现在想改变一下写作方式,以问答的形式来讲解这些枯燥无味的知识,尽量把每一个为什么都讲透,每个知识点都不迷惑。

521
来自专栏十月梦想

函数

                                            函数体

683
来自专栏性能与架构

JS中如何处理多个ajax并发请求?

通常 为了减少页面加载时间,先把核心内容显示处理,页面加载完成后再发送ajax请求获取其他数据 这时就可能产生多个ajax请求,为了用户体验,最好是发送并行请求...

4356
来自专栏蓝天

linux新的API signalfd、timerfd、eventfd使用说明

原文:http://www.cfanz.cn/?c=article&a=read&id=46555 注意很多当前(2013/8/6)线上运营的Linux...

983

扫码关注云+社区