16. 质量管理

是为了确保项目达到客户所规定的质量要求所实施的一系列管理过程。它包括质量规划,质量控制和质量保证等。

16.1. 无缺点管理

zero defects management

由于周末经常外出自驾游,途中会经过东莞、惠州、观澜、大鹏等工业区,哪里的工厂给过一个很深的印象,每个工厂楼顶会有一个巨大的牌匾“已通过ISO 9001”。这让我开始思考以往的质量管理。

我认为质量管理方法可以分为两类:

  1. 考察过程
  2. 检验结果

传统劳动密集型产业可以采用考察过程(例如ISO9001),制定产生规范,产生预期结果。这种方法对于资本密集型产业或知识密集型产业并不适合。所以另一种检验结果的质量管理办法孕育而生。

简单的说,这种质量管理办法是:

  1. 首先制定预期结果,
  2. 项目完成后与期望结果对比
  3. 输出验收报告
  4. 根据验收报告做出处理

这种管理的方法存在很多弊端,工作中你会遇到下面这些问题:

考察结果的质量管理存在的弊端:

  1. 无论如何你都不可能把所有预期结果都能考虑到
  2. 所做的工作仅仅为了满足预期结果的验收
  3. 对已知缺陷视而不见
  4. 而对于验收人员,验收报告以外的缺陷,心照不宣
  5. 无法预见缺陷,发现缺陷为时已晚,已经到了项目尾声。

举一个例子,国家检验奶粉有一个标准,一些不法企业在奶粉中添加三聚氰胺,可以通过检测,最终酿成惨剧。

无论是考察过程的质量管理还是检验结果的质量管理,这两种管理方式仅仅能做出合格的产品,无法做出精品。

丰田公司的一位高级管理人员说:“我们不应使用全面质量管理,因为这种管理充其量只能让缺点减至10%。如果我们生产400万辆汽车的话,便会有40万人购得一辆带毛病的车,这是生产与用户之间的最大危机,而推行无缺点管理则会消除这种现象。”现在,领先的日本公司逐渐由全面质量管理转向无缺点管理。

无缺点管理的范围已经超出了产品质量范畴

  1. 计划缺陷
  2. 设计缺陷
  3. 产品缺陷
  4. 研发缺陷
  5. 开发缺陷
  6. 工艺缺陷
  7. 材料缺陷
  8. 流程缺陷
  9. 设备缺陷
  10. 人的缺陷
  11. 生产缺陷
  12. 服务缺陷
  13. 市场缺陷

16.2. 压力测试中存在的问题

16.2.1. (What) 什么是压力测试

软件压力测试是一种基本的质量保证行为,它是每个重要软件测试工作的一部分。软件压力测试的基本思路很简单: 不是在常规条件下运行手动或自动测试,而是在计算机数量较少或系统资源匮乏的条件下运行测试。 通常要进行软件压力测试的资源包括内部内存、CPU 可用性、磁盘空间和网络带宽。

压力测试涵盖,性能测试,负载测试,并发测试等等,这些测试点常常交织耦合在一起。

16.2.1.1. 压力测试存在那些问题

我归纳一下又几点:

  1. 操作系统默认安装,在未做任何优化的情况下实施压力测试
  2. 未考虑磁盘IO对软件的影响
  3. 未考虑网络带宽对软件的影响
  4. 网络软件测试,没有考虑到TCP特点
  5. 各种超时参数优化
  6. 测试客户端未优化
  7. 并发理解有误
  8. WEB服务器,数据库,等等服务器未优化

如果上面几项没有做优化,压力测试数据基本没有任何参考价值,任何一项没有优化,都会导致你的压力测试数据出现偏差。 下面我来逐条说明:

  1. 操作系统问题 操作系统是大众化软件,出厂优化都是面向大众,不可能为某个领域做单独优化。所以我们第一步需要优化操作系统。 Linux 系统优化内核参数,Windows 系统优化注册表等等。
  2. 磁盘IO 这是最容易出现瓶颈的地方,常常是CPU还没有达到极限,磁盘已经不堪重负。
  3. 网络IO 与磁盘IO相同
  4. TCP连接 几乎所有 B/S, C/S 软件都是采用多线程,或者多进程技术。这种技术有个特点,开发者将程序设计为线程可自动伸缩模式,开启进程后会启动少量线程,当连接不断提高后,线程数逐渐增加,随着线程运行结束后,线程逐渐减少。 这样的设计会更有效地利用硬件资源,在程序空闲时将硬件资源让给其他进程。少有软件设计为开启服务独占资源。 这样测试软件做压力测试,不能一次并发很多请求,而是要采用逐渐增加的方式,否则第一次测试会有一部们并发不能及时响应,导致测试数据偏差。另外也你可以多做几次压力请求(让多线程工作起来),从第三次开始记录测试数据,忽律前面两次的测试数据。

提示:另一个问题是TCP连接复用,这也是一个重要配置项。如果这项没有配置,我想测试出的数据也会有偏差

  1. 超时参数 超时参数在压力测试中是非常重要的参数,例如从WEB到数据库连接超时是60秒,如果有一个SQL查询超过300秒,那么后面的请求会持续排队等待,当连接数达到数据库的最大连接时,接下来的所有请求都是失败的。 通常我们的WEB服务器超时不会超过30秒,有时我设置为10秒,一旦出现超时,宁可让该连接Timeout,不要让他影响整体服务。
  2. 客户端 很多网络软件需要从客户端发出压力测试请求,所以客户端的优化也是必须的,否则客户端压力出不去,服务端压力进不来。
  3. 并发 很多人认为并发,就是同一时间内的最大连接数,这是错误的。如果你写过多线程程序,就会发现多线程运行时又规律的。是顺序排队运行的,根本不是同时运行的。 所以并发是指,相对时间内能完成的连接总和,例如,每秒并发,每分钟并发等等,通常我们已秒为单位。 我们目前使用的操作系统叫分时操作系统,这种系统的特点就是可能实现多用户,多任务。操作系统将进程排队(优先级)轮询运行,只不过这个操作太快了,使你认为多个进程在同时运行。
  4. 服务器优化 主要B/S软件压力测试,WEB,缓存,数据库等等服务器,都需要逐一优化到最佳状态

16.2.2. (Why) 为什么做压力测试

如果在软件设计阶段都将这些问题元素都考虑进去,同时开发阶段严格执行。那么开发出些软件几乎不用做这个劳人伤神的压力测试。

所以在软件设计阶段就要考虑,灵活性,扩展性,可靠性与性能,还要考虑高可用与负载均衡。

同时软件优化伴随开发,持续集成,持续测试,持续部署。

16.2.3. (Where) 在哪里做压力测试

有些软件需要封闭的环境测试,不能在共享资源的环境中做测试。所以你有必要做Vlan隔离,甚至独立的路由器与交换机在封闭网络中测试。

16.2.4. (When) 什么时间做压力测试

任何时间都可能做压力测试,为什么我将“时间”重点提出呢?目前受地球自转影响,经常闰秒,你不的不考虑这个问题。

16.2.5. (Who) 压力测试过程参与人员

  1. 运维部门
  2. 开发部门
  3. 测试部门

16.2.6. (How) 如何做压力测试

下面我们举一些例子,讲述压力测试方法,限于篇幅不可能面面俱到,我仅仅是给你提供思路。

测试前你需要一些监控工具,事实监控服务器的资源变化。

例如 Web 服务器压力测试,测试场景是 nginx :

    worker_processes  8;            处理器数
    worker_rlimit_nofile 65530;     允许最多打开文件数
    worker_connections  4096;       最大连接数数为
    keepalive_timeout  65;          开启复用连接
    gzip  on;                       压缩传输数据

怎么测试呢?你要活得最大化性能吗?还是相对性能?我们通常需要的是满足需求就好的相对性能,而不是最大化性能。为什么呢?因为要活得最大化性能是要做出很多配置牺牲的,例如关闭日志,禁止访问时间等等。

按照上面的配置你的测试用例应该是,每次并发4000 请求 8000~10000 次, 你不能并发8000 请求 4000 这样测试。很是很多人常常犯的错误,所以测试者需要连接系统的配置参数,不能盲目使用数字实验。

上面我说过线程的开启时随着请求,逐渐增加的,所以首次发起测试数据是不准确的,通过pstree命令可以看到线程数量。等第三次以后线程逐渐增加到4096个,并且之前开启的TCP可以复用,这时测试的结果比较有说服力。

延伸阅读《Netkiller Web 手札》《Netkiller Testing 手札》《Netkiller Linux 手札》

16.3. 打破软件自动化测试的格局

16.3.1. 自动化测试的误区

自动化测试仅仅被认为是替代人工,所以我们看到很多企业实施自动化测试仅仅是将现有的 Test Case 转换成自动化脚本。

这样做既没有提高测试整体水平,也没有改善测试结果。结果是通过手工能测试出来的问题自动化测试可以测试出来,手工测试不出来的问题自动化测试也没有测试出来。

因为测试的观念仍停留在已有 Test Case 阶段,而 Test Case 停留在业务流程测试的阶段。

最终自动化测试仅仅是按照测试用例走一边业务流程,完成业务流程的检验。

16.3.2. 分层与部署带来的问题

随着技术发展,软件的多样性,测试已经不局限于基于CS结构的GUI测试, 基于BS浏览器WEB UI测试。例如目前的安卓系统,苹果IOS系统,微软的 Windows Mobile 系统等等也加入到自动化测试领域。

应用软件也越来越复杂,例如:

  1. 分层的变化:界面层,接口曾,业务逻辑曾,实体模型层
  2. 部署的变化:从单机运行到双机热备份再到负载均衡,最近进化到分布式系统。
  3. 存储的变化:关系型数据库,非关系型数据库,缓存数据库,搜索引擎数据库

从下面的金字塔架构可以看出软件展示给用户的只有UI界面层

            /\
           /  \
          / UI \
         /------\
        /   API  \
       /----------\
      /   Service  \
     /--------------\
    /    Component   \
   /------------------\
  /      Database      \
 /______________________\

上面是软件的分层,一个软件经过部署后结构将会更复杂。

            /\
           /  \
          /CDN \
         /------\
        / WEB SER\
       /----------\
      / APP Server \
     /--------------\
    / Message Queue  \
   /------------------\
  / Cache|SearchEngine \
 /   Database| NoSQL    \
/________________________\

就WEB应用测试而言,涉及的内容就太广泛了,从浏览器->WEB服务器->APP服务器->缓存->数据库,中间会经过各种代理,负载均衡,分布式文件系统等等。

我们测试要涵盖:

  1. CDN测试,域名解析测试,
  2. WEB UI测试,包括HTML,Ajax
  3. API 服务器测试,api 是非人机交互界面,它是通过特定协议与API服务器交互通信。
  4. 代码单元测试
  5. 配置测试,配置管理过程中配置变更后的测试,含系统与应用
  6. 安全测试,接口安全,认证,权限
  7. 注入测试,JS注入,SQL 注入,Shell 注入
  8. 缓存测试,命中率测试,包括CDN,WEB服务器,缓存服务器,搜索引擎
  9. 压力测试,健壮性测试
  10. 扩展性测试,水平扩展测试,垂直扩展测试
  11. 高可用测试,集群测试

16.3.3. 压力测试存在的问题

请参考我的另一篇文章《压力测试中存在的问题》

这里我要再单独强调压力测试,很多人的测试方法是有问题的。

压力测试不是准备一台机器安装压力测试软件就可以开始测试的。 压力测试的环境非常重要,很多工作多年的测试人员都没有意识到这个问题。

压力测试有两个重点,一是压力测试环境的建设,二是压力测试顺序。

16.3.3.1. 压力测试环境

压力测试无论是单机还是网络,都需要一个好的压力测试环境,例如网络好比高速公路,如果公路成为瓶颈,你能测试出准确的数据吗?

首先准备测试环境,如单机测试要考虑CPU速度,磁盘IO速度,RAID卡的速度,RAID卡缓存大小,内存速度,PCI—E总线速度,甚至会涉及多对称CPU相关配置,内存与CPU通道的问题......等等

如果是测试分布式系统,除了上述单节点的注意事项,还要考虑到路由器/防火墙的包转发与连接数限制,交换机的背板带宽以及吞吐能力,负载均衡器的转发能力。

操作系统要考虑内核参数优化,TCP/IP栈优化,各种服务器的配置。

16.3.3.2. 测试顺序

压力测试顺序的切入点非常重要,测试顺序上多数人是从UI(人机界面)切入,即由UI驱动业务逻辑,这种测试顺序是错误的,例如用户->浏览器->WEB服务器->APP服务器->缓存->数据库等等,这就带来很多问题。

\------------------/
 \    Web server  /
  \   App Server /
   \ Cache / MQ /
    \ Database /
     \ Disk IO/
      \      /

软件的性能平静通常是沙漏型的,最大的瓶颈莫过于数据库,其他服务器的瓶颈我们都能从架构的角度去解决性能问题。

所有我们应该先从数据库测试,首先确认数据库的配置优化是否能达到我们预期值。然后是缓存,消息队列,搜索引擎等等.....

至此我们已经知道数据库,缓存,消息队列,搜索引擎不会成为我们压力测试中的瓶颈。接下就可以测试应用服务器和应用软件了。

如果你的测试格局能够放大一点要考虑的远不止上述那些。 你还需考虑硬件,网络,操作内核参数优化,TCP/IP栈优化,验证运维配置是否能满足我们需求等等.....。

16.3.3.3. 瓶颈分析

我们需要有一套监控解决方案,能够监控到硬件的性能,软件的性能。

测试目的不是为了得出一个结果,告诉开发人员你的软件能支撑XXX并发,而是在我们测试中监控每项操作,计算出每个功能所用的时间,分析出性能的平静,指导开发人员改进软件。

监控分为外部监控与内部监控。

外部监控是最容易实现的,有成熟的工具以及解决方案,CPU,内存,磁盘IO,网络流量等等。

内部监控是指软件运行加载到内存中之后的变化状态,例如内存地址,变量,函数调用,动态链接库载入,打开文件句柄,Socket地址和数据包等等。

16.3.3.4. 指导开发

通过数据,图表,快速定位软件存在的问题点,指导开发完成软件的改进

16.3.4. 持续集成形同虚设

持续集成,自动化构建几乎么个测试团队都会实施,但实际境况并不理想,仅仅停留在工具配置的阶段。几乎没有人在生产环境上使用自动化构建。

为什么持续集成无法应用到生产环境?

(待续,敬请关注作者微信公众号,现在已经是早上6点中了,要去睡觉了)

16.3.5. 测试的终极目标

我认为测试不仅仅是完成按照测试用例完成软件验收,如果仅仅测试用户可见的UI(人机接口)是不能满足现代软件的测试需求的。

测试者应该站在更高的角度看问题,测试者是有能力指导开发人员,改善软件的性能,健壮性,安全性,以及影响软件架构的设计。 测试者需要有广泛的跨界知识支撑,要不断学习提高,打破现有格局。

原文出处:Netkiller 系列 手札
本文作者:陈景峯
转载请与作者联系,同时请务必标明文章原始出处和作者信息及本声明。

时间: 2024-10-11 00:52:46

16. 质量管理的相关文章

软件项目质量管理与度量

软件项目/产品的质量问题一直困扰软件企业.监理方和甲方,如何预防.发现.治理软件项目/产品质量问题,是目前我国it发展面临巨大的挑战,这也是it发展过程中关注的主要问题.软件企业.甲方和监理方在研发过程中常常要面临很多难题: 1.软件质量管理基础 (1)质量的概念与定义:(2)软件的质量要素:(3)软件质量评价的准则:(4)iso 9000软件质量体系结构:(5)软件质量保证过程:(6)质量管理大师简介:(7)质量管理的发展历程: 2.软件质量与质量管理 (1)软件质量面临的挑战及模糊认识:(2

基于云计算的呼叫中心解决方案的16个优势

呼入的客户电话是企业业务成功的关键,因此企业需要充分利用每一个电话的互动机会.幸运的是,如今的呼叫中心解决方案可以提供先进的技术,有助于提高客户体验.虽然传统的基于硬件的系统可能是复杂和昂贵的,企业还有另一个选择,就是采用基于云计算的呼叫中心解决方案. 基于云计算的呼叫中心旨在降低成本,增加高级功能,提升代理性能并改善客户服务.各种类型和规模的企业及其客户将受益于广泛的工具和服务.以下列表突出显示了托管呼叫中心解决方案的16个优势: 1.调整需求.通过基于云计算的呼叫中心,可以利用为用户实现新功

杭州开办现场生产质量管理讲座

杭州市干部培训中心于11月16~17日和11月29日分别组织举办"现场生产质量管理创新"和有效管理十八项技能二场讲座. "现场生产质量管理"课程,特邀请实战生产管理专家.享受政府津贴的高级工程师.中国管理科学研究院特约研究员徐明达老师来杭主讲:有效管理十八项技能管理课程主讲老师--李泽尧教授是著名实战派企业管理专家,中国管理科学研究院研究员,中国人民大学商学院客座教授.具体查询信息请至杭州考试培训网(www.ttt.gov.cn).咨询电话:0571-8577177

溢价16倍收购资产欠佳公司荣之联甘当冤大头太蹊跷

荣之联(行情,问诊)披露了让市场等待三个月的收购方案,然而令人始料未及的是,该股复牌后迎来的却是连续暴跌.分析认为,这与该公司在标的资产的经营存在较大隐忧的情况下仍以高溢价去收购有关系.昨日荣之联二级市场的表现,似乎也在再次印证市场对该公司收购项目不认可的态度,开盘后,该股仍旧大幅杀跌,最终收盘报19.91元/股,跌幅为8.21%.从5 月13日复牌至今,荣之联是连续三日暴跌,其中两日为无量跌停,跌幅已累计达26%.那么,究竟是收购怎样的资产让荣之联连续被投资者用脚投票呢?资料显示,荣之联是拟以

md5 16位二进制与32位字符串相互转换

 密码很多时候都会用 md5保存,并且很多时候都是16位二进制格式的md5,php 里面 md5($str, true) 可以很方便的获取.更多时候md5结果是一组32个字符组成的字符串,其实转换很简单   代码如下: <?php   $str = 'test'; $cm = md5($str); $bm = md5($str, true);   $cstr = implode(unpack('H*', $bm)); $bstr = pack('H*', $cm);     echo 'str:

WP8平台Skype 2.16开始支持微软账户登录

微软已经在WP 8平台上推送了版本号为2.16的最新版本Skype应用,本次更新最大的改变就是登录过程的改变:摒弃了原有的Skype帐号登录模式还是使用绑定的微软帐号进行登陆.微软在很早之前就有了这样的打算,在官方博客中Skype团队表示WP用户能够通过和手机注册的相同微软帐号轻松的访问Skype应用. 此前WP用户在进行Skype登录的时候在输入Skype的帐号和密码之前还会提示你进行一步操作:使用微软帐号的邮件地址和密码在应用中进行登陆.而在最新版本中终于取消了这个重复的验证步骤. 在2.1

javascript-js 如何将16进制数据转浮点数

问题描述 js 如何将16进制数据转浮点数 js 如何将16进制数据转浮点数 我想 把str ='AB23FF12E1' 这个转成浮点数 解决方案 http://blog.csdn.net/yin138/article/details/13504441 解决方案二: 补充一句,123.456(float) = '79 E9 F6 42'; 如何把 '79 E9 F6 42'; 还原回 123.456呢? 解决方案三: 补充一句,123.456(float) = '79 E9 F6 42'; 如何

http-HTTP 通信 参数 16进制传递

问题描述 HTTP 通信 参数 16进制传递 HTTP通信中,发现有个参数是采用16进制传递的 传递参数如下: p1=1658997962& p2=000151A57CD6005827A00F88E49BBF297AD9D19C51D7D116FF8E81FB4 C6397377D27BDDFEF87AE50E27AA9364CD44EE4F2D87CE9147EEA291F452 A679D16C70A442C8C01584BD4A87C880D76CEA25309CF0B1E5D12EC5B

android中String转换成16进制的方法

问题描述 android中String转换成16进制的方法 想请教一下?把一个24个字节的字符串转换成16进制,并把结果打印出来要怎么写,网上有一些方法但是没有说转换完的16进制串打印出来要用哪个参数?求指点 解决方案 byte[] b = ""字符串"".getBytes();foreach (byte i : b){if (i < 16) System.out.print(""0"" + Integer.toHexS