﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-51Testing软件测试网-文章分类-软件测试技术</title><link>http://www.cnitblog.com/shbwf/category/6167.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 13 Dec 2019 15:29:05 GMT</lastBuildDate><pubDate>Fri, 13 Dec 2019 15:29:05 GMT</pubDate><ttl>60</ttl><item><title>银行是如何确保你钱袋子安全的？你不知道的银行测试了解一下</title><link>http://www.cnitblog.com/shbwf/articles/91970.html</link><dc:creator>51testing</dc:creator><author>51testing</author><pubDate>Mon, 09 Dec 2019 09:46:00 GMT</pubDate><guid>http://www.cnitblog.com/shbwf/articles/91970.html</guid><wfw:comment>http://www.cnitblog.com/shbwf/comments/91970.html</wfw:comment><comments>http://www.cnitblog.com/shbwf/articles/91970.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shbwf/comments/commentRss/91970.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shbwf/services/trackbacks/91970.html</trackback:ping><description><![CDATA[<p style="box-sizing: border-box; text-align: left; padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(255,255,255); font-style: normal; text-indent: 0px; margin: 1em 0px; padding-left: 0px; padding-right: 0px; font-family: PingFangSC-Light, 微软雅黑, 微软雅黑, 'Microsoft YaHei', Helvetica, Tahoma, sans-serif; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; white-space: pre-wrap; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); font-size: 16px; cursor: text; font-weight: 400; word-spacing: 0px; padding-top: 0px; font-variant-ligatures: normal; font-variant-caps: normal; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial">作为一名入职两年的银行测试人员，虽然目前还处于成长阶段，但也能根据自己的工作经历总结出一些经验，帮助新人们&#8216;避雷&#8217;。下面我将总结成八点内容，与大家分享。</p>
<p style="box-sizing: border-box; text-align: left; padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(255,255,255); font-style: normal; text-indent: 0px; margin: 1em 0px; padding-left: 0px; padding-right: 0px; font-family: PingFangSC-Light, 微软雅黑, 微软雅黑, 'Microsoft YaHei', Helvetica, Tahoma, sans-serif; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; white-space: pre-wrap; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); font-size: 16px; cursor: text; font-weight: 400; word-spacing: 0px; padding-top: 0px; font-variant-ligatures: normal; font-variant-caps: normal; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial"><strong style="box-sizing: border-box; font-weight: bolder">1.参与需求评审</strong></p>
<p style="box-sizing: border-box; text-align: left; padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(255,255,255); font-style: normal; text-indent: 0px; margin: 1em 0px; padding-left: 0px; padding-right: 0px; font-family: PingFangSC-Light, 微软雅黑, 微软雅黑, 'Microsoft YaHei', Helvetica, Tahoma, sans-serif; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; white-space: pre-wrap; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); font-size: 16px; cursor: text; font-weight: 400; word-spacing: 0px; padding-top: 0px; font-variant-ligatures: normal; font-variant-caps: normal; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial">业务，开发，测试三者看似是不同的个体，但实际上的工作是紧密相连的。测试人员往往在开发阶段才拿到业务需求说明书开始编写测试案例，这无疑会降低测试效率。需求评审环节有助于快速全面了解客户需求，它会节省后续测试人员了解业务需求的时间，并且测试重点难点都可以借此机会在会上阐明，经过讨论找到解决方法。</p>
<div style="box-sizing: border-box; text-align: center; widows: 2; text-transform: none; background-color: rgb(255,255,255); font-style: normal; text-indent: 0px; font-family: PingFangSC-Light, 微软雅黑, 微软雅黑, 'Microsoft YaHei', Helvetica, Tahoma, sans-serif; white-space: pre-wrap; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); font-size: 16px; cursor: text; font-weight: 400; word-spacing: 0px; font-variant-ligatures: normal; font-variant-caps: normal; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial" class="ql-image-container ql-align-center" contenteditable="false"><img style="box-sizing: border-box; border-bottom-style: none; border-right-style: none; font-family: PingFangSC-Light, 微软雅黑, 微软雅黑, 'Microsoft YaHei', Helvetica, Tahoma, sans-serif; max-width: 600px; border-top-style: none; border-left-style: none" src="https://5b0988e595225.cdn.sohucs.com/images/20191209/b61f9337cc224b12914d4d9e4866512b.jpeg"  alt="" /><span style="box-sizing: border-box; position: relative; padding-bottom: 6px; line-height: 20px; font-style: normal; margin: 5px 0px; outline-style: none; outline-color: invert; padding-left: 10px; outline-width: medium; width: 640px; padding-right: 10px; display: inline-block; font-family: PingFangSC-Light, 微软雅黑, 微软雅黑, 'Microsoft YaHei', Helvetica, Tahoma, sans-serif; color: rgb(144,144,144); font-size: 14px; padding-top: 6px" class="img-desc" contenteditable="true" data-desc="">点击添加图片描述（最多60个字）</span></div>
<p style="box-sizing: border-box; text-align: left; padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(255,255,255); font-style: normal; text-indent: 0px; margin: 1em 0px; padding-left: 0px; padding-right: 0px; font-family: PingFangSC-Light, 微软雅黑, 微软雅黑, 'Microsoft YaHei', Helvetica, Tahoma, sans-serif; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; white-space: pre-wrap; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); font-size: 16px; cursor: text; font-weight: 400; word-spacing: 0px; padding-top: 0px; font-variant-ligatures: normal; font-variant-caps: normal; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial"><strong style="box-sizing: border-box; font-weight: bolder">2.借助业务流程图编写测试案例</strong></p>
<p style="box-sizing: border-box; text-align: left; padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(255,255,255); font-style: normal; text-indent: 0px; margin: 1em 0px; padding-left: 0px; padding-right: 0px; font-family: PingFangSC-Light, 微软雅黑, 微软雅黑, 'Microsoft YaHei', Helvetica, Tahoma, sans-serif; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; white-space: pre-wrap; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); font-size: 16px; cursor: text; font-weight: 400; word-spacing: 0px; padding-top: 0px; font-variant-ligatures: normal; font-variant-caps: normal; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial">　　对于一些比较复杂的需求，由于其分支路径较多，测试时容易忽略个别情况。这时尽量根据业务需求绘制业务流程图，或者询问开发人员在编码时是否有参考相关业务流程图。业务流程图能够直观清晰的表现出各个分支路径的情况，有效的避免了测试案例不全面的现象。</p>
<p style="box-sizing: border-box; text-align: left; padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(255,255,255); font-style: normal; text-indent: 0px; margin: 1em 0px; padding-left: 0px; padding-right: 0px; font-family: PingFangSC-Light, 微软雅黑, 微软雅黑, 'Microsoft YaHei', Helvetica, Tahoma, sans-serif; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; white-space: pre-wrap; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); font-size: 16px; cursor: text; font-weight: 400; word-spacing: 0px; padding-top: 0px; font-variant-ligatures: normal; font-variant-caps: normal; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial">　　例如，我在进行对公账户冻结相关交易优化的测试工作时，根据短短几行的业务需求，绘制出了及其复杂的业务流程图。下图是简易版本，着重描述了部分冻结强制扣划分支的业务逻辑，相关公式和数字用字母替代。对于这样的需求，如果不绘图或者制表，很难设计出全面且正确的测试案例。但是经过和业务人员、开发人员讨论，确定详细的业务流程图后，测试案例的编写自然而然不会有任何遗漏。所以，对于多分支的业务需求，应该善于绘图，利用图表明确测试思路。</p>
<div style="box-sizing: border-box; text-align: center; widows: 2; text-transform: none; background-color: rgb(255,255,255); font-style: normal; text-indent: 0px; font-family: PingFangSC-Light, 微软雅黑, 微软雅黑, 'Microsoft YaHei', Helvetica, Tahoma, sans-serif; white-space: pre-wrap; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); font-size: 16px; cursor: text; font-weight: 400; word-spacing: 0px; font-variant-ligatures: normal; font-variant-caps: normal; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial" class="ql-image-container ql-align-center" contenteditable="false"><img style="box-sizing: border-box; border-bottom-style: none; border-right-style: none; font-family: PingFangSC-Light, 微软雅黑, 微软雅黑, 'Microsoft YaHei', Helvetica, Tahoma, sans-serif; max-width: 600px; border-top-style: none; border-left-style: none" src="https://5b0988e595225.cdn.sohucs.com/images/20191209/8d039860798444e3bb77e14a53e137b8.jpeg"  alt="" /><span style="box-sizing: border-box; position: relative; padding-bottom: 6px; line-height: 20px; font-style: normal; margin: 5px 0px; outline-style: none; outline-color: invert; padding-left: 10px; outline-width: medium; width: 640px; padding-right: 10px; display: inline-block; font-family: PingFangSC-Light, 微软雅黑, 微软雅黑, 'Microsoft YaHei', Helvetica, Tahoma, sans-serif; color: rgb(144,144,144); font-size: 14px; padding-top: 6px" class="img-desc" contenteditable="true" data-desc="">点击添加图片描述（最多60个字）</span></div>
<p style="box-sizing: border-box; text-align: left; padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(255,255,255); font-style: normal; text-indent: 0px; margin: 1em 0px; padding-left: 0px; padding-right: 0px; font-family: PingFangSC-Light, 微软雅黑, 微软雅黑, 'Microsoft YaHei', Helvetica, Tahoma, sans-serif; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; white-space: pre-wrap; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); font-size: 16px; cursor: text; font-weight: 400; word-spacing: 0px; padding-top: 0px; font-variant-ligatures: normal; font-variant-caps: normal; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial">　　冻结扣划流程图</p>
<p style="box-sizing: border-box; text-align: left; padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(255,255,255); font-style: normal; text-indent: 0px; margin: 1em 0px; padding-left: 0px; padding-right: 0px; font-family: PingFangSC-Light, 微软雅黑, 微软雅黑, 'Microsoft YaHei', Helvetica, Tahoma, sans-serif; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; white-space: pre-wrap; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); font-size: 16px; cursor: text; font-weight: 400; word-spacing: 0px; padding-top: 0px; font-variant-ligatures: normal; font-variant-caps: normal; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial"><strong style="box-sizing: border-box; font-weight: bolder">3.业务关联系统分析</strong></p>
<p style="box-sizing: border-box; text-align: left; padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(255,255,255); font-style: normal; text-indent: 0px; margin: 1em 0px; padding-left: 0px; padding-right: 0px; font-family: PingFangSC-Light, 微软雅黑, 微软雅黑, 'Microsoft YaHei', Helvetica, Tahoma, sans-serif; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; white-space: pre-wrap; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); font-size: 16px; cursor: text; font-weight: 400; word-spacing: 0px; padding-top: 0px; font-variant-ligatures: normal; font-variant-caps: normal; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial">　　在测试领域，关联系统分析不充分是发生变更的重要原因之一。服务方系统接口有变动，相关消费方系统调用该接口的功能都要根据情况有所调整，或者进行全量回归。因为跨系统调用，往往涉及多个开发人员，大家对彼此的系统了解度不够，进行关联性分析时要格外严谨。</p>
<p style="box-sizing: border-box; text-align: left; padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(255,255,255); font-style: normal; text-indent: 0px; margin: 1em 0px; padding-left: 0px; padding-right: 0px; font-family: PingFangSC-Light, 微软雅黑, 微软雅黑, 'Microsoft YaHei', Helvetica, Tahoma, sans-serif; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; white-space: pre-wrap; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); font-size: 16px; cursor: text; font-weight: 400; word-spacing: 0px; padding-top: 0px; font-variant-ligatures: normal; font-variant-caps: normal; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial"><strong style="box-sizing: border-box; font-weight: bolder">4.完整的业务场景</strong></p>
<p style="box-sizing: border-box; text-align: left; padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(255,255,255); font-style: normal; text-indent: 0px; margin: 1em 0px; padding-left: 0px; padding-right: 0px; font-family: PingFangSC-Light, 微软雅黑, 微软雅黑, 'Microsoft YaHei', Helvetica, Tahoma, sans-serif; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; white-space: pre-wrap; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); font-size: 16px; cursor: text; font-weight: 400; word-spacing: 0px; padding-top: 0px; font-variant-ligatures: normal; font-variant-caps: normal; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial">　　业务流程往往会形成一个闭环，开户-启用-销户、冻结-续冻-解冻、签约-维护-解约，因此业务场景尽量要完整。例如，开销户在设计时逻辑可能会有所差异，在开户时对新开账户和转出账户的客户号一致没有进行判断，但是在支付和销户时却要求客户号一致才能进行交易，因此存在可以开户但是不能销户和进行其他操作的风险。所以在进行案例设计时，虽然改造点是开户交易或者签约交易，但是应尽量对一个完整的业务流程进行测试工作。</p>
<p style="box-sizing: border-box; text-align: left; padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(255,255,255); font-style: normal; text-indent: 0px; margin: 1em 0px; padding-left: 0px; padding-right: 0px; font-family: PingFangSC-Light, 微软雅黑, 微软雅黑, 'Microsoft YaHei', Helvetica, Tahoma, sans-serif; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; white-space: pre-wrap; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); font-size: 16px; cursor: text; font-weight: 400; word-spacing: 0px; padding-top: 0px; font-variant-ligatures: normal; font-variant-caps: normal; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial"><strong style="box-sizing: border-box; font-weight: bolder">5.日期</strong></p>
<p style="box-sizing: border-box; text-align: left; padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(255,255,255); font-style: normal; text-indent: 0px; margin: 1em 0px; padding-left: 0px; padding-right: 0px; font-family: PingFangSC-Light, 微软雅黑, 微软雅黑, 'Microsoft YaHei', Helvetica, Tahoma, sans-serif; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; white-space: pre-wrap; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); font-size: 16px; cursor: text; font-weight: 400; word-spacing: 0px; padding-top: 0px; font-variant-ligatures: normal; font-variant-caps: normal; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial">　　日期在测试时是一个非常重要的因素，也许当天能够做成的交易，切换一下会计日期或者修改一下交易日期就会失败。例如，在测试多级账簿余额调整时，原交易日期为当前会计日期，则交易信息正确，原交易日期小于当前会计日期，则收付款方多级账簿号则显示有误，原因是不同的交易日期对应的程序分支不一样。因此，在设计案例时要充分考虑时间因素对交易的影响，分析是否需要设计各种日期取值。</p>
<p style="box-sizing: border-box; text-align: left; padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(255,255,255); font-style: normal; text-indent: 0px; margin: 1em 0px; padding-left: 0px; padding-right: 0px; font-family: PingFangSC-Light, 微软雅黑, 微软雅黑, 'Microsoft YaHei', Helvetica, Tahoma, sans-serif; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; white-space: pre-wrap; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); font-size: 16px; cursor: text; font-weight: 400; word-spacing: 0px; padding-top: 0px; font-variant-ligatures: normal; font-variant-caps: normal; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial"><strong style="box-sizing: border-box; font-weight: bolder">6.缓存数据</strong></p>
<p style="box-sizing: border-box; text-align: left; padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(255,255,255); font-style: normal; text-indent: 0px; margin: 1em 0px; padding-left: 0px; padding-right: 0px; font-family: PingFangSC-Light, 微软雅黑, 微软雅黑, 'Microsoft YaHei', Helvetica, Tahoma, sans-serif; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; white-space: pre-wrap; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); font-size: 16px; cursor: text; font-weight: 400; word-spacing: 0px; padding-top: 0px; font-variant-ligatures: normal; font-variant-caps: normal; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial">当对测试数据有严格的要求时，例如涉恐信息，应当注意缓存数据的影响。比如先输入一组有效的数据，进行提交，交易进行到一半时终止交易，这时交易信息不会清空，然后修改为无效的测试数据，再进行提交，则有成功的可能性，而这是与业务需求相违背的。因此，当对输入内容有限制时，应确保缓存数据会及时清空或者更新。</p>
<div style="box-sizing: border-box; text-align: center; widows: 2; text-transform: none; background-color: rgb(255,255,255); font-style: normal; text-indent: 0px; font-family: PingFangSC-Light, 微软雅黑, 微软雅黑, 'Microsoft YaHei', Helvetica, Tahoma, sans-serif; white-space: pre-wrap; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); font-size: 16px; cursor: text; font-weight: 400; word-spacing: 0px; font-variant-ligatures: normal; font-variant-caps: normal; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial" class="ql-image-container ql-align-center" contenteditable="false"><img style="box-sizing: border-box; border-bottom-style: none; border-right-style: none; font-family: PingFangSC-Light, 微软雅黑, 微软雅黑, 'Microsoft YaHei', Helvetica, Tahoma, sans-serif; max-width: 600px; border-top-style: none; border-left-style: none" src="https://5b0988e595225.cdn.sohucs.com/images/20191209/904453c3ab9d447791ff5e19fc335434.jpeg"  alt="" /><span style="box-sizing: border-box; position: relative; padding-bottom: 6px; line-height: 20px; font-style: normal; margin: 5px 0px; outline-style: none; outline-color: invert; padding-left: 10px; outline-width: medium; width: 640px; padding-right: 10px; display: inline-block; font-family: PingFangSC-Light, 微软雅黑, 微软雅黑, 'Microsoft YaHei', Helvetica, Tahoma, sans-serif; color: rgb(144,144,144); font-size: 14px; padding-top: 6px" class="img-desc" contenteditable="true" data-desc="">点击添加图片描述（最多60个字）</span></div>
<p style="box-sizing: border-box; text-align: left; padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(255,255,255); font-style: normal; text-indent: 0px; margin: 1em 0px; padding-left: 0px; padding-right: 0px; font-family: PingFangSC-Light, 微软雅黑, 微软雅黑, 'Microsoft YaHei', Helvetica, Tahoma, sans-serif; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; white-space: pre-wrap; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); font-size: 16px; cursor: text; font-weight: 400; word-spacing: 0px; padding-top: 0px; font-variant-ligatures: normal; font-variant-caps: normal; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial"><strong style="box-sizing: border-box; font-weight: bolder">7.测试数据类型</strong></p>
<p style="box-sizing: border-box; text-align: left; padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(255,255,255); font-style: normal; text-indent: 0px; margin: 1em 0px; padding-left: 0px; padding-right: 0px; font-family: PingFangSC-Light, 微软雅黑, 微软雅黑, 'Microsoft YaHei', Helvetica, Tahoma, sans-serif; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; white-space: pre-wrap; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); font-size: 16px; cursor: text; font-weight: 400; word-spacing: 0px; padding-top: 0px; font-variant-ligatures: normal; font-variant-caps: normal; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial">　　测试数据种类要丰富，例如本次改造涉及已到期临时户的情况，那么未到期临时户、已到期基本户、已到期一般户、已到期专用户、注册验资户、已到期外汇账户等等都要进行验证。往往缺陷都发生在关联要素上，而不是改造点本身，因为开发人员在编码时只对改造点进行单元测试，而关联要素则容易被忽略。</p>
<p style="box-sizing: border-box; text-align: left; padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(255,255,255); font-style: normal; text-indent: 0px; margin: 1em 0px; padding-left: 0px; padding-right: 0px; font-family: PingFangSC-Light, 微软雅黑, 微软雅黑, 'Microsoft YaHei', Helvetica, Tahoma, sans-serif; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; white-space: pre-wrap; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); font-size: 16px; cursor: text; font-weight: 400; word-spacing: 0px; padding-top: 0px; font-variant-ligatures: normal; font-variant-caps: normal; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial"><strong style="box-sizing: border-box; font-weight: bolder">8.凭证回单</strong></p>
<p style="box-sizing: border-box; text-align: left; padding-bottom: 0px; widows: 2; text-transform: none; background-color: rgb(255,255,255); font-style: normal; text-indent: 0px; margin: 1em 0px; padding-left: 0px; padding-right: 0px; font-family: PingFangSC-Light, 微软雅黑, 微软雅黑, 'Microsoft YaHei', Helvetica, Tahoma, sans-serif; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; white-space: pre-wrap; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); font-size: 16px; cursor: text; font-weight: 400; word-spacing: 0px; padding-top: 0px; font-variant-ligatures: normal; font-variant-caps: normal; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial">　　凭证回单一定要清晰直观，因此在交易成功后需要检查凭证回单的显示情况。重点应检查当交易信息量较大时用省略号替代的交易信息是否为重要信息，比如金额、账号等，以及印章是否会遮挡住部分重要信息，客户签字是否有足够的空间等问题。<br /><br /><span style="text-align: justify; widows: 2; text-transform: none; background-color: rgb(255,255,255); font-style: normal; text-indent: 0px; display: inline !important; font-family: -apple-system, 'SF UI Text', Arial, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'WenQuanYi Micro Hei', sans-serif; white-space: normal; orphans: 2; float: none; letter-spacing: normal; color: rgb(51,51,51); font-size: 16px; font-weight: 400; word-spacing: 0px; font-variant-ligatures: normal; font-variant-caps: normal; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial">加我VX：atstudyIT&nbsp;&nbsp;回复关键词&#8220;测试&#8221;领取限量软件测试学习资料哦~~</span></p><img src ="http://www.cnitblog.com/shbwf/aggbug/91970.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/shbwf/" target="_blank">51testing</a> 2019-12-09 17:46 <a href="http://www.cnitblog.com/shbwf/articles/91970.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>APP测试中IOS和Android的区别，有哪些注意点？</title><link>http://www.cnitblog.com/shbwf/articles/91255.html</link><dc:creator>51testing</dc:creator><author>51testing</author><pubDate>Wed, 19 Dec 2018 09:25:00 GMT</pubDate><guid>http://www.cnitblog.com/shbwf/articles/91255.html</guid><wfw:comment>http://www.cnitblog.com/shbwf/comments/91255.html</wfw:comment><comments>http://www.cnitblog.com/shbwf/articles/91255.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shbwf/comments/commentRss/91255.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shbwf/services/trackbacks/91255.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 今天我们来聊一聊APP测试中IOS和Android的区别，首先对于手机的操作系统知识尽量有一个了解，测试方法一般也是单元测试，接口测试，软件测试，单元测试。基于app代码，unit，testng都是可以进行单元测试，测试封装的类或者函数接口测试与其他接口测试一致，简单的app，测试一般采用手工测试，如果app模块稳定，可以采用部分自动化测试安装。考虑到用户的一个隐私，尽可能用少的权限，安装后的容量...&nbsp;&nbsp;<a href='http://www.cnitblog.com/shbwf/articles/91255.html'>阅读全文</a><img src ="http://www.cnitblog.com/shbwf/aggbug/91255.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/shbwf/" target="_blank">51testing</a> 2018-12-19 17:25 <a href="http://www.cnitblog.com/shbwf/articles/91255.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>性能测试流程5步走：BS架构和CS架构性能指标大对比</title><link>http://www.cnitblog.com/shbwf/articles/91186.html</link><dc:creator>51testing</dc:creator><author>51testing</author><pubDate>Mon, 22 Oct 2018 09:52:00 GMT</pubDate><guid>http://www.cnitblog.com/shbwf/articles/91186.html</guid><wfw:comment>http://www.cnitblog.com/shbwf/comments/91186.html</wfw:comment><comments>http://www.cnitblog.com/shbwf/articles/91186.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shbwf/comments/commentRss/91186.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shbwf/services/trackbacks/91186.html</trackback:ping><description><![CDATA[<p style="margin-bottom: 1em; list-style-type: none; -webkit-padding-start: 0px; -webkit-margin-before: 0px; -webkit-margin-after: 0px; padding-top: 0px; padding-bottom: 0px; color: #1a1a1a; font-family: -apple-system, BlinkMacSystemFont, &quot;Helvetica Neue&quot;, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Source Han Sans SC&quot;, &quot;Noto Sans CJK SC&quot;, &quot;WenQuanYi Micro Hei&quot;, sans-serif;">性能测试的目的，简单说其实就是为了获取待测系统的响应时间、吞吐量、稳定性、容量等信息。而发现一些具体的性能相关的缺陷（如内存溢出、并发处理等问题），我认为只是一种附加结果。从更高的层次来说，性能测试最想发现的，是瓶颈。如何能得到所需要的信息，就需要从多方面进行测试。</p><p style="margin-top: 5px; margin-bottom: 5px; font-family: sans-serif; font-size: 16px;"><img src="https://pic4.zhimg.com/80/v2-ac14ca39155101883db0231d3b24d916_hd.jpg" zh-lightbox-thumb=""  lazy"="" width="1266" _src="https://pic4.zhimg.com/80/v2-ac14ca39155101883db0231d3b24d916_hd.jpg"  alt="" /></p><p style="margin-top: 1em; margin-bottom: 1em; list-style-type: none; -webkit-padding-start: 0px; -webkit-margin-before: 0px; -webkit-margin-after: 0px; padding-top: 0px; padding-bottom: 0px; color: #1a1a1a; font-family: -apple-system, BlinkMacSystemFont, &quot;Helvetica Neue&quot;, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Source Han Sans SC&quot;, &quot;Noto Sans CJK SC&quot;, &quot;WenQuanYi Micro Hei&quot;, sans-serif;">拿到一个性能测试任务的时候，我们首先需要明确我们的测试目标和输出结果是什么；没有计划的开始注定是失败的。做性能测试需要一个规范的流程，划分清各个阶段需要做哪些工作，这样我们在接到一个任务时就不会手忙脚乱。</p><p style="margin-top: 1em; margin-bottom: 1em; list-style-type: none; -webkit-padding-start: 0px; -webkit-margin-before: 0px; -webkit-margin-after: 0px; padding-top: 0px; padding-bottom: 0px; color: #1a1a1a; font-family: -apple-system, BlinkMacSystemFont, &quot;Helvetica Neue&quot;, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Source Han Sans SC&quot;, &quot;Noto Sans CJK SC&quot;, &quot;WenQuanYi Micro Hei&quot;, sans-serif;"><span style="font-weight: 600;">性能测试流程大致分为一下几个阶段：</span></p><p style="margin-top: 1em; margin-bottom: 1em; list-style-type: none; -webkit-padding-start: 0px; -webkit-margin-before: 0px; -webkit-margin-after: 0px; padding-top: 0px; padding-bottom: 0px; color: #1a1a1a; font-family: -apple-system, BlinkMacSystemFont, &quot;Helvetica Neue&quot;, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Source Han Sans SC&quot;, &quot;Noto Sans CJK SC&quot;, &quot;WenQuanYi Micro Hei&quot;, sans-serif;">1、测试准备</p><p style="margin-top: 1em; margin-bottom: 1em; list-style-type: none; -webkit-padding-start: 0px; -webkit-margin-before: 0px; -webkit-margin-after: 0px; padding-top: 0px; padding-bottom: 0px; color: #1a1a1a; font-family: -apple-system, BlinkMacSystemFont, &quot;Helvetica Neue&quot;, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Source Han Sans SC&quot;, &quot;Noto Sans CJK SC&quot;, &quot;WenQuanYi Micro Hei&quot;, sans-serif;">2、脚本开发与调试</p><p style="margin-top: 1em; margin-bottom: 1em; list-style-type: none; -webkit-padding-start: 0px; -webkit-margin-before: 0px; -webkit-margin-after: 0px; padding-top: 0px; padding-bottom: 0px; color: #1a1a1a; font-family: -apple-system, BlinkMacSystemFont, &quot;Helvetica Neue&quot;, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Source Han Sans SC&quot;, &quot;Noto Sans CJK SC&quot;, &quot;WenQuanYi Micro Hei&quot;, sans-serif;">3、测试执行</p><p style="margin-top: 1em; margin-bottom: 1em; list-style-type: none; -webkit-padding-start: 0px; -webkit-margin-before: 0px; -webkit-margin-after: 0px; padding-top: 0px; padding-bottom: 0px; color: #1a1a1a; font-family: -apple-system, BlinkMacSystemFont, &quot;Helvetica Neue&quot;, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Source Han Sans SC&quot;, &quot;Noto Sans CJK SC&quot;, &quot;WenQuanYi Micro Hei&quot;, sans-serif;">4、测试结果评估</p><p style="margin-top: 1em; margin-bottom: 1em; list-style-type: none; -webkit-padding-start: 0px; -webkit-margin-before: 0px; -webkit-margin-after: 0px; padding-top: 0px; padding-bottom: 0px; color: #1a1a1a; font-family: -apple-system, BlinkMacSystemFont, &quot;Helvetica Neue&quot;, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Source Han Sans SC&quot;, &quot;Noto Sans CJK SC&quot;, &quot;WenQuanYi Micro Hei&quot;, sans-serif;">5、测试后跟踪</p><p style="margin-top: 1em; margin-bottom: 1em; list-style-type: none; -webkit-padding-start: 0px; -webkit-margin-before: 0px; -webkit-margin-after: 0px; padding-top: 0px; padding-bottom: 0px; color: #1a1a1a; font-family: -apple-system, BlinkMacSystemFont, &quot;Helvetica Neue&quot;, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Source Han Sans SC&quot;, &quot;Noto Sans CJK SC&quot;, &quot;WenQuanYi Micro Hei&quot;, sans-serif;">测试准备包括：</p><p style="margin-top: 1em; margin-bottom: 1em; list-style-type: none; -webkit-padding-start: 0px; -webkit-margin-before: 0px; -webkit-margin-after: 0px; padding-top: 0px; padding-bottom: 0px; color: #1a1a1a; font-family: -apple-system, BlinkMacSystemFont, &quot;Helvetica Neue&quot;, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Source Han Sans SC&quot;, &quot;Noto Sans CJK SC&quot;, &quot;WenQuanYi Micro Hei&quot;, sans-serif;">1、测试目标：</p><p style="margin-top: 1em; margin-bottom: 1em; list-style-type: none; -webkit-padding-start: 0px; -webkit-margin-before: 0px; -webkit-margin-after: 0px; padding-top: 0px; padding-bottom: 0px; color: #1a1a1a; font-family: -apple-system, BlinkMacSystemFont, &quot;Helvetica Neue&quot;, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Source Han Sans SC&quot;, &quot;Noto Sans CJK SC&quot;, &quot;WenQuanYi Micro Hei&quot;, sans-serif;">从需求文档或者用户获取：并发用户数，事务吞吐需求，响应时间需求，系统占用资源需求，可扩展性需求等；</p><p style="margin-top: 1em; margin-bottom: 1em; list-style-type: none; -webkit-padding-start: 0px; -webkit-margin-before: 0px; -webkit-margin-after: 0px; padding-top: 0px; padding-bottom: 0px; color: #1a1a1a; font-family: -apple-system, BlinkMacSystemFont, &quot;Helvetica Neue&quot;, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Source Han Sans SC&quot;, &quot;Noto Sans CJK SC&quot;, &quot;WenQuanYi Micro Hei&quot;, sans-serif;">2、应用软件：</p><p style="margin-top: 1em; margin-bottom: 1em; list-style-type: none; -webkit-padding-start: 0px; -webkit-margin-before: 0px; -webkit-margin-after: 0px; padding-top: 0px; padding-bottom: 0px; color: #1a1a1a; font-family: -apple-system, BlinkMacSystemFont, &quot;Helvetica Neue&quot;, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Source Han Sans SC&quot;, &quot;Noto Sans CJK SC&quot;, &quot;WenQuanYi Micro Hei&quot;, sans-serif;">从开发人员获取：系统整体架构（BS/CS），采用开发语言，通信协议，动态session，验证码等；</p><p style="margin-top: 1em; margin-bottom: 1em; list-style-type: none; -webkit-padding-start: 0px; -webkit-margin-before: 0px; -webkit-margin-after: 0px; padding-top: 0px; padding-bottom: 0px; color: #1a1a1a; font-family: -apple-system, BlinkMacSystemFont, &quot;Helvetica Neue&quot;, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Source Han Sans SC&quot;, &quot;Noto Sans CJK SC&quot;, &quot;WenQuanYi Micro Hei&quot;, sans-serif;">3、系统部署平台：</p><p style="margin-top: 1em; margin-bottom: 1em; list-style-type: none; -webkit-padding-start: 0px; -webkit-margin-before: 0px; -webkit-margin-after: 0px; padding-top: 0px; padding-bottom: 0px; color: #1a1a1a; font-family: -apple-system, BlinkMacSystemFont, &quot;Helvetica Neue&quot;, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Source Han Sans SC&quot;, &quot;Noto Sans CJK SC&quot;, &quot;WenQuanYi Micro Hei&quot;, sans-serif;">从运维人员获取：物理部署（局域网/虚拟机），硬件架构（CPU/MEM/IO），操作系统，数据库（版本/启动参数/存储布局），中间件（参数配置），部署模式等；</p><p style="margin-top: 1em; margin-bottom: 1em; list-style-type: none; -webkit-padding-start: 0px; -webkit-margin-before: 0px; -webkit-margin-after: 0px; padding-top: 0px; padding-bottom: 0px; color: #1a1a1a; font-family: -apple-system, BlinkMacSystemFont, &quot;Helvetica Neue&quot;, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Source Han Sans SC&quot;, &quot;Noto Sans CJK SC&quot;, &quot;WenQuanYi Micro Hei&quot;, sans-serif;">4、系统负载模型：</p><p style="margin-top: 1em; margin-bottom: 1em; list-style-type: none; -webkit-padding-start: 0px; -webkit-margin-before: 0px; -webkit-margin-after: 0px; padding-top: 0px; padding-bottom: 0px; color: #1a1a1a; font-family: -apple-system, BlinkMacSystemFont, &quot;Helvetica Neue&quot;, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Source Han Sans SC&quot;, &quot;Noto Sans CJK SC&quot;, &quot;WenQuanYi Micro Hei&quot;, sans-serif;">通过调研获取：从业务层面选取关键用例吞吐率以及用户行为习惯，确定测试流程及流程业务比例；从系统负载方面了解高峰/平常场景吞吐率；</p><p style="margin-top: 1em; margin-bottom: 1em; list-style-type: none; -webkit-padding-start: 0px; -webkit-margin-before: 0px; -webkit-margin-after: 0px; padding-top: 0px; padding-bottom: 0px; color: #1a1a1a; font-family: -apple-system, BlinkMacSystemFont, &quot;Helvetica Neue&quot;, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Source Han Sans SC&quot;, &quot;Noto Sans CJK SC&quot;, &quot;WenQuanYi Micro Hei&quot;, sans-serif;">5、制定测试计划和测试方案</p><p style="margin-top: 1em; margin-bottom: 1em; list-style-type: none; -webkit-padding-start: 0px; -webkit-margin-before: 0px; -webkit-margin-after: 0px; padding-top: 0px; padding-bottom: 0px; color: #1a1a1a; font-family: -apple-system, BlinkMacSystemFont, &quot;Helvetica Neue&quot;, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Source Han Sans SC&quot;, &quot;Noto Sans CJK SC&quot;, &quot;WenQuanYi Micro Hei&quot;, sans-serif;">测试脚本是做好性能测试的基础，监控结果是性能测试的关键；扎实的代码基础和熟练掌握监控结果的收集和分析是性能测试的保障；系统上线后，对实际负载与性能情况和测试过程中做比较总结经验也是学习提高的好方法。</p><p style="margin-top: 1em; margin-bottom: 1em; list-style-type: none; -webkit-padding-start: 0px; -webkit-margin-before: 0px; -webkit-margin-after: 0px; padding-top: 0px; padding-bottom: 0px; color: #1a1a1a; font-family: -apple-system, BlinkMacSystemFont, &quot;Helvetica Neue&quot;, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Source Han Sans SC&quot;, &quot;Noto Sans CJK SC&quot;, &quot;WenQuanYi Micro Hei&quot;, sans-serif;"><span style="font-weight: 600;">在实际中作中我们经常会对两种类型软件进行测试：bs和cs，这两方面的性能指标一般需要哪些内容呢？</span><br /><span style="font-weight: 600;">Bs结构程序一般会关注的通用指标如下（简）：</span><br />Web服务器指标指标：<br />* Avg Rps: 平均每秒钟响应次数＝总请求时间 / 秒数；<br />* Avg time to last byte per terstion （mstes）:平均每秒业务角本的迭代次数 ,有人会把这两者混淆；<br />* Successful Rounds：成功的请求；<br />* Failed Rounds ：失败的请求；<br />* Successful Hits ：成功的点击次数；<br />* Failed Hits ：失败的点击次数；<br />* Hits Per Second ：每秒点击次数；<br />* Successful Hits Per Second ：每秒成功的点击次数；<br />* Failed Hits Per Second ：每秒失败的点击次数；<br />* Attempted Connections ：尝试链接数；<br /><span style="font-weight: 600;">CS结构程序，由于一般软件后台通常为数据库，所以我们更注重数据库的测试指标：</span><br />* User 0 Connections ：用户连接数，也就是数据库的连接数量；<br />* Number of deadlocks：数据库死锁；<br />* Butter Cache hit ：数据库Cache的命中情况<br />当然，在实际中我们还会察看多用户测试情况下的内存，CPU，系统资源调用情况。这些指标其实是引申出来性能测试中的一种：竞争测试。什么是竞争测试，软件竞争使用各种资源（数据纪录，内存等），看他与其他相关系统对资源的争夺能力。<br />我们知道软件架构在实际测试中制约着测试策略和工具的选择。如何选择性能测试策略是我们在实际工作中需要了解的。</p><p style="margin-top: 1em; margin-bottom: 1em; list-style-type: none; -webkit-padding-start: 0px; -webkit-margin-before: 0px; -webkit-margin-after: 0px; padding-top: 0px; padding-bottom: 0px; color: #1a1a1a; font-family: -apple-system, BlinkMacSystemFont, &quot;Helvetica Neue&quot;, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Source Han Sans SC&quot;, &quot;Noto Sans CJK SC&quot;, &quot;WenQuanYi Micro Hei&quot;, sans-serif;"><span style="font-weight: 600;">一般软件可以按照系统架构分成几种类型：</span><br />c/s<br />client/Server 客户端/服务器架构<br />基于客户端/服务器的三层架构<br />基于客户端/服务器的分布式架构<br />b/s<br />基于浏览器/Web服务器的三层架构<br />基于中间件应用服务器的三层架构l<br />基于Web服务器和中间件的多层架构l</p><p style="margin-top: 1em; margin-bottom: 1em; list-style-type: none; -webkit-padding-start: 0px; -webkit-margin-before: 0px; -webkit-margin-after: 0px; padding-top: 0px; padding-bottom: 0px; color: #1a1a1a; font-family: -apple-system, BlinkMacSystemFont, &quot;Helvetica Neue&quot;, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Source Han Sans SC&quot;, &quot;Noto Sans CJK SC&quot;, &quot;WenQuanYi Micro Hei&quot;, sans-serif;"><span style="font-weight: 600;">总结：</span></p><p style="margin-top: 1em; margin-bottom: 1em; list-style-type: none; -webkit-padding-start: 0px; -webkit-margin-before: 0px; -webkit-margin-after: 0px; padding-top: 0px; padding-bottom: 0px; color: #1a1a1a; font-family: -apple-system, BlinkMacSystemFont, &quot;Helvetica Neue&quot;, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Source Han Sans SC&quot;, &quot;Noto Sans CJK SC&quot;, &quot;WenQuanYi Micro Hei&quot;, sans-serif;">总的来说，我认为，性能测试的难度主要不在技术手段上，互联网时代技术都是共享的，要善于去搜索利用他人的成果。即使自己搞不定，团队内一定还有专业的开发工程师、数据库管理员、系统管理员可以帮你搞定。真正的难点在于，你要想出来如何去测是有效的、有保障的，这才是测试工程师最重要的能力。</p><p style="margin-top: 1em; list-style-type: none; -webkit-padding-start: 0px; -webkit-margin-before: 0px; -webkit-margin-after: 0px; padding-top: 0px; padding-bottom: 0px; color: #1a1a1a; font-family: -apple-system, BlinkMacSystemFont, &quot;Helvetica Neue&quot;, &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, &quot;Source Han Sans SC&quot;, &quot;Noto Sans CJK SC&quot;, &quot;WenQuanYi Micro Hei&quot;, sans-serif;">还是那个观点，思想才是根本。</p><p style="margin-top: 5px; margin-bottom: 5px; font-family: sans-serif; font-size: 16px;">&#8203;<br /></p><p style="margin-top: 5px; margin-bottom: 5px; font-family: sans-serif; font-size: 16px;"><span style="color: #666666; text-align: justify; font-family: 微软雅黑;">欢迎加入 &nbsp;51软件测试大家庭，在这里你将获得【最新行业资讯】，【免费测试工具安装包】，【软件测试技术干货】，【面试求职技巧】... 51与你共同学习，一起成长！期待你的加入： QQ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #666666; text-align: justify; font-family: 微软雅黑; font-size: 14px;">群：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #666666; text-align: justify; font-family: 微软雅黑; font-size: 14px;">755431660</span></p><img src ="http://www.cnitblog.com/shbwf/aggbug/91186.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/shbwf/" target="_blank">51testing</a> 2018-10-22 17:52 <a href="http://www.cnitblog.com/shbwf/articles/91186.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>谈谈我对自动化测试的认识</title><link>http://www.cnitblog.com/shbwf/articles/91066.html</link><dc:creator>51testing</dc:creator><author>51testing</author><pubDate>Thu, 21 Jun 2018 10:30:00 GMT</pubDate><guid>http://www.cnitblog.com/shbwf/articles/91066.html</guid><wfw:comment>http://www.cnitblog.com/shbwf/comments/91066.html</wfw:comment><comments>http://www.cnitblog.com/shbwf/articles/91066.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shbwf/comments/commentRss/91066.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shbwf/services/trackbacks/91066.html</trackback:ping><description><![CDATA[<span style="color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;">&nbsp; &nbsp; &nbsp;转载：http://www.51testing.com/html/89/n-3725989.html</span><br style="box-sizing: border-box; color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;" /><span style="color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;">　　作者：严北</span><br style="box-sizing: border-box; color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;" /><span style="color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;">　　</span><strong style="box-sizing: border-box; color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;">先写总结</strong><br style="box-sizing: border-box; color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;" /><span style="color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;">　　自动化测试能够将测试用例固化为代码，方便回归测试；</span><br style="box-sizing: border-box; color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;" /><span style="color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;">　　开展自动化测试前，先分析测试项目在开发的哪个阶段，是否适合做自动化测试，适合做哪类自动化测试；</span><br style="box-sizing: border-box; color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;" /><span style="color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;">　　不要盲目以UI自动化测试为入口企图打开自动化测试大门，UI自动化适合前端稳定的产品，否则维护成本高；</span><br style="box-sizing: border-box; color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;" /><span style="color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;">　　接口测试能够在早期介入开发流程，并且维护成本低于UI自动化测试；另外接口自动化测试有机会输入前端限制外的参数，能够发现更多问题；</span><br style="box-sizing: border-box; color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;" /><span style="color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;">　　自动化测试应当在测试理论扎实的基础上进行，与手工测试相比只是实现方式不同，终归要有测试的完整过程，不要只进行&#8220;自动化&#8221;而不测试；</span><br style="box-sizing: border-box; color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;" /><span style="color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;">　　自动化测试不在于学习多少工具，而在于如何将测试用例代码化，切勿陷入学习各种工具的怪圈，否则大多数情况下遇到的问题都是因为工具不会用、环境没配置对，除了浪费时间就是浪费时间；</span><br style="box-sizing: border-box; color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;" /><span style="color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;">　　自动化测试必须会写代码，不想学代码的请勿尝试，合格的自动化测试工程师不会使用框框去限定自己的输入与业务逻辑！</span><br style="box-sizing: border-box; color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;" /><span style="color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;">　　</span><strong style="box-sizing: border-box; color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;">正文</strong><br style="box-sizing: border-box; color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;" /><span style="color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;">　　谈到自动化测试，有很多朋友对自动化测试不够理解，或是存在误解，导致工作方向不对，或是操作流程不够规范，导致陷入死胡同，不知道如何去做好，甚至不知道如何开展自动化测试。</span><br style="box-sizing: border-box; color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;" /><span style="color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;">　　</span><strong style="box-sizing: border-box; color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;">功能测试过程</strong><br style="box-sizing: border-box; color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;" /><span style="color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;">　　自动化测试实际上测的也是功能，只是将功能测试从手工转化为代码执行，因此自动化测试必须遵从功能测试的操作过程。</span><br style="box-sizing: border-box; color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;" /><span style="color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;">　　功能测试的基本工作包括：</span><br style="box-sizing: border-box; color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;" /><span style="color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;">　　1.分析功能点，创建测试用例；</span><br style="box-sizing: border-box; color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;" /><span style="color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;">　　2.执行测试用例；</span><br style="box-sizing: border-box; color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;" /><span style="color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;">　　3.输出测试结果/报告。</span><br style="box-sizing: border-box; color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;" /><span style="color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;">　　4.测试用例应当至少包括：</span><br style="box-sizing: border-box; color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;" /><span style="color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;">　　测试场景</span><br style="box-sizing: border-box; color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;" /><span style="color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;">　　前置条件</span><br style="box-sizing: border-box; color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;" /><span style="color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;">　　执行步骤</span><br style="box-sizing: border-box; color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;" /><span style="color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;">　　预期结果</span><br style="box-sizing: border-box; color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;" /><span style="color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;">　　实际结果</span><br style="box-sizing: border-box; color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;" /><span style="color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;">　　</span><strong style="box-sizing: border-box; color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;">自动化测试</strong><br style="box-sizing: border-box; color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;" /><span style="color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;">　　这里所说的自动化测试仅包括两个方面，一个是UI自动化测试，一个是接口自动化测试。二者都是对产品功能上的测试，也非白盒测试。</span><br style="box-sizing: border-box; color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;" /><span style="color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;">　　更有意义的自动化测试在于单元测试，但是单元测试一般需要有开发人员的配合，因此此处不谈。</span><br style="box-sizing: border-box; color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;" /><span style="color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;">　　手工测试即大部分人所说的&#8220;点点点&#8221;、&#8220;功能测试&#8221;，而自动化测试则是将这部分工作用代码实现的过程。</span><br style="box-sizing: border-box; color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;" /><span style="color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;">　　那么文章开头提到的误区在哪儿呢？</span><br style="box-sizing: border-box; color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;" /><span style="color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;">　　</span><strong style="box-sizing: border-box; color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;">一是测试对象的选择</strong><br style="box-sizing: border-box; color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;" /><span style="color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;">　　这里所说的测试对象，是指测试页面上直观的功能(UI)，还是测试请求上的数据交互(接口)。</span><br style="box-sizing: border-box; color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;" /><span style="color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;">　　见到很多朋友，在尝试做自动化测试的时候，完全不对产品分析，直接选择了UI自动化测试，原因是网上大部分自动化测试所提到的，都是selenium/appium等使用。</span><br style="box-sizing: border-box; color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;" /><span style="color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;">　　首先要明白，测试是为产品服务，产品的特性决定了测试执行的方向。UI测试并不适用于大部分未稳定的产品！</span><br style="box-sizing: border-box; color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;" /><span style="color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;">　　试想，当你所测试的产品正在研发初始阶段，页面仍在摸索阶段，可能今天一个页面是这些元素，明天这些元素名通用都改了名，或者干脆页面删掉重做了。那你作为测试该怎么办，前端开发时候能否顾及到通知测试，而测试是要让开发为你把修改了的元素、功能重写，还是你要付出重写一个新页面的测试脚本的精力？</span><br style="box-sizing: border-box; color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;" /><span style="color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;">　　相比之下，接口测试需要的维护成本是较低的。如果接口需要改动，通常是一些传值或响应内容的改动，在代码中只需要进行部分修改即可，而对UI测试时往往需要更多步骤。</span><br style="box-sizing: border-box; color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;" /><span style="color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;">　　但是接口测试也不是万能的，例如一个后端稳定，问题大部分出自前端的时候，做好页面测试是更有必要的。</span><br style="box-sizing: border-box; color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;" /><span style="color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;">　　通常来说，先做好对后端的测试(接口测试)，再对前端测试(UI)是比较好的选择，但是一定要做更符合自己产品的测试。当后端稳定时，前端也会相对稳定，可以继续开展对前端的测试了，此时的维护成本就比过早介入UI自动化测试的成本来得低。</span><br style="box-sizing: border-box; color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;" /><strong style="box-sizing: border-box; color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;">　　第二个误区是测试过程不够完善</strong><br style="box-sizing: border-box; color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;" /><span style="color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;">　　有很大一部分刚开始做自动化测试的朋友都将&#8220;自动化测试&#8221;做成了&#8220;自动执行点击操作&#8221;。有什么区别呢？参照功能测试过程一节，测试不仅仅是执行过程，还包括结果判定，报告输出等等环节。很多人在做UI自动化测试时候，只考虑如何实现某个拟人过程，实现之后就认为这个功能点写完了，然后继续写下一个功能点。在执行过程需要人盯着，看看执行时候是否出错，试问这是&#8220;自动化&#8221;吗？</span><br style="box-sizing: border-box; color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;" /><span style="color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;">　　自动化测试一定要有断言，并且输出测试结果/报告，才能解放&#8220;人眼&#8221;，让测试脚本自己运行，运行完成后告诉你结果，并且能够让你快速准确地定位到问题所在。</span><br style="box-sizing: border-box; color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;" /><span style="color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;">　　不够完善还体现在测试用例设计上。测试用例是基本，否则手工测试都做不好谈何&#8220;自动化&#8221;？</span><br style="box-sizing: border-box; color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;" /><span style="color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;">　　有心的话，看懂开发代码，特别是判定条件，保证对每一个条件的覆盖，才能发现更多问题。测试用例设计得好，即使不开展自动化测试也能发现很多问题。自动化测试可以作为协助手段，帮助覆盖一些在前端无法或难实现的一些用例（例如一些条件需要遍历，用代码很容易实现，而手工可能需要操作很久）。</span><br style="box-sizing: border-box; color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;" /><span style="color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;">　　</span><strong style="box-sizing: border-box; color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;">总结</strong><br style="box-sizing: border-box; color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;" /><span style="color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;">　　自动化测试与手工测试相比有两个好处：</span><br style="box-sizing: border-box; color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;" /><span style="color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;">　　将测试用例固化成代码，方便回归</span><br style="box-sizing: border-box; color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;" /><span style="color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;">　　能够执行人工不易覆盖的测试用例</span><br style="box-sizing: border-box; color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;" /><span style="color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;">　　说到底，自动化测试是用于提升测试效率，并不是用于标榜自动化测试比手工测试优秀。如果你的自动化测试用例覆盖率低，说实话，如何编写测试用例更适合你学习，而非&#8220;如何完成某个点击操作&#8221;，&#8220;如何为某个输入框赋值&#8221;。</span><br style="box-sizing: border-box; color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;" /><span style="color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;">　　当你解决了&#8220;测试对象的选择&#8221;（怎么做自动化测试）和&#8220;测试过程不够完善&#8221;（怎么做好自动化测试）这两个问题，自动化测试的优势才能提现出来。</span><br style="box-sizing: border-box; color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;" /><p style="box-sizing: border-box; font-size: 16px; color: #4f4f4f; line-height: 26px; min-height: 26px; margin-bottom: 16px; text-align: justify; padding-top: 0px; padding-bottom: 0px; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun;">　　更重要的是要因材施教，针对不同的测试产品采用不同的测试方法，用努力提高效率的心态去分析测试对象，选择测试工具，才能保证你在测试工作中的付出与收获能成正比。<br /><br /><img src="http://www.cnitblog.com/images/cnitblog_com/shbwf/1111.png" border="0" alt="" /></p><span style="color: #4f4f4f; font-family: &quot;PingFang SC&quot;, &quot;Microsoft YaHei&quot;, SimHei, Arial, SimSun; font-size: 16px;">　　如果有任何疑问，欢迎添加qq群测试入门到大神755431660共同学习~</span><img src ="http://www.cnitblog.com/shbwf/aggbug/91066.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/shbwf/" target="_blank">51testing</a> 2018-06-21 18:30 <a href="http://www.cnitblog.com/shbwf/articles/91066.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>测试，不要无止境的探索</title><link>http://www.cnitblog.com/shbwf/articles/91061.html</link><dc:creator>51testing</dc:creator><author>51testing</author><pubDate>Tue, 19 Jun 2018 06:29:00 GMT</pubDate><guid>http://www.cnitblog.com/shbwf/articles/91061.html</guid><wfw:comment>http://www.cnitblog.com/shbwf/comments/91061.html</wfw:comment><comments>http://www.cnitblog.com/shbwf/articles/91061.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shbwf/comments/commentRss/91061.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shbwf/services/trackbacks/91061.html</trackback:ping><description><![CDATA[<div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">最近突然发现一个不大不小的问题，就是新同事，甚至是有一定经验的同事都喜欢沉浸在探索bug的世界中不能自拔。乍一听这不是好事吗？<a target="_self" style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;color:#111010;&quot;;">测试</a>人员不就是找bug的吗？</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　简单来说就是这种探索超出了范围（如用户需求，时间成本，人力成本等）。如果单纯的站在测试的角度来说那么没问题，测试人员可以无止境的探索可能的问题，但问题是现实中不需要或者说不能如此，测试的标准一定是要基于用户需求的，即使你自己就是用户，你也不可能要求不计成本的保证一个系统100%完美。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　举个例子，假如有一个系统是用来处理订单，用户实际使用时处理的订单量并不大，同时使用的用户数也不多，如果你非得测测系统的并发、吞吐量之类的case那就是没事找事，甚至还提一堆性能bug，那都是完全没有必要的。当然这也可以归结于需求不明确，或者说测试人员对需求理解得不够。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　要从商业利益的角度考虑。有些情况确实有一些问题，而且也几乎可以判断这是用户关心的，但是需求上没说，用户自己也并没有提出来，这时就要根据情况处理了，不能说有问题就一定要报告，就一定要修复，有的时候合同可能已经签完，再有超出需求的改动是要另算的，这涉及到公司的利益问题，当然了，如果单纯的作为一名测试人员也可以将问题提出来，至于如何处理就留待领导决定。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　很多情况（用例）只存在于测试者眼中，我们应该根据情况有所为有所不为，特别是时间比较紧张的时候，如果你过多的探索不需要探索的区域那么肯定就会给其它重要的区域带来测试风险，这反而违背了你&#8220;做好事&#8221;的初衷。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　如何改进测试方式和避免盲目探索呢？当然是熟悉需求，多熟悉系统相关的行业和业务逻辑，比如物流、餐饮、财务等等，对行业相关的业务有一定了解后你甚至可以判断出哪些部分是用户最关注的，从而有的放矢，避免吃力不讨好。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　总而言之，测试的原则应该是在有限的时间内找出最有价值的bug。<br style="word-wrap: break-word;" />&#8203;如果有任何疑问，欢迎添加qq群测试入门到大神 755431660 共同学习~<br style="word-wrap: break-word;" />&#8203;<img src="http://blog.chinaunix.net/attachment/201806/19/29734443_1529389165HA8R.png" data-ke-src="/attachment/201806/19/29734443_1529389165HA8R.png" width="627" height="517" alt="" style="word-wrap: break-word; border: 0px;" /></div><img src ="http://www.cnitblog.com/shbwf/aggbug/91061.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/shbwf/" target="_blank">51testing</a> 2018-06-19 14:29 <a href="http://www.cnitblog.com/shbwf/articles/91061.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>非计算机专业测试之路</title><link>http://www.cnitblog.com/shbwf/articles/91055.html</link><dc:creator>51testing</dc:creator><author>51testing</author><pubDate>Wed, 13 Jun 2018 03:37:00 GMT</pubDate><guid>http://www.cnitblog.com/shbwf/articles/91055.html</guid><wfw:comment>http://www.cnitblog.com/shbwf/comments/91055.html</wfw:comment><comments>http://www.cnitblog.com/shbwf/articles/91055.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shbwf/comments/commentRss/91055.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shbwf/services/trackbacks/91055.html</trackback:ping><description><![CDATA[<p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">今年貌似行情不好，互联网行业就业越来越难，而且要求也越来越高了。就测试行业而言吧，任何一个招聘岗位描述都是要会java, python, webdriver页面自动化或是Appium手机自动化等，好像不会编码就很难找到工作，为什么会这样呢？</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">前几年测试刚刚火起来的时候，要求确实比较低，所以不少人都看中了这个行业，随之而生的各种测试培训班也成功地帮助不少人转行到了测试。可是经过这两年的检测，发现了培训班出来的人员能力有限，慢慢的就提高了要求。说实话，培训班就是快餐生产方式，他可以帮你从其他行业快速来转到测试这个行业来，只个领路人，给你展示一下测试都是怎么做的，需要哪方面的技术&nbsp;，可是如同读一本书，你只看书本就以为读懂了或是掌握了书的内容，那是很可笑的。</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><strong style="word-wrap: break-word; margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">在我工作当中也遇到了不少从培训班出来的同学，整体来说他们有如下的共同点：</strong></p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">1，计算机基础知识比较差，不少计算机的正常操作都是他们的障碍。</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">2，不能清醒地认识自己，在培班班跟着老师写了一些儿程序，以为自己就会了，其实只是模仿而且，完全没有自己的思路，还自我感觉良好。</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">3，缺乏学习能力，证明自己的方法错误。有不少同学知识自己的能力差，为了表现自己就花大时间来做需求，可是就不出成绩，没有找到学习的方向。</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">4，由于能力有限，不能好好地表达问题。由于自己的能力有限，不能很好地定位问题，与其他人合作的时候表达不清，造成项目延迟，相关人员都要加班。</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">其实不管你是怎么进行测试这个行业的，有的是走培训班，有的是自己找工作的，这都不重要，重要的是你能为公司带来什么？你在工作中有没有成长？现实社会是很残酷的，如果你不成长，不学习，早晚会淘汰你的。下面我就从个人角度出来，来说一说非计算机专业的测试之路应该如何走才会轻松些儿：</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><strong style="word-wrap: break-word; margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;"> 1，理清思路，明确方向。</strong></p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">不管你以前是从事什么行业的，既然你选择了要做测试，就一定看中了测试的特点。无论是工作相对轻松，还是工资稍好一些儿，那就要为了这个目标而去努力，天下没有白吃的午餐，只做日常的工作是很能提升的，要有针对性的提升自己。首先我们要有这个理念，然后才能有明确的行动。</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><strong style="word-wrap: break-word; margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">　2，认清自我，切忌盲目。</strong></p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">测试行业是入门容易，想走远比较难。而我们自己也要反思一下，自己会什么技术，听说过或是在培训班学习的东西，扪心自问，你真的会了吗？现在的培训班为了工作需要一般都会讲手工测试，测试工具的使用，自动化相关的测试，<strong style="word-wrap: break-word; margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;"><u style="word-wrap: break-word; margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">压力测试</u></strong>，服务器的搭建与使用，内容是不错的，但是短短的两三个月你真能都学会吗？任何一项测试都要花费上几年来不断完善的，学会和会用是两码事。</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><strong style="word-wrap: break-word; margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">3，低调做人，有计划地成长</strong></p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">在你的技术能力有限的情况下，面试的时候就不要骄傲了，凡是自我感觉良好，目空一切；而没有真才实学的，根本不可能面试成功的。低调一下，态度良好，就有可能获得工作的机会。不管你以前学会什么，在工作的时候一定要踏实。可以理一下，按下面的顺序有计划地提升自己：</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">&#183;&nbsp;掌握计算机基础知识，操作系统的日常使用，windows or linux;文档办工之类的软件使用，千万不能因为这些儿知识影响了你的工作。</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">&#183;&nbsp;工作方法，与人交流的能力等软技能，不要小看这些儿，它们比技术更重要。说话听不懂，表意不清，生活习惯不好等都会影响你的工作。</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">&#183;&nbsp;常用测试软件的使用。软件只是工具，你不可能掌握所有工作的使用，但是你也不可能不会使用，如果工作需要有快速学习的能力。</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">&#183;&nbsp;基本语言的学习，如python，java，shell等。如果你有能力和兴趣，还是要学习一下的，不用太深，但也不能不会。</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">&#183;&nbsp;开源框架的学习，如webdriver，appium还有其他的一些儿框架，会使用这些解决工作中遇到的问题。</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">&#183;&nbsp;时常与公司的大牛交流学习，本来这个行业就是需要不断学习，跟着牛人学习比自己摸索学习的要快的多。</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><strong style="word-wrap: break-word; margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">　4，要有危机感，防止温水煮青蛙</strong></p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">很多情况下我们通过自己的努力找到了一份工作，然后在工作中就按公司的要求来不断完成自己的任务。不过这远远不够，平时的工作只是你的本职工作，保质保量地完成是必须的。不过还要时刻想着提升一下自己，不然几年后你就会发现，只会公司的相关业务，使用公司的平台和工具，离开了这些你还有什么呢？公司不会管你以前做过什么工作，只会看中你以前的工作能为公司带来什么。明白了这一点儿，你就应该明白要做什么了。</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">最后社会和公司是不相信苦劳的，如果你不能很好地完成工作，影响了项目进度；或是其他人与你合作的时候严重受影响，大家就会给上级反馈情况。当你做到了你部门的人员都不愿意与你合作，提起你来就直摇头的时候，你就离离开公司不远了。就我们公司而言，外包人员三个月不符合要求，就随时可以换掉你；正式员工在试用期不合格，直接走人的。</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">如果有任何疑问，欢迎添加qq群测试入门到大神 755431660 共同学习~</p><img src="http://blog.chinaunix.net/attachment/201806/13/29734443_1528860455V4QW.png" data-ke-src="/attachment/201806/13/29734443_1528860455V4QW.png" width="627" height="517" alt="" style="word-wrap: break-word; border: 0px; font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 16px;" /><br style="word-wrap: break-word; font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 16px;" /><span style="font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 16px;">&#8203;</span><img src ="http://www.cnitblog.com/shbwf/aggbug/91055.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/shbwf/" target="_blank">51testing</a> 2018-06-13 11:37 <a href="http://www.cnitblog.com/shbwf/articles/91055.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一次老系统的Bug解决过程</title><link>http://www.cnitblog.com/shbwf/articles/91042.html</link><dc:creator>51testing</dc:creator><author>51testing</author><pubDate>Mon, 04 Jun 2018 06:22:00 GMT</pubDate><guid>http://www.cnitblog.com/shbwf/articles/91042.html</guid><wfw:comment>http://www.cnitblog.com/shbwf/comments/91042.html</wfw:comment><comments>http://www.cnitblog.com/shbwf/articles/91042.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shbwf/comments/commentRss/91042.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shbwf/services/trackbacks/91042.html</trackback:ping><description><![CDATA[<div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　<strong style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;&quot;;">　系统概要：</strong></div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　1、一台<a target="_self" style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;color:#111010;&quot;;">数据库</a>服务器，SQLServer，没有读写分离，没有进行任何效能的处理</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　2、其中有一张Table，每天客户端大概写入30W笔数据</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　3、报表查询导出功能，Table中大约 3000W笔资料，查询一周时间，大概150~200W笔数据，并生成Excel文件</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　4、数据库操作使用的是ADO.NET</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　<strong style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;&quot;;"><a target="_self" style="word-wrap: break-word; margin: 0px auto; padding: 0px; color: #111010;"><strong style="word-wrap: break-word; margin: 0px auto; padding: 0px;">Bug</strong></a>:</strong></div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　在点击【查询导出】的按钮后，时常会抛出SQLServer的Error 信息，报表导出 NG</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　<strong style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;&quot;;">解决过程：</strong></div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　1、Table 的查询效能问题，建立index，结果 问题依旧</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　2、因为没有进行读写分离，怀疑是否是死锁，观察数据库，不是因为死锁的问题造成的</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　3、建议客户在服务器上新增硬盘，增加一块硬盘，单独供数据库使用，OK后，但问题依然发生</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　4、建议客户增加服务器，使用独立的数据库服务器，读写分离，被客户Pass</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　5、只能牺牲<a target="_self" style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;color:#111010;&quot;;">SQL</a>查询的效能了，comm.CommandTimeout = 0; 在 ADO.NET Command时不设置timeout 限制</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　至此，问题解决，只是查询导出报表的时间可能会变长一点，在不增加客户的硬件成本的情况下，客户接受，那 OK.<br style="word-wrap: break-word;" />&#8203;&nbsp; &nbsp;&nbsp;如果有任何疑问，欢迎添加qq群测试入门到大神 755431660 共同学习~<br style="word-wrap: break-word;" />&#8203;<img src="http://blog.chinaunix.net/attachment/201806/4/29734443_1528092131FOVb.png" data-ke-src="/attachment/201806/4/29734443_1528092131FOVb.png" width="617" height="501" alt="" style="word-wrap: break-word; border: 0px;" /></div><img src ="http://www.cnitblog.com/shbwf/aggbug/91042.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/shbwf/" target="_blank">51testing</a> 2018-06-04 14:22 <a href="http://www.cnitblog.com/shbwf/articles/91042.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>性能测试概述--测试入门指导</title><link>http://www.cnitblog.com/shbwf/articles/91036.html</link><dc:creator>51testing</dc:creator><author>51testing</author><pubDate>Wed, 30 May 2018 03:52:00 GMT</pubDate><guid>http://www.cnitblog.com/shbwf/articles/91036.html</guid><wfw:comment>http://www.cnitblog.com/shbwf/comments/91036.html</wfw:comment><comments>http://www.cnitblog.com/shbwf/articles/91036.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shbwf/comments/commentRss/91036.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shbwf/services/trackbacks/91036.html</trackback:ping><description><![CDATA[<div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e; font-size: 14px;"><strong style="word-wrap: break-word;">　<a target="_self" style="word-wrap: break-word;"><strong style="word-wrap: break-word;">性能测试</strong></a>概述</strong></div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e; font-size: 14px;"><strong style="word-wrap: break-word;">　　性能测试基本概念</strong></div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e; font-size: 14px;">　<strong style="word-wrap: break-word;">　一、性能测试策略：</strong></div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e; font-size: 14px;">　　1.负载测试&#8212;&#8212;load testing</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e; font-size: 14px;">　　 &nbsp; &nbsp;-在一定的软件、硬件及网路环境下，通过改变系统负载方式、增加负载等来发现系统中所存在的性能问题</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e; font-size: 14px;">　　 &nbsp; &nbsp;-用于确定系统所能承载的最大用户数、最佳用户数；关注不同用户数下的系统响应时间及服务器的资源利用率</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e; font-size: 14px;">　　2.压力测试&#8212;&#8212;stress testing</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e; font-size: 14px;">　　 &nbsp; &nbsp;-在一定的软件、硬件及网路环境下，通过模拟大量的虚拟用户向服务器产生负载，使服务器的资源处于极限状态下长时间连续运行</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e; font-size: 14px;">　　 &nbsp; &nbsp;-目的测试服务器在高负载情况下是否能够稳定工作，找出系统最薄弱的环节</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e; font-size: 14px;">　　3.并发测试&#8212;&#8212;concurrency testing</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e; font-size: 14px;">　　 &nbsp; &nbsp;-通过模拟多个用户并发访问同一个应用、同一个存储过程或数据<a target="_self" style="word-wrap: break-word;">记录</a>以及其他并发操作</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e; font-size: 14px;">　　 &nbsp; &nbsp;-测试是否存在死锁、数据错误等故障</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e; font-size: 14px;">　　4.稳定性测试&#8212;&#8212;stability testing</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e; font-size: 14px;">　　 &nbsp; &nbsp;-在一定的软件、硬件及网络环境下，模拟一定数量虚拟用户运行一种或多种业务，长时间的运行（7*24小时）系统</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e; font-size: 14px;">　　 &nbsp; &nbsp;-目的是检测系统在长时间运行下的稳定性和性能相关指标是否符合预期</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e; font-size: 14px;">　<strong style="word-wrap: break-word;">　二、关键性能测试指标：</strong></div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e; font-size: 14px;">　　1.响应时间：response time</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e; font-size: 14px;">　　2.CPU：CPU使用率，CPU队列长度</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e; font-size: 14px;">　　3.内存：内存使用率，内存页交换频率</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e; font-size: 14px;">　　4.磁盘：磁盘使用率，磁盘队列长度</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e; font-size: 14px;">　　5.单位时间处理效率（TPS）</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e; font-size: 14px;">　　6.业务成功率：用户操作成功、失败比率</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e; font-size: 14px;">　　7.最佳用户数，最大用户数</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e; font-size: 14px;">　<strong style="word-wrap: break-word;">　三、性能测试的特点：</strong></div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e; font-size: 14px;">　　用户量大、并发性强、测试运行时间比较久</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e; font-size: 14px;">　　<strong style="word-wrap: break-word;">四、性能测试工具：</strong></div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e; font-size: 14px;">　　1.HP&nbsp;<a target="_self" style="word-wrap: break-word;">LoadRunner</a>:商用软件</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e; font-size: 14px;">　　2.Apache&nbsp;<a target="_self" style="word-wrap: break-word;">Jmeter</a>：开源</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e; font-size: 14px;">　　3.IBM RPT：</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e; font-size: 14px;">　<strong style="word-wrap: break-word;">　五、性能测试核心原理：</strong></div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e; font-size: 14px;">　　1.基于协议&nbsp;</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e; font-size: 14px;">　　2.多线程：一个线程一个用户</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e; font-size: 14px;">　　3.任务调度</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e; font-size: 14px;">　<strong style="word-wrap: break-word;">　六、性能测试的流程：</strong></div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e; font-size: 14px;">　　1.应用系统分析</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e; font-size: 14px;">　　 &nbsp; &nbsp;a.分析被测系统的性能测试点</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e; font-size: 14px;">　　 &nbsp; &nbsp; &nbsp; &nbsp;-用户量大、用户使用比较集中、<a target="_self" style="word-wrap: break-word;">大数据</a>量、系统核心功能考虑性能测试的</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e; font-size: 14px;">　　 &nbsp; &nbsp;b.熟悉性能测试点使用流程和场景</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e; font-size: 14px;">　　 &nbsp; &nbsp;c.性能测试有哪些指标？指标值是多少？</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e; font-size: 14px;">　　 &nbsp; &nbsp; &nbsp; &nbsp;-响应时间、业务成功率、硬件资源占用率</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e; font-size: 14px;">　　 &nbsp; &nbsp; &nbsp; &nbsp;如果没有明确规定：</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e; font-size: 14px;">　　 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;-参考竞品、调研用户、依赖于以往的经验-参考竞品、调研用户、依赖于以往的经验</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e; font-size: 14px;">　　2.性能测试计划: &nbsp;&nbsp;</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e; font-size: 14px;">　　 &nbsp; &nbsp;a.明确测试范围</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e; font-size: 14px;">　　 &nbsp; &nbsp;b.测试资源、如何准备</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e; font-size: 14px;">　　 &nbsp; &nbsp;c.性能测试的工作有哪些、进度安排、负责人</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e; font-size: 14px;">　　 &nbsp; &nbsp;d.性能测试的策略：测试的设计工作，如何完成</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e; font-size: 14px;">　　 &nbsp; &nbsp;e.性能测试的风险</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e; font-size: 14px;">　　 &nbsp; &nbsp;f.性能测试的输出物</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e; font-size: 14px;">　　3.书写用例：</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e; font-size: 14px;">　　 &nbsp; &nbsp;-脚本用例：明确开发哪些脚本，如何去开发脚本</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e; font-size: 14px;">　　 &nbsp; &nbsp;-场景用例：场景就是知道性能测试执行的，要测试哪些用户场景</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e; font-size: 14px;">　　4.创建和优化脚本：</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e; font-size: 14px;">　　5.创建场景：</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e; font-size: 14px;">　　6.运行场景：</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e; font-size: 14px;">　　7.分析测试结果：分析不通过要调优</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e; font-size: 14px;">　　8.测试结束：</div><span style="font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 16px;">&nbsp; &nbsp;&nbsp;</span><span style="word-wrap: break-word; color: #1a1a1a; font-size: 16.5px; letter-spacing: 0.7px; text-align: justify; font-family: Helvetica, 黑体;">如果有任何疑问，欢迎添加qq群测试入门到大神 755431660 共同学习~<br style="word-wrap: break-word;" />&#8203;<img src="http://blog.chinaunix.net/attachment/201805/30/29734443_1527652097NXPV.png" data-ke-src="/attachment/201805/30/29734443_1527652097NXPV.png" width="617" height="501" alt="" style="word-wrap: break-word; border: 0px;" /></span><img src ="http://www.cnitblog.com/shbwf/aggbug/91036.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/shbwf/" target="_blank">51testing</a> 2018-05-30 11:52 <a href="http://www.cnitblog.com/shbwf/articles/91036.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>测试技术老大应该有的修养</title><link>http://www.cnitblog.com/shbwf/articles/91031.html</link><dc:creator>51testing</dc:creator><author>51testing</author><pubDate>Fri, 25 May 2018 05:06:00 GMT</pubDate><guid>http://www.cnitblog.com/shbwf/articles/91031.html</guid><wfw:comment>http://www.cnitblog.com/shbwf/comments/91031.html</wfw:comment><comments>http://www.cnitblog.com/shbwf/articles/91031.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shbwf/comments/commentRss/91031.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shbwf/services/trackbacks/91031.html</trackback:ping><description><![CDATA[<div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　前两篇<a target="_self" style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;color:#111010;&quot;;">文章</a>我们用<a target="_self" style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;color:#111010;&quot;;">面向对象</a>的思想，分析了一个<a target="_self" style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;color:#111010;&quot;;">操作系统</a>的基本构成和设计思路。今天我们继续来聊Web和应用服务器的设计，聊一下怎么高效的利用网络IO和CPU资源。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　<strong style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;&quot;;">　Socket对象</strong></div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　上一篇我们聊到，操作系统通过核心表中的对象来管理网络IO，这个对象就是Socket类。我们来看一下整个读取和发送数据的过程。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　我们把Socket对象比作快递公司，他帮助大家收发各种快件。Socket的IP、端口号和进程ID等信息就是货物的具体地址。当我们寄送快递的时候，快递员上门取货，但是他不会直接送往目的地，而是先送往中转站。为什么要这么做，因为把发往同一个地点的货物合并发送，当然效率更高。Socket发送数据也是如此，他会先将数据发送到缓冲区中，然后再一起发送。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　同样，收快递的时候，货物也会先发送到配送点，然后再由快递员送货上门。Socket接收数据也是如此，会先存在缓冲区中。我们上一篇聊过，核心对象的数据是存在核心态地址空间中，用户进程是没法直接读取的。我们需要把数据从核心态拷贝到用户态，才可以访问。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　<strong style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;&quot;;">　高效Socket读取</strong></div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　Socket的读取和写入默认都是同步的过程，对用户线程来说就是阻塞的。发送数据的情况还好，不会等待多久；读取数据就比较尴尬，因为我们不知道对方什么时候会发送数据，也就不知道要等多久；对一个高性能的Web或者应用服务器来说，解决这个问题就是最重要的。下面我们看看对这块的解决方案是怎么演化的。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　<strong style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;&quot;;">　同步阻塞模型</strong></div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　最简单的方式就是同步阻塞式读取。对应到服务器设计上，每来一个网络请求，我们就生成一个线程来服务。没有请求数据的时候，这个线程就阻塞着。这就是同步阻塞模型。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　同步阻塞模型最大的问题就是，没有数据的时候也要无谓的等待。这种设计的确会浪费线程和Socket资源，但是这种模型足够简单，开发容易。如果并发量并不大的情况，可以考虑采用。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　<strong style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;&quot;;">同步非阻塞模型</strong></div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　我们改进一下，在读取数据之前，先检测一下，如果这时没有数据，就先去干点别的。这就是同步非阻塞模型。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　采用这个模型，只需要Socket读取数据的时候设置成非阻塞就可以。但是这种模型缺点也很大，每个用户线程总要轮询去检测，如果一直没有数据，就白白浪费了计算资源。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　<strong style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;&quot;;">多路复用模型</strong></div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　再优化一下，如果我们只用一个线程去做所有Socket的检测工作，当真正有数据到达的时候，再提醒用户线程去处理。这样就很好的解决了同步非阻塞模型的缺点。这就是多路复用模型。<a target="_self" style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;color:#111010;&quot;;">Linux</a>的epoll就是这样的方式。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　这里我们要考虑一点，多路复用模型只有一个线程做检测工作，增加了服务器处理请求的能力，但是如果并发量并不大的时候，其实性能并没有提高。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;"><strong style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;&quot;;">　　异步模型</strong></div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　前面所说的各种模型，都需要我们自己做大量的工作。有没有一种方式，让操作系统把全部工作承包了呢。当然是有的。操作系统来监听Socket，当有数据到来时，读取这个数据，拷贝数据到用户态进程空间，完成这一切工作后，再来告知我们。这就是异步模型，<a target="_self" style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;color:#111010;&quot;;">Windows</a>操作系统的完成端口模式就是这样的方式。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　总结一下，对服务器设计来说，高效管理网络IO和CPU资源很重要，我们聊了4种不同的模型设计。<br style="word-wrap: break-word;" />&#8203;<img src="http://blog.chinaunix.net/attachment/201805/25/29734443_15272202846sKU.png" data-ke-src="/attachment/201805/25/29734443_15272202846sKU.png" width="402" height="381" alt="" style="word-wrap: break-word; border: 0px;" />&#8203;</div><img src ="http://www.cnitblog.com/shbwf/aggbug/91031.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/shbwf/" target="_blank">51testing</a> 2018-05-25 13:06 <a href="http://www.cnitblog.com/shbwf/articles/91031.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>测试技术老大应该有的修养</title><link>http://www.cnitblog.com/shbwf/articles/91032.html</link><dc:creator>51testing</dc:creator><author>51testing</author><pubDate>Fri, 25 May 2018 05:06:00 GMT</pubDate><guid>http://www.cnitblog.com/shbwf/articles/91032.html</guid><wfw:comment>http://www.cnitblog.com/shbwf/comments/91032.html</wfw:comment><comments>http://www.cnitblog.com/shbwf/articles/91032.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shbwf/comments/commentRss/91032.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shbwf/services/trackbacks/91032.html</trackback:ping><description><![CDATA[<div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　前两篇<a target="_self" style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;color:#111010;&quot;;">文章</a>我们用<a target="_self" style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;color:#111010;&quot;;">面向对象</a>的思想，分析了一个<a target="_self" style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;color:#111010;&quot;;">操作系统</a>的基本构成和设计思路。今天我们继续来聊Web和应用服务器的设计，聊一下怎么高效的利用网络IO和CPU资源。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　<strong style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;&quot;;">　Socket对象</strong></div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　上一篇我们聊到，操作系统通过核心表中的对象来管理网络IO，这个对象就是Socket类。我们来看一下整个读取和发送数据的过程。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　我们把Socket对象比作快递公司，他帮助大家收发各种快件。Socket的IP、端口号和进程ID等信息就是货物的具体地址。当我们寄送快递的时候，快递员上门取货，但是他不会直接送往目的地，而是先送往中转站。为什么要这么做，因为把发往同一个地点的货物合并发送，当然效率更高。Socket发送数据也是如此，他会先将数据发送到缓冲区中，然后再一起发送。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　同样，收快递的时候，货物也会先发送到配送点，然后再由快递员送货上门。Socket接收数据也是如此，会先存在缓冲区中。我们上一篇聊过，核心对象的数据是存在核心态地址空间中，用户进程是没法直接读取的。我们需要把数据从核心态拷贝到用户态，才可以访问。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　<strong style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;&quot;;">　高效Socket读取</strong></div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　Socket的读取和写入默认都是同步的过程，对用户线程来说就是阻塞的。发送数据的情况还好，不会等待多久；读取数据就比较尴尬，因为我们不知道对方什么时候会发送数据，也就不知道要等多久；对一个高性能的Web或者应用服务器来说，解决这个问题就是最重要的。下面我们看看对这块的解决方案是怎么演化的。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　<strong style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;&quot;;">　同步阻塞模型</strong></div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　最简单的方式就是同步阻塞式读取。对应到服务器设计上，每来一个网络请求，我们就生成一个线程来服务。没有请求数据的时候，这个线程就阻塞着。这就是同步阻塞模型。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　同步阻塞模型最大的问题就是，没有数据的时候也要无谓的等待。这种设计的确会浪费线程和Socket资源，但是这种模型足够简单，开发容易。如果并发量并不大的情况，可以考虑采用。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　<strong style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;&quot;;">同步非阻塞模型</strong></div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　我们改进一下，在读取数据之前，先检测一下，如果这时没有数据，就先去干点别的。这就是同步非阻塞模型。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　采用这个模型，只需要Socket读取数据的时候设置成非阻塞就可以。但是这种模型缺点也很大，每个用户线程总要轮询去检测，如果一直没有数据，就白白浪费了计算资源。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　<strong style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;&quot;;">多路复用模型</strong></div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　再优化一下，如果我们只用一个线程去做所有Socket的检测工作，当真正有数据到达的时候，再提醒用户线程去处理。这样就很好的解决了同步非阻塞模型的缺点。这就是多路复用模型。<a target="_self" style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;color:#111010;&quot;;">Linux</a>的epoll就是这样的方式。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　这里我们要考虑一点，多路复用模型只有一个线程做检测工作，增加了服务器处理请求的能力，但是如果并发量并不大的时候，其实性能并没有提高。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;"><strong style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;&quot;;">　　异步模型</strong></div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　前面所说的各种模型，都需要我们自己做大量的工作。有没有一种方式，让操作系统把全部工作承包了呢。当然是有的。操作系统来监听Socket，当有数据到来时，读取这个数据，拷贝数据到用户态进程空间，完成这一切工作后，再来告知我们。这就是异步模型，<a target="_self" style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;color:#111010;&quot;;">Windows</a>操作系统的完成端口模式就是这样的方式。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　总结一下，对服务器设计来说，高效管理网络IO和CPU资源很重要，我们聊了4种不同的模型设计。<br style="word-wrap: break-word;" />&#8203;<img src="http://blog.chinaunix.net/attachment/201805/25/29734443_15272202846sKU.png" data-ke-src="/attachment/201805/25/29734443_15272202846sKU.png" width="402" height="381" alt="" style="word-wrap: break-word; border: 0px;" />&#8203;</div><img src ="http://www.cnitblog.com/shbwf/aggbug/91032.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/shbwf/" target="_blank">51testing</a> 2018-05-25 13:06 <a href="http://www.cnitblog.com/shbwf/articles/91032.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>程序员如何理直气壮的拒绝乱改需求</title><link>http://www.cnitblog.com/shbwf/articles/91029.html</link><dc:creator>51testing</dc:creator><author>51testing</author><pubDate>Thu, 24 May 2018 03:28:00 GMT</pubDate><guid>http://www.cnitblog.com/shbwf/articles/91029.html</guid><wfw:comment>http://www.cnitblog.com/shbwf/comments/91029.html</wfw:comment><comments>http://www.cnitblog.com/shbwf/articles/91029.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shbwf/comments/commentRss/91029.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shbwf/services/trackbacks/91029.html</trackback:ping><description><![CDATA[<div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　或许你听过这样一个段子：一如代码深似海，后面从此有无数的跟句：从此妹子是路人，从此代码是节操&#8230;&#8230;或许，许多写代码的程序员每天应对的就是写不完的代码和改不完的bug。只想说，如果你只需要解决这两件事情算是幸福的了，因为多数程序员同志遭遇的不仅是以上的挑战。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　<strong style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;&quot;;">　以下为正文：</strong></div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　我曾担任过开发人员和项目经理，现在是一家开发咨询公司的CEO。在担任这些角色期间我学到了一个经验教训：过多地屈从于客户的需求、希望和一时的心血来潮，将会限制你实际的工作能力以及正确解决问题的能力。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　<strong style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;&quot;;">　为什么说你需要学会说不，才能让客户和开发项目可以得到最好的结果呢？其中有三个原因：</strong></div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;"><strong style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;&quot;;">　　1. 并非所有客户都适合你的团队</strong></div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　最近，一位客户告诉我他们不愿意支付预付款。我告诉他们可以选择即刻退出而不用付任何费用，我解释说：&#8220;我们提供定制软件，而非定制流程。&#8221;</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　最后，他们没有签约。虽然这在财务上并不是最好的结果，但对我的团队和业务来说这是最好的结果。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　我没有在这个问题上变通并不是我想为难他们，而是因为我们已经开发出了久经考验的流程，而且如果我们希望持续扩大规模和盈利，就不能为了每个客户而调整我们的流程。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　虽然这个问题关系到付款，但是也适用于我们业务的所有方面。如果客户希望由最合适的团队来负责他们的项目，那么他们也必须是我们最合适的客户。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　Forrester的一份报告预测，2018年雇主可能需要为高级开发者和其他急需的人才支付高于市场20%的薪水。在<a target="_self" style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;color:#111010;&quot;;">技术</a>人才短缺的情况下，相对较易找到新客户，但是却很难找到最好的开发人员。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　要求客户同意我们的条款可以帮助我们管理项目，但同时也表明，与有困难的客户的付款相比，我们更加重视我们的开发人员的工作。即便没有新客户我的业务可以照常运转几个月，但是如果所有经验丰富的高级开发人员都离职的话，我们就完蛋了。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　<strong style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;&quot;;">2. 客户付钱聘请的是专家，而不是听话的人</strong></div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　由于害怕失去客户或收到差评，很多领导被迫应允所有事情。然而，如果答应的事情会让团队陷入极大困境的话，那么你面临的风险更高。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　没有人会跑到一家米其林的星级意大利餐厅，然后抱怨厨师不会做印度咖喱。因为你很明白，如果让别人做他们不擅长的事情，那一定无法满足你的期望。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　因此，我和我的团队非常清楚我们提供的服务和不提供的服务。我们只做：PHP、Laravel、Java、Vue.js、Node、Ionic和Electron。这些都是现代的成熟的技术，我们可以快速地构建和扩展产品。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　客户之所以付钱给你，是因为在某些事情上你做得比他们更好、更快。我们经常遇到的一个问题是，客户会拿出很多他们认为对达成目标所必需的功能或整合方案。我们所要做的是拒绝，并向他们展示我们可以用最简单和对用户更友好的方式来实现。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　另一个常见的问题是，客户希望等到产品尽善尽美再开始让用户使用。但这不利于我们的工作。我们利用久经考验的敏捷方式来构建软件，并鼓励客户尽可能在早期让更多真正的用户来使用软件，以便我们做<a target="_self" style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;color:#111010;&quot;;">测试</a>，发现故障，并改进功能。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　<strong style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;&quot;;">　3. 客户参与得太多或太少</strong></div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　在精益<a target="_self" style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;color:#111010;&quot;;">软件开发</a>方法流行之前，公司的一个项目开发三年之久，到头来却发现产品并不符合实际目标的现象非常普遍。我相信如果使用迭代周期，你没有理由无法在三个月内做好软件的某个功能。但是有效地运转迭代周期需要客户从头到尾参与整个过程。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　既然我和我的团队负责解决问题，那么遇到客户只给出简单需求就消失得无影无踪，最后还希望我们可以交付完整产品的时候，我们会选择拒绝。相反，我们希望与客户密切合作，推进快速迭代的开发过程。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　我认为沟通和合作是开发项目的命脉，而且我们应该将成对的高级开发人员指派给客户，这些客户则需要在每个迭代周期结束时负责检查。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　研究表明，与单个的程序员相比，成对的开发人员可以更好地考虑更多设计选择，并且可以开发出更简单、更加易于维护的最终产品，且设计问题和bug更少。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　同时，也有客户参与过多的现象。关注管理细节的客户往往会分散开发团队的注意力，并可能极大地降低项目速度。因此，在每个迭代周期结束的时候，我们会提供两周（敏捷开发中每个迭代周期一般为两周）的进度汇报，而在迭代的关键时期，只有财务经理或项目经理作为联络人员负责维系客户，同时他们可以添加重要的任务到后备需求列表中。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　客户最终选择你的原因是因为他们不想聘用并管理每个开发人员。如果你放任他们随意地推进你的开发项目，那么合同就没有意义了。所以在客户听到太多NO之前，如果你希望提供最好的服务，那么你需要掌控大局并知道何时必须坚定立场。<br style="word-wrap: break-word;" />&#8203;&nbsp; &nbsp; &nbsp;如果有任何疑问，欢迎添加qq群测试入门到大神 755431660 共同学习~<br style="word-wrap: break-word;" />&#8203;<img src="http://blog.chinaunix.net/attachment/201805/24/29734443_1527131589PDvl.png" data-ke-src="/attachment/201805/24/29734443_1527131589PDvl.png" width="402" height="381" alt="" style="word-wrap: break-word; border: 0px;" />&#8203;</div><img src ="http://www.cnitblog.com/shbwf/aggbug/91029.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/shbwf/" target="_blank">51testing</a> 2018-05-24 11:28 <a href="http://www.cnitblog.com/shbwf/articles/91029.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>干货-测试工程师必备武器</title><link>http://www.cnitblog.com/shbwf/articles/91026.html</link><dc:creator>51testing</dc:creator><author>51testing</author><pubDate>Wed, 23 May 2018 05:48:00 GMT</pubDate><guid>http://www.cnitblog.com/shbwf/articles/91026.html</guid><wfw:comment>http://www.cnitblog.com/shbwf/comments/91026.html</wfw:comment><comments>http://www.cnitblog.com/shbwf/articles/91026.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shbwf/comments/commentRss/91026.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shbwf/services/trackbacks/91026.html</trackback:ping><description><![CDATA[<p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">如何进行用例设计，如何让设计好的用例覆盖全面，将代码存在的问题在上线前更早发现是每一个测试工程师必备的技能。那么如何达到这些指标呢？如何将用例设计既快又全面呢？今天小编就告诉大家常用设计用例的方法，以及每个方法的适用范围，便于大家更快的选择出最优的方法。</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><strong style="margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">从需求到用例设计</strong></p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><br style="margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;" /></p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">在项目中我们从拿到产品需求到最后的用例设计完成，都要经历哪些事情，包括今天要讲的用例设计方法是在哪个阶段使用，下面的图会告诉你答案。</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><br style="margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;" /></p><img alt="null" src="http://d.ifengimg.com/q100/img1.ugc.ifeng.com/newugc/20180523/11/wemedia/de1fca47f0499376a2193fe57533647ea47a0b24_size159_w1000_h579.png" style="margin: 0px auto; padding: 0px; list-style: none; box-sizing: border-box; border: none; vertical-align: middle; display: block; max-width: 50%; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;" /><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><br style="margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;" /></p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><br style="margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;" /></p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><br style="margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;" /></p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><strong style="margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">设计用例方法</strong></p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">&nbsp;</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><strong style="margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">1.等价类</strong></p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><strong style="margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">定义：</strong>把所有可能的输入数据,即程序的输入域划分成若干部分（子集）,然后从每一个子集中选取少数具有代表性的数据作为测试用例。等价类数据一般分为有效等级类和无效等级类。</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><strong style="margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">构造测试用例方法：</strong></p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">1）明确需求</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">2）分析需求中包含功能数</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">3）确认每一个独立功能具有多少输入</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">4）确认每个输入的规则</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">5）针对每个输入设计等价类表：有效数据和无效数据。以三边是否能组成三角形为例&nbsp;</p><img alt="null" src="http://d.ifengimg.com/q100/img1.ugc.ifeng.com/newugc/20180523/11/wemedia/7e4233bc5977ffdd99198ac769a6bbc729fdb7c3_size53_w553_h192.png" style="margin: 0px auto; padding: 0px; list-style: none; box-sizing: border-box; border: none; vertical-align: middle; display: block; max-width: 50%; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;" /><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><br style="margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;" /></p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">&nbsp;&nbsp;6）构造测试用例：输入和操作进行组合</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><strong style="margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">2.边界值</strong></p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><strong style="margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">定义</strong>：边界值分析法就是对输入或输出的边界值进行测试的一种黑盒测试方法。通常边界值分析法是作为对等价类划分法的补充。这种情况下，其测试用例来自等价类的边界。</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><strong style="margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">与等价划分的区别:</strong></p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1）边界值分析不是从某等价类中随便挑一个作为代表，而是使这个等价类的每个边界都要作为测试条件。&nbsp;</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">&nbsp;&nbsp;&nbsp;&nbsp;2）边界值分析不仅考虑输入条件，还要考虑输出空间产生的测试情况。</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong style="margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">构造测试用例方法：</strong></p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1）针对每一个输入规则设计等价类边界值表</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2）增加边界值数据：上点、离点</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">&nbsp;&nbsp;注：上点是边界上的点；离点是指距离上点最近的点，开区间在域内，闭区间在域外。</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><strong style="margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">3.判定表</strong></p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><strong style="margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">定义：</strong>判定表是分析和表达多逻辑条件下执行不同操作的情况的工具。</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><strong style="margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">判定表的组成：</strong></p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">	判定表通常由四个部分组成如下图所示：	&nbsp;</p><img alt="null" src="http://d.ifengimg.com/q100/img1.ugc.ifeng.com/newugc/20180523/11/wemedia/edd507f1eaf79f0cca7271ef41396884c627d10a_size91_w508_h258.png" style="margin: 0px auto; padding: 0px; list-style: none; box-sizing: border-box; border: none; vertical-align: middle; display: block; max-width: 50%; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;" /><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><br style="margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;" /></p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">	&nbsp;1) 条件桩（Condition Stub）：列出了问题得所有条件。通常认为列出的条件的次&nbsp;序无关紧要。</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">	&nbsp;2) 动作桩（Action Stub）：列出了问题规定可能采取的操作。这些操作的排列顺&nbsp;序没有约束。</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">	&nbsp;3)条件项（Condition Entry）：列出针对它左列条件的取值。在所有可能情况下的&nbsp;真假值。</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">	&nbsp;4)动作项（Action Entry）：列出在条件项的各种取值情况下应该采取的动作。</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">	&nbsp;5）规则及规则合并</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">	&nbsp;<strong style="margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">	A	规则</strong>	：任何一个条件组合的特定取值及其相应要执行的操作称为规则。在判定表中贯穿条件项和动作项的一列就是一条规则。显然,判定表中列出多少组条件取值,也就有多少条规则,既条件项和动作项有多少列。</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><strong style="margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">	&nbsp;B	化简</strong>	：就是规则合并	。</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">	&nbsp;a.&nbsp;	有完全相同的动作桩；</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">	&nbsp;b.&nbsp;	条件桩中只有一个不同项</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">	&nbsp;<strong style="margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">构造测试用例方法：</strong></p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">		<strong style="margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">&nbsp;</strong>1	）需求中	找到	条件桩：输入参数要满足的条件</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">		&nbsp;2	）需求中	找到	动作桩：满足条件后得到的结果</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">		&nbsp;3	）组合所有的条件桩形成2的n次方个组合，n代表条件桩的个数</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">		&nbsp;4	）分析需求	中提到的	每一组条项桩所对应的一个或多个动作桩</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">		&nbsp;5	）查看是否可以合并，	但合并时要谨慎，因为合并后容易发生漏测</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">		&nbsp;6	）写测试用例，每一列对应一条测试用例（不存在的结果可以忽略，因没有数据可取）</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">		&nbsp;以下	是形成	普通	三角形	的判定表	：</p><img alt="null" src="http://d.ifengimg.com/q100/img1.ugc.ifeng.com/newugc/20180523/11/wemedia/2a94b955f9747855a0b3e2898dcccdd34562d8b8_size85_w760_h201.png" style="margin: 0px auto; padding: 0px; list-style: none; box-sizing: border-box; border: none; vertical-align: middle; display: block; max-width: 50%; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;" /><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">&nbsp;</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><strong style="margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">4.流程分析法（场景设计）</strong></p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><strong style="margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">简介：</strong>现在的软件几乎都是用事件触发来控制流程的，事件触发时的情景便形成了场景，而同一事件不同的触发顺序和处理结果就形成事件流。类似于白盒测试中的路径覆盖，通过画流程图分析功能的路径。</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">&nbsp;&nbsp;如下图所示，用例经过的每条路径都用基本流和备选流来表示，直黑线表示基本流，是经过用例的最简单的路径。备选流用不同的色彩表示，一个备选流可能从基本流开始，在某个特定条件下执行，然后重新加入基本流中（如备选流1和3）；也可能起源于另一个备选流（如备选流2），或者终止用例而不再重新加入到某个流（如备选流2和4）。&nbsp;&nbsp;&nbsp;&nbsp;</p><img alt="null" src="http://d.ifengimg.com/q100/img1.ugc.ifeng.com/newugc/20180523/11/wemedia/8e2b317728250e14e0aa53e26ba9bdee3b5c40db_size65_w318_h423.png" style="margin: 0px auto; padding: 0px; list-style: none; box-sizing: border-box; border: none; vertical-align: middle; display: block; max-width: 50%; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;" /><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><br style="margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;" /></p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><strong style="margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">快速画流程图方法：</strong></p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">	1	）从需求	中找到	判定条件（如果，假如，当）</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">	2	）将这些判定框罗列到流程图中（可以暂时不用考虑顺序），注意挖掘SRS中没有提到的隐性判定条件</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">	3	）先画基本流（正常路径），再画备选流（分支）</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><strong style="margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">构造测试用例方法：</strong></p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">	1	）分析业务，画出流程图</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">	2	）根据基本路径写基于业务场景的测试用例（用例	数=	判定条件个数+1）</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><strong style="margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">5.正交试验</strong></p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><strong style="margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">简介：</strong>把影响实验指标的条件称为因子。影响实验因子的条件叫因子的状态（水平）。利用正交试验设计方法设计用例时,首先要从需求中找出影响其功能实现的操作对象和外部因素,把他们当作因子。而各个因子的取值当作状态。确定因子与状态是设计测试用例的关键。因此要求尽可能全面的正确的确定取值,以确保测试用例的设计作到完整与有效。</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">	<strong style="margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">构造</strong>	<strong style="margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">测试用例方法：</strong></p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">1）从需求中找出因子（输入参数）</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">2）从需求中找出因子状态（输入参数对应的取值）并编号，画出因子状态表</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">3）合并或补充因子状态表，代入正交表</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">4）拆分正交表，替换成文字，一行是一条用例，以打印机功能为例，正交试验表如下：</p><img alt="null" src="http://d.ifengimg.com/q100/img1.ugc.ifeng.com/newugc/20180523/11/wemedia/83cfb0ffc99237f7bd5f3d04d70d1eb954ec11b7_size112_w471_h457.png" style="margin: 0px auto; padding: 0px; list-style: none; box-sizing: border-box; border: none; vertical-align: middle; display: block; max-width: 50%; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;" /><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><br style="margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;" /></p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><strong style="margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">6.因果图</strong></p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">	<strong style="margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">定义</strong>	：	是一种利用图解法分析输入的各种组合情况，从而设计测试用例的方法，它适合于检查程序输入条件的各种组合情况。</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><strong style="margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">构造测试用例方法：</strong></p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">1）需求分析找出原因，然后给原因编号</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">2）需求分析找出结果，然后给结果编号</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">3）根据需求分析文档，分析原因与结果之间的关系</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">4）根据需求分析文档，分析原因与原因之间的关系</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">5）根据需求分析文档，分析结果与结果之间的关系</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">6）根据需求分析文档，画因果图</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">7）依据因果图去除判定表中不存在的组合</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">8）判定表中每一列对应一条测试用例</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><br style="margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;" /></p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">&nbsp;&nbsp;&nbsp;</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><strong style="margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">7.输入域覆盖</strong></p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">	<strong style="margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">简介</strong>	<strong style="margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">：</strong>	输入	的数据包含一些	易	引出内存溢出和内存泄露（区别，定义）的	类型边界	，	或者一些特殊	值	如电话号码等。</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><strong style="margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">构造测试用例方法：</strong></p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">	1	）SRS分析对应的输入参数是否存在特殊值和类型边界</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">	2	）若存在，则补充特殊值和类型边界的测试数据（检查是否会出现内存溢出）</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><strong style="margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">8.输出域覆盖</strong></p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><strong style="margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">简介：</strong>分析输出结果的形式（提示信息，输出的显示结果，数据库的记录等）</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><strong style="margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">构造测试用例方法：</strong></p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">	1	）通过与开发的沟通，明确对应功能所有可能的输出结果有哪些</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">	2	）逐一罗列（输出的形式主要针对提示信息和显示结果）</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">	3	）检查对照现有测试用例是否已经覆盖了所有的输出</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">	4	）若没有完全覆盖，则根据输出结果要求，倒推补充测试用例&nbsp;&nbsp;</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><strong style="margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">9.异常分析</strong></p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><strong style="margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">&nbsp;&nbsp;定义</strong>：基于经验和直觉推测程序中所有可能存在的各种错误, 从而有针对性&nbsp;&nbsp;的设计测试用例的方法</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><strong style="margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">基本思想：</strong>列举出程序中所有可能有的错误和容易发生错误的特殊情况,根据他们选择测试用例。如网络异常、断电、服务器宕机等</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><strong style="margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">构造测试用例方法：</strong></p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">1）根据需求分析文档，构造环境异常（网络、电源、服务器、程序关闭）&nbsp;</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">2）补充异常测试用例</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><strong style="margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">适用范围</strong></p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">	通过上述的介绍，设计用例的方法这么多，如何选择使用哪种方法呢？文章开篇中的流程图，处理过程为什么用流程分析而不用状态迁移法呢？下面小编总结了各种方法的优缺点以及适用范围，希望可以帮助大家。</p><img alt="null" src="http://d.ifengimg.com/q100/img1.ugc.ifeng.com/newugc/20180523/12/wemedia/0350120b61e7dccd34a74208cd693dc3d82d93fb_size208_w737_h545.png" style="margin: 0px auto; padding: 0px; list-style: none; box-sizing: border-box; border: none; vertical-align: middle; display: block; max-width: 50%; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;" /><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><br style="margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;" /></p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">	&nbsp;我们在实际工作中，可能一个功能会存在多种情况，所以大家要灵活使用方法，必要时设计用例方法要进行组合使用，设计出的用例才能更全面。一般情况下，一份用例最少用到2种以上方法才能全面覆盖测试点。</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">     如果有任何疑问，欢迎添加qq群测试入门到大神 755431660 共同学习~</p><img src ="http://www.cnitblog.com/shbwf/aggbug/91026.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/shbwf/" target="_blank">51testing</a> 2018-05-23 13:48 <a href="http://www.cnitblog.com/shbwf/articles/91026.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>针对开发的缺陷管理</title><link>http://www.cnitblog.com/shbwf/articles/91025.html</link><dc:creator>51testing</dc:creator><author>51testing</author><pubDate>Tue, 22 May 2018 06:18:00 GMT</pubDate><guid>http://www.cnitblog.com/shbwf/articles/91025.html</guid><wfw:comment>http://www.cnitblog.com/shbwf/comments/91025.html</wfw:comment><comments>http://www.cnitblog.com/shbwf/articles/91025.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shbwf/comments/commentRss/91025.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shbwf/services/trackbacks/91025.html</trackback:ping><description><![CDATA[<p style="word-wrap: break-word; margin: 10px auto; padding-top: 0px; padding-bottom: 0px; font-family: verdana, sans-serif; font-size: 13px;">最近开发部门开始实施&nbsp;针对开发的缺陷管理</p><p style="word-wrap: break-word; margin: 10px auto; padding-top: 0px; padding-bottom: 0px; font-family: verdana, sans-serif; font-size: 13px;">主要关注点在：缺陷数，缺陷密度，缺陷修复时长&nbsp;</p><p style="word-wrap: break-word; margin: 10px auto; padding-top: 0px; padding-bottom: 0px; font-family: verdana, sans-serif; font-size: 13px;">目的：通过指标来判断 开发的质量从而进行分析改进，通过修复时效来 管控 开发对于BUG的响应及时性。</p><p style="word-wrap: break-word; margin: 10px auto; padding-top: 0px; padding-bottom: 0px; font-family: verdana, sans-serif; font-size: 13px;">这是一个不错的改进开发过程中的质量的手段。</p><p style="word-wrap: break-word; margin: 10px auto; padding-top: 0px; padding-bottom: 0px; font-family: verdana, sans-serif; font-size: 13px;">以下为一个实例：<br style="word-wrap: break-word;" /><img src="http://blog.chinaunix.net/attachment/201805/22/29734443_1526968727072A.png" data-ke-src="/attachment/201805/22/29734443_1526968727072A.png" width="700" height="412.28813559322" alt="" style="word-wrap: break-word; border: 0px;" /><br style="word-wrap: break-word;" />&#8203;</p><div style="word-wrap: break-word; -webkit-tap-highlight-color: transparent; font-family: Helvetica, 黑体; font-size: 12px;"><p style="word-wrap: break-word; margin: 2rem 1.2rem; padding-top: 0px; padding-bottom: 0px; -webkit-tap-highlight-color: transparent; color: #1a1a1a; font-size: 16.5px; line-height: 33px; text-align: justify; letter-spacing: 0.7px;">如果有任何疑问，欢迎添加qq群测试入门到大神 755431660 共同学习~</p><div></div></div><img src ="http://www.cnitblog.com/shbwf/aggbug/91025.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/shbwf/" target="_blank">51testing</a> 2018-05-22 14:18 <a href="http://www.cnitblog.com/shbwf/articles/91025.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>工作总结之我为什么选择了测试？</title><link>http://www.cnitblog.com/shbwf/articles/91021.html</link><dc:creator>51testing</dc:creator><author>51testing</author><pubDate>Thu, 17 May 2018 02:58:00 GMT</pubDate><guid>http://www.cnitblog.com/shbwf/articles/91021.html</guid><wfw:comment>http://www.cnitblog.com/shbwf/comments/91021.html</wfw:comment><comments>http://www.cnitblog.com/shbwf/articles/91021.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shbwf/comments/commentRss/91021.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shbwf/services/trackbacks/91021.html</trackback:ping><description><![CDATA[<div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;"></div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　刚才特地去浏览了以前为工作面试而准备的资料，大部分都是些概念性的东西，还有些必问问题的答案。感觉很不走心，也就适合没有工作经验时用用吧。很早就想要写写关于工作方面的东西，还为此专门开通了博客园的账号，但是因为懒惰一直没有付诸行动。今天不知道是因为外太空引力波的干扰还是古西西比国祭司的祈祷，终于开始了第一篇工作总结。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　首先想聊的是为什么选择<a target="_self" style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;color:#111010;&quot;;">测试</a>这一工作，基本上面试的时候，面试官都会问到这一问题。那为什么我就选择了测试呢？最大的原因应该就是读大学的时候阴差阳错被调剂去了计算机专业。要是我学的是应用心理学，真的很难会和<a target="_self" style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;color:#111010;&quot;;">软件测试</a>扯上什么关系。既然学的是计算机专业，那自然接触的最多的就是和计算机相关的，当大三面临找工作压力时，就要选一个方向了。刚读大学的时候很傻，因为与生俱来的逆反心理，抗拒专业调剂这件事，进而讨厌计算机这个专业，认为不是自己选择的，拒绝去接受和热爱。也就没有打下任何计算机专业知识的基础，编程能力基本为0！在这种情况下，选择做开发就需要面临更大的挑战了。先插一句，简单来说，计算机专业做<a target="_self" style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;color:#111010;&quot;;">技术</a>的话，主要有这几个方向，第一，开发，通俗来说就是写代码的；第二，运维，简单来说就是做系统部署维护的；第三，网管，好理解点就是搞网络的，让你能上网的；第四，测试，就是大家口中说的找bug的；第五&#8230;&#8230;当然，还有很多很多方向，可以做设计做产品经理，等等。每一个大类的细分就更多了，就开发来说，可以按语言来分，可以按产品来分，可以按软件的结构来分。测试的分类也是五花八门，也不一一列举了。既然如此，选择如此之多，我为什么就偏偏选择了测试？简而言之一句话，测试上手容易。入门级的话，对计算机专业知识技术要求没那么高。本着先就业再择业的态度，就一脚踏入了测试这个坑。不曾想，有些时候一旦入坑，就很难回头了，因为只要开始一份工作，后面都会按着相似的岗位和既定的轨迹来走。若要重新开始一条路，就意味着要舍弃很多，要多付出不可估量的努力，而最关键的是，宝贵的时间就在这种转换中被无情地浪费掉了。所以，大家一定要慎重选择自己的第一份职业，第一份工作。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　肯定不会单纯因为是计算机专业就选择了测试，更重要的是我看到了这个岗位的就业需求量巨大，基本上任何一个成型的<a target="_self" style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;color:#111010;&quot;;">互联网</a>公司都是需要测试工程师的。不言而喻，有需求就有前景。万万没想到后面会出现那么多培训机构，造成行业内从业人员供大于求，这是后话了。按书上的理论来说，一开始企业是不重视测试的，有程序员设计开发出来一套产品，能用就能挣钱了，何必多花一笔钱找个不能创造价值的家伙来专门负责挑刺呢。后来因为各种千奇百怪的bug层出不穷，造成了意想不到的损失之后。老板们纷纷意识到，质量保证人员也是不可或缺的，于是企业们纷纷向测试工程师挥手，薪资待遇什么的自然水涨船高。在测试人员供不应求的情况下选择测试这个岗位，不可谓不明智。但是，正如一幅讽刺漫画中描述的一样，中国人看到有人在一个地方开加油站很挣钱，于是纷纷在那个地方开起了加油站。所以现在人们听说IT行业挣钱，不管之前学的是什么专业，都想要往这里钻了。连文科生都参加培训班，然后敲起了代码。现在行业已经不如前几年景气了，不过在这万物互联，<a target="_self" style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;color:#111010;&quot;;"><u style="word-wrap: break-word; margin: 0px auto; padding: 0px;"><strong style="word-wrap: break-word; margin: 0px auto; padding: 0px;">生活</strong></u></a>事事都软件化智能化的时代，好的软件测试人员也还占一席之地。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　基本上大家都知道，同等条件下的开发岗位会比测试岗位的工资要高，那为什么还要选择做测试呢？这就要综合考虑了，首先，开发是一个无中生有的过程，是从0到1，是更需要消耗脑力和精力的，头发是更容易稀疏的。而测试只是一个把1变为更好的1的过程，想方设法让他变成个更高的1更壮的1，是在一个已有的系统上确保其质量的，相对来说会简单点。进一步来说，开发的压力也是会比测试大，因为写代码的是开发，而改bug的也是开发。加班时间来说，普遍而言，开发也会长一些。对我个人而言，我是不太喜欢在高强度高压力下工作的。于是，这也成为了我选择测试的一个原因。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　再补充一点，就是我从小就喜欢和人抬杠，喜欢对老师讲的知识进行挑刺。而这种抬杠劲，说好听点是质疑精神，正是测试人员所必须的一大品质之一。从一开始就要认为你们家的孩子是最丑的是有缺陷的，从产品需求出来一直到产品上线，要一路质疑产品，质疑开发，一直在抬杠一直在撕逼，从未被超越。广大测试同仁还能好好活着，真的不容易！</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　那么以上几点，就是我选择测试的原因了。误打误撞被调剂到了计算机专业，理性分析看到了行业发展的前景和机会，避重就轻选择压力更小背锅能力强却不容易被分锅的角色，然后秉着与人撕逼不死不休的精神在测试之路上走到现在。<br style="word-wrap: break-word;" />&#8203;&nbsp; &nbsp; &nbsp;希望可以留言，说说你为什么选择测试，当然还可以添加QQ群测试入门到大神&nbsp;<span style="word-wrap: break-word; color: #1a1a1a; font-family: Helvetica, 黑体; font-size: 16.5px; letter-spacing: 0.7px;">755431660&nbsp; 一起学习测试之路~<br style="word-wrap: break-word;" />&#8203;<img src="http://blog.chinaunix.net/attachment/201805/17/29734443_1526524781KPQy.png" data-ke-src="/attachment/201805/17/29734443_1526524781KPQy.png" width="402" height="381" alt="" style="word-wrap: break-word; border: 0px;" />&#8203;</span></div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;"><span style="word-wrap: break-word; color: #1a1a1a; font-family: Helvetica, 黑体; font-size: 16.5px; letter-spacing: 0.7px;"></span></div><img src ="http://www.cnitblog.com/shbwf/aggbug/91021.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/shbwf/" target="_blank">51testing</a> 2018-05-17 10:58 <a href="http://www.cnitblog.com/shbwf/articles/91021.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于代码覆盖率的探索</title><link>http://www.cnitblog.com/shbwf/articles/91006.html</link><dc:creator>51testing</dc:creator><author>51testing</author><pubDate>Wed, 02 May 2018 03:36:00 GMT</pubDate><guid>http://www.cnitblog.com/shbwf/articles/91006.html</guid><wfw:comment>http://www.cnitblog.com/shbwf/comments/91006.html</wfw:comment><comments>http://www.cnitblog.com/shbwf/articles/91006.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shbwf/comments/commentRss/91006.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shbwf/services/trackbacks/91006.html</trackback:ping><description><![CDATA[<div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;"><strong style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;&quot;;">简介</strong></div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　<a target="_self" style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;color:#111010;&quot;;"><u style="word-wrap: break-word; margin: 0px auto; padding: 0px;"><strong style="word-wrap: break-word; margin: 0px auto; padding: 0px;">代码覆盖率</strong></u></a>是衡量项目源代码被<a target="_self" style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;color:#111010;&quot;;"><u style="word-wrap: break-word; margin: 0px auto; padding: 0px;"><strong style="word-wrap: break-word; margin: 0px auto; padding: 0px;">测试</strong></u></a>的一种指标，部分的人认为这是一个非常有用的标准，越高的代码覆盖率可能就代表了更高更安全的质量保证；部分人对代码覆盖保持怀疑的态度，尽管承认覆盖率是测试质量的一个标准，但不一定相信已被覆盖的代码是经过良好的测试的；而也有一部分人认为代码覆盖率在项目中是没用甚至对项目是有害的，可能代码覆盖率较高，项目实际质量较差，给项目成员提供了一种错误的安全感。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　尽管代码覆盖率分很多种（函数覆盖、语句覆盖、判断覆盖等），小编经过一段时间的实践，还是决定将重点放在语句覆盖，因为它相对简单、规则容易制定、结果方便可视化。本文将针对语句覆盖进行一些探索性的讨论。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　<strong style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;&quot;;">代码覆盖率的度量</strong></div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　就小编接触过的大部分项目而言，大多采用了持续集成的形式，通过持续集成工具来进行自动化的构建（包括编译，发布，<a target="_self" style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;color:#111010;&quot;;"><u style="word-wrap: break-word; margin: 0px auto; padding: 0px;"><strong style="word-wrap: break-word; margin: 0px auto; padding: 0px;">自动化测试</strong></u></a>）来验证，从而尽快地发现集成错误。许多团队发现这个过程可以大大减少集成的问题，让团队能够更快的开发内聚的软件。小编当前的项目也采用了Jenkins加覆盖率工具如Gcov（C++）、Emma/ JaCoCo（Java）和Coverage.py（<a target="_self" style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;color:#111010;&quot;;"><u style="word-wrap: break-word; margin: 0px auto; padding: 0px;"><strong style="word-wrap: break-word; margin: 0px auto; padding: 0px;">Python</strong></u></a>）来计算源码的测试覆盖率。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　代码覆盖率的执行时机可分为两种：每日执行与每次构建执行，两种执行方式是独立且同时存在的。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　对于每日执行的任务来说，可以配置一个定时任务，每次执行的范围是整个项目的所有源代码。通过工具执行生成的数据，可以建立dashboard展示每日/ 每周/ 每季度/ 每年/ 每种语言的代码覆盖率数据。同时也可以将dashboard实现项目与项目之间的比对，以评估比较各项目的质量情况。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　对于每次构建执行的任务来说，可以将任务挂钩到code review流程中去，在每次触发构建时，会执行code review流程与代码覆盖率扫描，并将结果做可视化反馈给提交工程师与review的同学。如下图所示，可以针对code review设计一定的颜色，比如代码部分绿色为新增的代码，行数的橘粉色为已经被测试覆盖的代码，更方便review的同学观看。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;"><a href="http://www.51testing.com/batch.download.php?aid=86666" data-ke-src="http://www.51testing.com/batch.download.php?aid=86666" target="_blank" style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;color:#111010;text-decoration-line:none;&quot;;"><img src="http://www.51testing.com/attachments/2018/04/15201284_201804271813341WTQv.png" data-ke-src="http://www.51testing.com/attachments/2018/04/15201284_201804271813341WTQv.png" border="0" style="word-wrap: break-word; border: 0px; margin: 0px auto; padding: 0px; max-width: 600px;"  alt="" /></a></div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　根据小编的经验，在提交之前执行并反馈代码覆盖率扫描是一个很重要的时机，因为此时是提交的开发工程师最会对这项数据感兴趣的时机，其他时机研发会主动去提高覆盖率的可能性就会大大减少了。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　<strong style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;&quot;;">代码覆盖率的结果展示</strong></div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　小编收集了3个项目中、5种语言、N次commit的代码覆盖率的数据，经过统计我们发现，大部分的项目覆盖率都在40%-70%之间，其中Python语言写的项目覆盖率最高、Javascript次之、最低的为C++。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;"><a href="http://www.51testing.com/batch.download.php?aid=86667" data-ke-src="http://www.51testing.com/batch.download.php?aid=86667" target="_blank" style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;color:#111010;text-decoration-line:none;&quot;;"><img src="http://www.51testing.com/attachments/2018/04/15201284_201804271813521FiJP.png" data-ke-src="http://www.51testing.com/attachments/2018/04/15201284_201804271813521FiJP.png" border="0" style="word-wrap: break-word; border: 0px; margin: 0px auto; padding: 0px; max-width: 600px;"  alt="" /></a></div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　经过分析，各类语言覆盖率存在巨大差异的可能性与各语言之间的结构性、范式和编写难易程度有关，同时不同的测量工具也可能影响了代码覆盖率数据的准确性。但请注意，以上数据不足以成为通用的项目代码覆盖率的指标，这些数据也仅仅只为以后提升代码覆盖率提供了一定的数据参考。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　通过部署持续构建+代码覆盖率扫描系统，我们持续收到了来自配合研发团队的正面反馈，其中得到好评最多的就是在code review流程中加入覆盖率统计的功能，这一功能有利地提高了code review的关注点与效率，同时也间接地提升了代码被测覆盖率（review也算是代码覆盖率提升的方法）。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　接下来的工作</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　经过一段时间的实践我们发现，代码覆盖率的统计问题主要是存在于代码覆盖率工具，因各工具的算法不一，因此很难制定一个统一的标准。我们进一步的工作可能就在于去啃这些工具的源码，通过实践-反馈-修正的循环不断提升覆盖率统计的准确性。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　另一个问题也就是上文所说的覆盖率统计，大多都存在于单元与接口层面的测试，对于大型的集成测试、端对端测试、UI测试，这类的覆盖率是很难测量的，所以目前这类的测试还是依赖于对用例覆盖度的把控。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　希望这篇<a target="_self" style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;color:#111010;&quot;;"><u style="word-wrap: break-word; margin: 0px auto; padding: 0px;"><strong style="word-wrap: break-word; margin: 0px auto; padding: 0px;">文章</strong></u></a>能对各位看官的项目起到一定作用，虽然各界对代码覆盖率的看法不一，但小编坚信，代码覆盖率的持续提升是对项目整体质量有较好的正向作用的。</div><span style="font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 16px;">如果有任何疑问，欢迎添加qq群测试入门大神 755431660 共同学习~</span><br style="word-wrap: break-word; font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 16px;" /><span style="font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 16px;">&#8203;</span><img src="http://blog.chinaunix.net/attachment/201805/2/29734443_1525231799nIDc.png" data-ke-src="/attachment/201805/2/29734443_1525231799nIDc.png" width="402" height="381" alt="" style="word-wrap: break-word; border: 0px; font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 16px;" /><span style="font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 16px;">&#8203;</span><img src ="http://www.cnitblog.com/shbwf/aggbug/91006.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/shbwf/" target="_blank">51testing</a> 2018-05-02 11:36 <a href="http://www.cnitblog.com/shbwf/articles/91006.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>性能测试学习和性能瓶颈分析路线</title><link>http://www.cnitblog.com/shbwf/articles/91002.html</link><dc:creator>51testing</dc:creator><author>51testing</author><pubDate>Fri, 27 Apr 2018 07:20:00 GMT</pubDate><guid>http://www.cnitblog.com/shbwf/articles/91002.html</guid><wfw:comment>http://www.cnitblog.com/shbwf/comments/91002.html</wfw:comment><comments>http://www.cnitblog.com/shbwf/articles/91002.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shbwf/comments/commentRss/91002.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shbwf/services/trackbacks/91002.html</trackback:ping><description><![CDATA[<div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;"></div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;"><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; line-height: 24px;">&nbsp; &nbsp; &nbsp; 做<a target="_self" style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;color:#111010;&quot;;"><u style="word-wrap: break-word; margin: 0px auto; padding: 0px;">性能测试</u></a>已经有一两年时间了，一直都在胡乱碰撞，东学西学，都是一些表面的东西，很少想过把它们连贯起来。今天根据自己的理解写一下性能测试到一定阶段需要站到一个什么样子的高度去看待性能这个问题。&nbsp;</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; line-height: 24px;">　　很多企业招聘都只写性能测试，会使用LR，jmeter工具。其实会使用jmeter和LR进行性能测试还只是性能测试的第一步，离真正的性能测试工程师还很远。我也还在路上&nbsp;</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; line-height: 24px;">　<strong style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;&quot;;">　性能测试，都是要求测试系统性能，系统自然就应该包括：客户端；网络；服务端。&nbsp;</strong></div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; line-height: 24px;">　　<strong style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;&quot;;">一：先易后难，首先是客户端性能</strong>，会有占用硬盘空间，内存使用，CPU占用，如果涉及下载存储就会涉及到磁盘。当然客户端性能现在已经算不上最主要的了。除非是一下单机，和C/S架构的客户端。客户端性能是相对容易测试出来的，不涉及并发，只要程序运行起来就会看到内存和CPU使用情况，使用快慢很容易体会出来&nbsp;</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; line-height: 24px;">　　<strong style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;&quot;;">二：网络环境</strong>，网络环境是连接客户端和服务器的重要部分，如果网络带宽不够，就算服务器速度再快也是很难达到性能要求的，就是桥很窄而要过桥的人很多&nbsp;</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; line-height: 24px;">　<strong style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;&quot;;">　三：服务器环境</strong>，做为最受重视的一部分，同样服务器也必然涉及到CPU、内存、磁盘、当然还有我们不希望看到的swap。这里先说的服务器性能是纯粹的机器性能不涉及软件环境性能。很多初级性能测试人员根本就不管这些，只是一句话是服务器性能瓶颈，却不分析是哪个地方的瓶颈。服务器机械性能，要能够分析机器的机械性能必须了解CPU 、内存、磁盘之间的一些影响，本人也没有深入学习，只是表面分析，深入的交给生产商。下面分层说一下：&nbsp;</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; line-height: 24px;">　　cpu：中央处理器，一般可以理解大部分时间是直接操作内存中的数据，是不是CPU性能瓶颈，就要看看CPU的使用率和队列长度。如果CPU使用率很高，CPU瓶颈，CPU使用率不高，队列很长，CPU堵塞，需要详细分析原因（后面补上分析）。CPU使用不高和队列不长。非CPU瓶颈&nbsp;</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; line-height: 24px;">　　内存：使用率高瓶颈，不高非瓶颈。没得说 磁盘：磁盘就是比内存慢很多的存储空间，可以说内存是很快的磁盘也行 相互之间分析：&nbsp;</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; line-height: 24px;">　　CPU很好，内存很大性能必须好。 CPU一般，内存很大，CPU瓶颈，很多事情要处理CPU忙不过来&nbsp;</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; line-height: 24px;">　　CPU很好，内存一般，内存瓶颈，CPU等着处理事务，可能内存提供不出这么多事务来&nbsp;</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; line-height: 24px;">　　先写这么多吧，有点困了，后面补上网络环境和软件环境、<a target="_self" style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;color:#111010;&quot;;"><u style="word-wrap: break-word; margin: 0px auto; padding: 0px;">数据库</u></a>对性能的影响，通过一个案例分析性能瓶颈出在哪。我也在学习路上。</div></div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">&#8203;<br style="word-wrap: break-word;" />&#8203;&#8203;<span style="word-wrap: break-word; color: #1a1a1a; font-family: Helvetica, 黑体; font-size: 16.5px; letter-spacing: 0.7px;">如果有任何疑问，欢迎添加qq群测试入门大神 755431660 共同学习~<br style="word-wrap: break-word;" />&#8203;<img src="http://blog.chinaunix.net/attachment/201804/27/29734443_15248014317537.png" data-ke-src="/attachment/201804/27/29734443_15248014317537.png" width="402" height="381" alt="" style="word-wrap: break-word; border: 0px;" />&#8203;</span></div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;"><span style="word-wrap: break-word; color: #1a1a1a; font-family: Helvetica, 黑体; font-size: 16.5px; letter-spacing: 0.7px;"></span></div><img src ="http://www.cnitblog.com/shbwf/aggbug/91002.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/shbwf/" target="_blank">51testing</a> 2018-04-27 15:20 <a href="http://www.cnitblog.com/shbwf/articles/91002.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>高效教练—领导的特质</title><link>http://www.cnitblog.com/shbwf/articles/90990.html</link><dc:creator>51testing</dc:creator><author>51testing</author><pubDate>Thu, 19 Apr 2018 06:37:00 GMT</pubDate><guid>http://www.cnitblog.com/shbwf/articles/90990.html</guid><wfw:comment>http://www.cnitblog.com/shbwf/comments/90990.html</wfw:comment><comments>http://www.cnitblog.com/shbwf/articles/90990.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shbwf/comments/commentRss/90990.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shbwf/services/trackbacks/90990.html</trackback:ping><description><![CDATA[<div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">&nbsp; &nbsp;　1、未来的领导者需要拥有明确的价值观和清晰的愿景，他们真诚、灵活、内心一致、目标明确。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　2、领导者必须具备基本特质：价值观、愿景、真诚、灵活性、一致性、目的</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　3、我们真正的价值观藏于内心，这些价值观在根本上都是普世性的。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　4、在开始探索自我和自己的价值观，更清楚地探索社会问题之前，我首先必须摆脱来自父母、社会和文化的制约。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　5、我们需要价值观驱动型的领导者&#8212;&#8212;是集体价值观而非个人价值观，并且他们专注于他们的价值观，把它们最合适地用在最合适的问题上。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　6、强迫员工改变内心的价值观来与公司的规定保持一致是很危险的。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　7、未来的领导者必须具备的第二个特质是一个包容所有人的愿景。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　8、全方位的系统思考与价值观密切相关，因为任何行动都可能在看似毫不相关的领域产生意想不到的后果。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　9、个人进一步发展的过程中有一个阶段，即在超个人教练的帮助下学习退后一步，变成一个冷静的观察者。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　10、绝对的真诚总是与最好的价值观和愿景密切相关。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　11、一方面是摆脱来自父母、社会和文化的固有成见和旧的信念与假设的束缚；另一方面是消除恐惧，尤其是阻碍人们对改变持开放心态的对未知的恐惧。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　12、灵活性是一个<a target="_self" style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;color:#111010;&quot;;"><u style="word-wrap: break-word; margin: 0px auto; padding: 0px;"><strong style="word-wrap: break-word; margin: 0px auto; padding: 0px;">生活</strong></u></a>的议题，也是一个我们会越来越需要的特质。领导力就是领导，你能够领导一切，就像教练就是教练，你能够教练任何人。这就是未来所需的灵活性。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　13、领导力的背景已经发生根本性的变化，主要有两个原因：一是过去许多领导规则和技能不再适用于今天的社会条件，急需新的领导能力；二是负责任的领导者更加重视全球的、社会的和环境的问题，或者至少和短期的财务成就不相上下。<br style="word-wrap: break-word;" />&#8203;有兴趣可添加我们的qq群 测试入门到大神&nbsp;<br style="word-wrap: break-word;" />&#8203;<img src="http://blog.chinaunix.net/attachment/201804/19/29734443_1524117005kTVk.png" data-ke-src="/attachment/201804/19/29734443_1524117005kTVk.png" width="653" height="506" alt="" style="word-wrap: break-word; border: 0px;" /></div><img src ="http://www.cnitblog.com/shbwf/aggbug/90990.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/shbwf/" target="_blank">51testing</a> 2018-04-19 14:37 <a href="http://www.cnitblog.com/shbwf/articles/90990.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何提高自身编码能力-定位Bug篇</title><link>http://www.cnitblog.com/shbwf/articles/90963.html</link><dc:creator>51testing</dc:creator><author>51testing</author><pubDate>Thu, 12 Apr 2018 05:45:00 GMT</pubDate><guid>http://www.cnitblog.com/shbwf/articles/90963.html</guid><wfw:comment>http://www.cnitblog.com/shbwf/comments/90963.html</wfw:comment><comments>http://www.cnitblog.com/shbwf/articles/90963.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shbwf/comments/commentRss/90963.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shbwf/services/trackbacks/90963.html</trackback:ping><description><![CDATA[<div></div><div><img alt="null" src="http://d.ifengimg.com/q100/img1.ugc.ifeng.com/newugc/20180412/11/wemedia/fabe9b418f6b67ec8a3ababf7e8b98a4bed4da14_size179_w800_h541.jpg" style="margin: 0px auto; padding: 0px; list-style: none; box-sizing: border-box; border: none; vertical-align: middle; display: block; max-width: 50%; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;" /><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><br style="margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;" /></p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><strong style="margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">学会定位bug真的很重要</strong></p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">1、定位bug的数量、种类、级别越多， 真的真的真的（重要的事三遍）能快速拉升自身编码水平、对很多原理的理解和对编程的认知。</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">2、能提高开发效率很多很多， 避免长时间都在解决bug的路上。</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">3、对app也是相当友好，至少对自己的app稳定性信心大增。</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><strong style="margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">　&#8220;打怪升级法则&#8221;</strong></p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">本人是个游戏迷，对于程序员的成长历程，觉得就像是在玩游戏一样。 只有不断的增加经验，获得新的装备，才能提高自身战斗力， 才能被一些&#8220;组织&#8221;收纳。游戏中有很多途径可以去增加经验， 同样对于程序员的成长也会有很多方式去提高自己的编程能力，这里闲谈一下定位bug的方式去提升。</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">开发过程中，会出现各种bug，产生原因不一。 如果对每种类型bug都能透析产生的原因和如何避免。 就会对各个开发知识点都会有更深刻的见解。所以《打怪升级法则》最重要的一就是积累各种bug， 只有见多识广才能应对自如， 建立自己的bug库很重要， 这里会说两点如何建立自己的bug库。</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><strong style="margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">　法则一 ： 刷自己的副本</strong></p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">根据自己开发过程中所产生的bug， 包括代码类型bug，策略类型bug，业务类型bug。 每个bug都要寻根问祖找到根源， 如果只在半途解决或者屏蔽bug，那么就领会不了这个bug的精髓（至少前期积累bug库的时候都要寻根问祖，如果后面经验丰富能对bug很熟悉，或者能很优雅的屏蔽后可以忽略）</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">&#183; 代码类型bug的产生一般来源于自己的编码不够规范和严谨， 透析此类bug可以提高自己的代码质量和编程能力。</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">&#183;&nbsp;策略类型bug 一般来源于自身的代码设计有缺陷， 透析此类bug有助提高我们的代码局部或者全局构造能力， 可以为后续的封装、组件化、架构设计思维有很大的帮助。</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">&#183;&nbsp;业务类型的bug很明显来源于自己对业务流程、需求逻辑的理解或业务代码设计不够严谨产生的bug， 此类bug也是相当重要，如果前面两点说的是对于自身编程能力， 那么这点就是切切实实跟业务开发有关，也是最常见的bug。 自身编程能力作为基石，只有自己的代码质量提高了才能编写出优雅高效率的代码。 但如果自己对业务的理解很马虎很随意， 即使编程能力再强， 也只能是一个很普通甚至差劲的程序员。程序员的本职是对一个产品赋予头、手、脚、躯干等等（功能），如果不能制造出健全稳定的功能，那么最终的产品可能就会是一个残废 。 透析此类bug， 对自己的业务能力， 功能分析，方案制定有很大的帮助； 还能获得部门的认可。 业务能力，也是公司晋升的重要衡量指标。</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">总之，一个bug就犹如一个副本，自己的副本都不刷掉，那升级就会很慢； 如果对于自己的副本只刷掉门口几个小兵，中途就离开，其实也跟没刷一样。 只有在干掉最终boss， 才会有成就感，才能拿到本副的装备， 才能以更高的战斗力去刷其他副本。 装备越来越多，越来越好，那升级就是分分钟的事情。</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><strong style="margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">法则二：跟同事组队刷副本</strong></p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">上面论述的是针对于自己在开发过程中遇见的bug， 这类bug实际上是很局限的， 如果你处于一个版本迭代流水线式的开发环境， 每天造轮子、造螺丝， 在开发过程中遇见的bug会更有限。除了刷掉自己的副本外， 还要学会如何吃掉别人的经验。</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">当身边的同事有问题时，这时候一定要伸出援助之手（xx副本求带）。 因为除非是实习生，同等水平左右的同事发出的&#8220;求救信号&#8221; ， 大部分是自己偶尔遇见过但却忘了，或者自己根本不熟悉的bug。 这是一个增加自己bug库的大好机会，即使是自己熟悉的bug，也别放过， 也许你觉得会耽误自己的时间， 但很多时候会重新刷新你对上一次bug的认识（也许会捡到+1的新装备哦），还能促进同事之间的关系。 如果是全新的bug， 之前自己并没有这方面的bug经验， 那么升级的时候就到了， 因为往往这类副本难度偏大，但boss经验多，装备豪华， 如果你能和同事组队干掉，必然会经验大涨。但对于那些难度太大，耗时很长的，也并没有要求你就此一直卡在这副本， 你只有50级的装备却想干掉100级的boss，毕竟那是你同事的bug，他会寻找资料或者更高级别的大神来解决， 此时只需等待同事的心得就好了。 当然如果你有多余的时间可以慢慢研究，收获更多。</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><strong style="margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">　法则三：吃别人经验</strong></p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">除了自己的bug和同事的bug外， 还有很多bug是我们不熟悉的。 当自己的bug库有了一定的积累， 定位bug有了一定的经验和心得后，可以去逛逛论坛、交流群、博客等，见识见识别人的疑难杂症和解决方案， 这会有助于提高自己bug定位能力和解决能力。</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">如果能有上述或类似的一些习惯，我相信用不了多久， 你们代码中的bug会越来越少，定位bug也将会轻车熟路， 个人能力会得到很大的提升。</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">&#8220;开局一堆bug，装备全靠刷。 我是渣渣辉，皇城pk，等你来战&#8221;</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><strong style="margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">定位bug</strong></p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">上面用了大量的篇幅介绍了定位bug的重要性以及如何建立一个自己的bug库，（这里说明一下， bug库并不是用笔记做成的仓库， 而是对各种bug理解认知之后的集合，如果担心被遗忘做笔记也是很好的。） 并没有介绍如何去定位一个bug的根源，与分析bug产生的原因。我相信每一个程序员都有自己的一套定位bug的方式。 这里简单介绍一下以常用思维去分析定位一个bug，当然大神很多，可用以自动化的方式去定位项目中的bug，如使用工具、脚本等方式。</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><strong style="margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">　猜测</strong></p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">当发现一个bug时，首先要做的就是分析猜测这个bug会产生的原因。</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">&#183;&nbsp;一般业务类型的bug最容易猜测，如：文案错误，信息空缺，集合元素缺失，等数据不对的情况。此类bug基本上都是数据在最终使用的时候，并不是自己想要的数据。如果能对自己代码比较熟悉，那么就能很快的猜测出数据在获取 - 解析 - 传输 - 转换 - 使用 的哪个环节出了问题。 如果无法猜测数据在哪个环节出了问题， 排查起来也相对简单，数据的传输在代码中还是很清晰可见的。 只要顺藤摸瓜很快就能寻找到出问题的地方。 PS： &#8220;数据驱动编程&#8221;， 从数据源上规划好数据结构，不仅可以避免掉很多不必要的bug，还能提高开发效率。</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">&#183;&nbsp;其次是策略类型bug，功能映射到的代码设计有缺陷，猜测此类bug难度会大一些。 因为很多时候咋一看以为是业务类型的bug。 猜测此类bug产生的原因，一是需要全局回想下自己的整体设计思路，确认是否有隐患的地方， 二是根据bug发生的场景、时机，推算猜测出可能存在的错误设计思路。 如果发生较大的策略类型bug， 其实是很不好的，这很可能意味着自己之前的大部分设计思路需要调整，相应的很多代码也需要调整。 虽然要调整的地方很多， 但另一方面， 也说明了你正在改变， 你重新设定了一套设计思路，你在追求最优化，而不是去建立补丁。 PS： 拿到需求后去思考最优化方案是很有必要的。</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">&#183;&nbsp;再次是代码类型的bug， 由于自身编码规范不足，埋下一些坑，出现的一些奇葩bug。 要想猜测出此类bug产生的原因也是最难的， 它很可能跟数据关系不大，跟策略设计的影响也不大。 想要猜测出此类bug发生的原因， 需要结合更多的信息， 如 log、场景、时机、数据等， 加上经验和感觉去推理猜测出bug产生的原因。 PS： 提高自己的基础和注意平时的编码习惯，应该是每个猿需要做的事情。</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">不管是什么类型的bug，当bug发生的时候，很多时候我们并不会知道这个bug是什么问题造成的，所以在猜测的时候，需要对业务类型、策略类型、代码类型的bug结合进行推理猜测。</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><strong style="margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">定位</strong></p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">当我们大概猜测出一个或者多个可能产生这个bug的原因后， 我们需要去定位具体产生bug的代码。由于猜测环节我们已经把范围缩小到了某一区域。 如何在这个范围定位到具体的问题代码？ 这里可以提供几种思路可以参考下， 一是直接浏览一下这块代码，排查有隐患的地方。 二是模拟数据、场景、时间，确定有问题的代码。 三是折半注释法，通过折半注释能快速的定位到具体代码。 折半注释法在很多疑难杂症bug中更能见到奇效，通过注释掉一部分代码，让产生bug所处的局部功能运行正常， 再放开被注释掉的一半代码，使运行正常，直至找到最终打开注释就会有问题的那块代码。 或者反注释，一个个打开注释判断是否正常，最后留下的将会是有问题的代码， 此类方法只能做辅助。</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><strong style="margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">验证</strong></p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">验证就很简单了，定位到具体问题代码后，我们需要验证各种数据、场景、时机来完全确定是这里代码产生的问题。</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><strong style="margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">猜测 - 定位</strong></p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">有些时候从猜想 - 定位 - 验证， 最后可能会发现并不是这里的产生的问题， 这时候需要重新去猜想和定位其他case。</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><strong style="margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">　其他方式</strong></p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">定位bug的方式有很多，也根据具体情况而定，只要积累的够多， 不管用什么方式去定位都将会很快， 很多时候也许一个感觉就对了。 不管是建立bug库，还是学会如何定位bug， 都是一个持续的积累过程，也是一种不可言传的编程思维，这里只是简单的描述大家都懂的道理，只有自己去体会实践才能收获。</p><p style="padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><span style="color: #333333; font-family: -apple-system, &quot;SF UI Text&quot;, Arial, &quot;PingFang SC&quot;, &quot;Hiragino Sans GB&quot;, &quot;Microsoft YaHei&quot;, &quot;WenQuanYi Micro Hei&quot;, sans-serif; font-size: 16px; white-space: normal;">转载：</span><span style="color: #333333; font-family: -apple-system, &quot;SF UI Text&quot;, Arial, &quot;PingFang SC&quot;, &quot;Hiragino Sans GB&quot;, &quot;Microsoft YaHei&quot;, &quot;WenQuanYi Micro Hei&quot;, sans-serif; font-size: 16px; white-space: normal;">http://www.51testing.com/html/71/n-3725771.html</span><br /></p></div><img src ="http://www.cnitblog.com/shbwf/aggbug/90963.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/shbwf/" target="_blank">51testing</a> 2018-04-12 13:45 <a href="http://www.cnitblog.com/shbwf/articles/90963.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MES实施中最可怕的是需求变更！</title><link>http://www.cnitblog.com/shbwf/articles/90959.html</link><dc:creator>51testing</dc:creator><author>51testing</author><pubDate>Tue, 10 Apr 2018 02:22:00 GMT</pubDate><guid>http://www.cnitblog.com/shbwf/articles/90959.html</guid><wfw:comment>http://www.cnitblog.com/shbwf/comments/90959.html</wfw:comment><comments>http://www.cnitblog.com/shbwf/articles/90959.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shbwf/comments/commentRss/90959.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shbwf/services/trackbacks/90959.html</trackback:ping><description><![CDATA[<div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;"><a href="http://www.51testing.com/batch.download.php?aid=85572" data-ke-src="http://www.51testing.com/batch.download.php?aid=85572" target="_blank" style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;color:#045BC3;text-decoration-line:none;&quot;;"><span style="word-wrap: break-word; margin-right: auto; margin-left: auto;"><img src="http://www.51testing.com/attachments/2018/04/14982672_201804091146091NnMj.png" data-ke-src="http://www.51testing.com/attachments/2018/04/14982672_201804091146091NnMj.png" border="0" style="word-wrap: break-word; border: 0px; margin: 0px auto; padding: 0px; max-width: 600px;"  alt="" /></span><br style="word-wrap: break-word;" /></a><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;color:#045BC3;text-decoration-line:none;&quot;;"><a href="http://www.51testing.com/batch.download.php?aid=85572" data-ke-src="http://www.51testing.com/batch.download.php?aid=85572" target="_blank" style="word-wrap: break-word; margin: 0px auto; padding: 0px;">&#8203;&#8203;</a>&nbsp; &nbsp; &nbsp; &nbsp;转载：http://www.51testing.com/html/00/n-3725700.html</div></div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　辛辛苦苦熬了几个月的通宵，终于确立了MES需求，规范了工作流程，系统配置也完成了，正准备按部就班MES系统上线时，企业用户突然改变了需求，不想这么做了，提出了新的需求。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　对于MES实施顾问来说，正如晴天惊雷，这也是所有MES顾问最感到恐怖的事情。因为有时候，用户只是简单的一句话，但是对于系统的调整来说工作量是非常大的。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　<strong style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;&quot;;">1、需求变更：迁就or拒绝?</strong></div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　从MES项目立项开始，需求就是MES实施顾问的心头之痛。随着对MES的深入认识、项目环境的变动，企业内外部多种因素都可能使客户对MES的需求不断改变。如果不能有效处理这些需求变更，项目实施进度必将一再调整，上线日期也会随之一再拖延，项目成员的士气也将越来越低落，严重的还会直接导致MES项目失败。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　需求变更，本应是客户的权力，但也是实施顾问的为难之处。如果确需变更，当然要满足客户需要。问题是不能让变更权力滥用，把一些无关痛痒的变更宠惯养成堂而皇之的变更。例如，我曾经在某MES项目中属于&#8220;谦虚型&#8221;，对于客户提出的变更，无论大小都给予解决，客户对此非常满意。然而，项目进度却拖得很长，项目一再延期。相比之下，在另一个项目上我显得稍有些&#8220;盛气凌人&#8221;，对于客户提出的需求变更，大多都不予理睬，客户对此不是很满意。不过，该项目的进度控制得较好，基本能按期完成项目。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　按后一种&#8220;盛气凌人&#8221;的做法，对客户的要求一概不理，自顾自地按照最初的需求和计划实施，很可能会由于没有用户的参与，使得MES系统与用户的需求相差甚远，导致验收通不过，收不回尾款而使公司利益受损。对于客户来说，达不到需求的满足也浪费了投资。事实上，客户不满意，则项目就不算成功，实施顾问辛勤劳动最后就只能落得个&#8220;没有功劳，只有苦劳&#8221;的份。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　但按前一种&#8220;谦虚型&#8221;做法，完全顺着客户的意见走，客户满意度就一定会高吗?其实也不一定。由于需求变更会带来工作量的大量增加，甚至可能会出现大量的无效劳动。而且，频繁变动的需求也会导致实施质量下降，留下许多隐患。因此，一味的迁就用户将会使进度一拖再拖，实施方案一改再改，变更越来越多，士气越来越疲，公司越来越不满意，用户越来越急。到最后，实施顾问会发现这个项目已经成为了一个&#8220;不可能完成的任务&#8221;。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　<strong style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;&quot;;">2、需求变更为什么总是做不完?</strong></div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　在MES实施过程中，实施顾问所要面对的将是一系列和多方面的考验。经常发生而又最令人头疼的恐怕就是需求变更了。客户变更需求是MES项目与生俱来的特性，也是一个无法避免的事实。需求变更的表现形式是多方面的，如客户临时改变想法、项目预算增加或减少、客户对功能的需求改变等。它会导致MES实施过程中成本增加、进度拖延等风险，而且越往后的变更产生的风险将越大。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　以笔者参与的多个MES实施项目的实际经历来看：需求变更泛滥是非常可怕的事，尤其是到了项目实施后期，客户不断对移交的MES系统提出修改意见，甚至有时刚刚重新完成的更改，客户又要求改回去或改成另一种模式。需求变更越来越多，实施顾问只能疲于应付。&#8220;无底洞&#8221;是大部分实施顾问进行MES项目的共同感觉。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　实施顾问作为项目的承担者，在规定时间内利用有限资源保质保量的完成项目，让客户和公司都满意是最终目标。但是让客户满意就是不断满足客户无穷无尽的需求吗? 我们分析一下出现需求变更的根源：</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　&#9312; 合同签订马虎，没有真正明白客户需求</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　签订合同时缺乏对客户需求认真对待，导致需求描述不清，为后期的实施工作带来困惑。MES销售顾问为使客户能够快速的签订合同，往往草率决定和片面同意客户提出的需求。当客户提出新的需求时，往往是销售顾问一看&#8220;应该&#8221;只是一个小小的修改，没有太大的影响，所以直接答应能变更。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　该问题的关键是合同签署的太烂，没有把需求明确再签合同，而且也没有把需求变更的流程写入合同。如果在合同时把客户需求弄清楚，后期就根本不需要频繁的变更需求。签订合同时明确定义项目需求的范围，可以为以后各项实施工作的开展奠定深厚的基础。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　&#9313; 研时没有深入理解客户需求</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　在MES上线前的需求调研分析阶段，项目组成员和客户的深入交流是减少频繁需求变更的关键阶段之一。但是由于双方的误解通常使需求交流难以进行。更严重的是，实施顾问只根据用户提出的描述性、总结性的短短几句话去制定实施方案，没有真正挖掘和按客户的需求去制定实施计划。当客户头脑一热或领导一拍脑袋提出新的需求时，实施顾问往往也就不能区分客户真正需求和镀金需求。如果项目组对客户需求的细节了解不充分，双方对需求的理解就会产生差异，就会导致移交MES系统时才使问题暴露出来，客户只能频繁的提出需求变更。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　&#9314; 没有明确的需求变更管理流程</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　没有明确的需求变更管理流程，就会使需求变更变得泛滥。并不是所有的变更都要修改，也不是所有变更都要立刻修改，需求变更管理的目的是为了决定什么类型的变更需要修改和什么时候修改。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　比如MES界面风格问题，就可以先不修改，或者规划一下修改的时间待到以后进行优化。另外，对于核心模块的修改没有严格把关流程，有些小需求看起来工作量不大，但是实际上实施顾问和开发顾问要耗费比较长的时间去完成这些销售顾问或者客户没有考虑到的细节问题。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　&#9315; 没有让客户知道需求变更的代价</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　对变更的影响没有评估是需求变更泛滥的根本原因。变更都是有代价的，应该要评估变更的代价和对项目的影响，要让客户了解需求变更的后果。如果客户不知道需求变更付出的代价，对实施顾问的辛苦就会难以体会。在评估代价过程中，可以请客户一起做判断：&#8220;我可以修改，但您能接受后果吗?&#8221;。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　<strong style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;&quot;;">　3、如何有效控制需求变更?</strong></div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　需求变更对项目成败有重要影响，既不能一概拒绝客户的变更要求，也不能一味地迁就客户，所以实施需求变更之前必须做好控制。例如授权、审核、评估和确认，在实施过程还要进行跟踪和验证。有句通俗的话说得非常好：&#8220;需求变更控制的目的不是控制变更的发生，而是对变更进行管理，确保变更有序进行。&#8221;</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　用户需求的变更总是不可避免的，所以我们要以积极的心态去接受和控制用户的需求，而不仅仅是埋怨。对待客户频繁的需求变更，应采取有效办法应对，避免事态蔓延，不让客户养成随意变更的毛病。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　&#9312; 合同约束</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　需求变更给MES实施带来的影响是有目共睹，所以在与用户签订合同时，可以增加一些相关条款，如限定用户提出需求变更的时间，规定何种情况的变更可以接受、拒绝或部分接受，还可以规定发生需求变更时必须执行变更管理流程。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　虽然MES项目合同很难在签订之初就能够精确定义每项需求，单靠合同是帮不上忙的，但也不能忽视合同的约束力。有一个笑话，就是许多销售顾问都开玩笑说他们都是清政府。为什么是清政府?清政府的特点之一就是丧权辱国的条约太多。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　&#9313; 建立需求变更审批流程</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　要明确需求变更审批环节、审批人员、审批事项、审批流程等。目的有两个：一是将客户下达变更的流程尽可能地规范化，减少张嘴就来的非必要、非紧急、非合理、非高层领导意图的&#8220;无效变更&#8221;。二是留下书面依据，为今后可能的成本变更和索赔准备好&#8220;变更账&#8221;。凡未履行审批程序的&#8220;变更&#8221;，一律是无效变更不予受理。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　有效的需求变更流程应该包括确认变更、评估变更的价值、分析变更对项目的影响，以及提交给双方高层进行评价以确定是否执行变更。变更请求必须有书面材料，当用户发现由于业务变化而引起的需求变更，需要提出书面申请。这样对所有的变更，双方的项目负责人都能做到心里有数。而且用户在递交书面变更申请时比较慎重，一般都在内部经过讨论后进行，这样减少了因用户内部看法不同导致的反复变更。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　&#9314; 对于零星变更，集中研究、批量处理</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　每周或每两周甚至每月召开一次需求变更专题会议，集中研究处理这些零碎变更事项，主动控制好工作节奏，尽量避免由于处理零碎变更而影响项目运行的总体进度。例如向客户正式提交一份各阶段需求变更的完成计划，注明变更引起的时间、成本、工期的代价和增加的工作量。要求客户配合需求变更计划，确定变更时限，控制变更规模，过时变更不候，离谱的变更不做，保大局弃小变。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　&#9315; 评估各种需求变更的影响</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　客户的需求是永远不会满足的，可能一天一个样,为了达到控制频繁的需求变更。需要将需求变更后产生的成本进行评估与量化，形成分析报告提交双方领导。否则，一味的妥协只会让项目进一步恶化，实施顾问需要掌控客户及公司的进度成本，把客户的每一次需求变更进行成本分析。确认哪些需要收费变更，哪些可以免费配合客户。这样既可以维护客户关系，又不致造成公司无谓的损失。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　&#9316; 确认客户是否接受变更的代价</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　要让客户认识到变更都是有代价的，要和客户一起判断需求变更是否依然进行。例如，变更是没有问题的，但是要明确客户能否接受由此引起的如进度延迟、费用增加、效率下降等问题。一般来说，如果客户认为该变更是必须的(不是其上级领导拍脑袋提出的)就会接受这些后果，通过与客户的协商，项目组可能会得到回报或者即使没有回报也不会招致公司和客户双方的埋怨。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　如果客户认为该变更虽然有必要但是可以暂缓，双方签署备忘录后留待以后解决。如果客户认为该变更可有可无，多数情况下会取消变更。这样即可防止频繁变更，也让客户认识到不是所有的需求都需要变更，更不是所有的需求变更都需要立刻修改。客户一般对MES不甚了解，他们认为很简单的事情，但可能解决起来会很复杂。以笔者的经验来看，一般来说用户的镀金需求可以延期解决甚至不考虑。用户的新增需求如果不是影响到核心业务的实现，也可以安排在现有功能的完善之后。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　&#9317; 每月变更<a target="_self" style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;color:#111010;&quot;;"><u style="word-wrap: break-word; margin: 0px auto; padding: 0px;"><strong style="word-wrap: break-word; margin: 0px auto; padding: 0px;">记录</strong></u></a>上报双方领导</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　最后，实施顾问要将有关变更措施和记录随时抄报双方最高层留档备案，可采取简报、文件、抄报、抄送、会议等多种形式。掌握主动权，逐步让不合理的随意频繁变更，成为客户不好意思开口的尴尬事件，尽快形成正常的项目执行氛围和良好的工作习惯，也为可能受到变更所带来的责任问题留下伏笔。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　最后，要特别提醒，要在MES项目开始就对项目组和客户进行宣传和培训，让所有成员都理解变更控制的重要意义。</div><img src ="http://www.cnitblog.com/shbwf/aggbug/90959.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/shbwf/" target="_blank">51testing</a> 2018-04-10 10:22 <a href="http://www.cnitblog.com/shbwf/articles/90959.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用Excel记录测试Bug问题总结</title><link>http://www.cnitblog.com/shbwf/articles/90958.html</link><dc:creator>51testing</dc:creator><author>51testing</author><pubDate>Mon, 09 Apr 2018 02:23:00 GMT</pubDate><guid>http://www.cnitblog.com/shbwf/articles/90958.html</guid><wfw:comment>http://www.cnitblog.com/shbwf/comments/90958.html</wfw:comment><comments>http://www.cnitblog.com/shbwf/articles/90958.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shbwf/comments/commentRss/90958.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shbwf/services/trackbacks/90958.html</trackback:ping><description><![CDATA[<div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　&nbsp; &nbsp;转载：http://www.51testing.com/html/68/n-3725668.html&#8203;<br style="word-wrap: break-word;" />&#8203;&nbsp; &nbsp; &nbsp; &nbsp;前几天与开发在讨论问题的时候，开发提了一个问题，说是已经解决的问题，能否用excel表格总结一下，问了一下原因，感觉想法很好，就总结了一下。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　在上家公司的时候，提交bug用的是mantis，现在是禅道，两者模式差不多，都是提交bug、开发修改、<a target="_self" style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;color:#111010;&quot;;"><u style="word-wrap: break-word; margin: 0px auto; padding: 0px;"><strong style="word-wrap: break-word; margin: 0px auto; padding: 0px;">测试</strong></u></a>验证是否解决，解决了关闭，没有解决则打回重新解决。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　这个时候，假如开发在解决bug的过程中引入了新的bug，该如何判断是哪些操作引入了新bug？一般情况下，开发人员与测试人员在验证bug的时候，都是就题解题，很少会去关心其它方面。 例如：A点到D点，有A-B-D和A-C-D两种方法，假如在A-B-D方法有bug，A-C-D方法在已经测试过的情况下，验证在A-B-D方法中产生的bug，几乎很少再去验证A-C-D方法，假如这时候有新bug就在A-C-D方法中，开发不会知道，测试也很难发现，而且不要抱有侥幸心理，我在上家公司测试的时候就多次遇见这种现象。特别是多个项目，分模块测试，这种几率会更大。更可怕的是，这些新产生的bug，在短时间内很难被发现，只有在后期的复测、上线测试或者回归测试时才会被发现，到时候多个问题集到一起，免不了要加班加点。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　问题来了要解决，在经过了一段时间后，开发如何快速的定位是修改哪个bug引入了新的bug？用bug管理工具？那可是所有开发与测试的问题总汇啊，好几十页呢，就算有模块区分，也要浪费很长时间。这时候用excel表格分模块<a target="_self" style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;color:#111010;&quot;;"><u style="word-wrap: break-word; margin: 0px auto; padding: 0px;"><strong style="word-wrap: break-word; margin: 0px auto; padding: 0px;">记录</strong></u></a>问题，其优点就来了。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　用excel表格记录问题，和bug管理工具不但不冲突，还能优势补充。用excel记录问题，只用记录bug的描述、bug解决人、bug的ID（用于在bug管理工具快速定位到bug）。当某个模块或者项目即将结束时，把问题总结excel表发给开发和项目领导人，让他们能快速知道项目产生问题的多少与解决情况，哪个模块产生的问题比较多，一目了然。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　还有一个重要的原因就是，开发不会忘记自己哪个bug没有修改。上面也提到了，bug管理工具上面是有好多bug呢，开发在忙碌的情况下是很容易遗忘某个bug的。虽然mantis、禅道是有提醒功能，不过问题是开发不会常常去看邮箱的，还是不能及时修改bug，这里excel表格能很好的解决这些问题，前提是你的让开发养成看excel表格的习惯。像我现在公司的开发，我用禅道提交的bug，开发几乎都不登录禅道，就算禅道在邮箱提醒了，开发也就是看了下就忙手中事件 了（手中的事件&gt;bug事件），然后就忘记了，然后就是我口头去提醒开发某某bug没有更改，心累！</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　当然excel表格缺点也是有的，在测试的初期，在bug较少的情况下，开发每次更新下载excel表格也是一件麻烦的事。这时候bug管理工具是非常有用的。自我经历是在测试进入中期以后，可以再给开发发excel表格，前期则是自己维护，避免了不必要的麻烦。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　用excel记录问题，花费的只是一点点时间，但能解决你与开发的很多问题，尝试着去用吧！</div><img src ="http://www.cnitblog.com/shbwf/aggbug/90958.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/shbwf/" target="_blank">51testing</a> 2018-04-09 10:23 <a href="http://www.cnitblog.com/shbwf/articles/90958.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JMeter测试计划中的元素</title><link>http://www.cnitblog.com/shbwf/articles/90956.html</link><dc:creator>51testing</dc:creator><author>51testing</author><pubDate>Wed, 04 Apr 2018 04:37:00 GMT</pubDate><guid>http://www.cnitblog.com/shbwf/articles/90956.html</guid><wfw:comment>http://www.cnitblog.com/shbwf/comments/90956.html</wfw:comment><comments>http://www.cnitblog.com/shbwf/articles/90956.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shbwf/comments/commentRss/90956.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shbwf/services/trackbacks/90956.html</trackback:ping><description><![CDATA[<div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　转载：http://www.51testing.com/html/10/n-3725610.html&#8203;<br style="line-height: 18.2px; word-wrap: break-word;" />&#8203;&nbsp; &nbsp; &nbsp; &nbsp;<a target="_self" style="line-height: 18.2px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;color:#111010;&quot;;"><u style="line-height: 18.2px; word-wrap: break-word; margin: 0px auto; padding: 0px;"><strong style="line-height: 18.2px; word-wrap: break-word; margin: 0px auto; padding: 0px;">测试</strong></u></a>计划中的元素（elements of a test plan）</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　本节描述测试计划不同的部分。</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　最小测试将包括测试计划、线程组和一个或多个采样器。</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　<strong style="line-height: 18.2px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;&quot;;">　1、测试计划（Test Plan）</strong></div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　测试计划对象有一个叫 &#8220;<a target="_self" style="line-height: 18.2px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;color:#111010;&quot;;"><u style="line-height: 18.2px; word-wrap: break-word; margin: 0px auto; padding: 0px;"><strong style="line-height: 18.2px; word-wrap: break-word; margin: 0px auto; padding: 0px;">功能测试</strong></u></a>&#8221; 的复选框，如果选择了，它将导致JMeter记录从服务器返回的每个示例的数据。如果您在测试监听器中选择了一个文件，那么这些数据将被写入文件。如果您正在执行一个小的运行，以确保JMeter的配置正确，并且您的服务器正在返回预期的结果，那么这将非常有用。其结果是，文件将快速增长，JMeter的性能将受到影响。如果您正在进行<a target="_self" style="line-height: 18.2px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;color:#111010;&quot;;"><u style="line-height: 18.2px; word-wrap: break-word; margin: 0px auto; padding: 0px;"><strong style="line-height: 18.2px; word-wrap: break-word; margin: 0px auto; padding: 0px;">压力测试</strong></u></a>(默认情况下是off)，则该选项应该关闭。</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　如果您没有将数据<a target="_self" style="line-height: 18.2px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;color:#111010;&quot;;"><u style="line-height: 18.2px; word-wrap: break-word; margin: 0px auto; padding: 0px;"><strong style="line-height: 18.2px; word-wrap: break-word; margin: 0px auto; padding: 0px;">记录</strong></u></a>到文件中，则该选项没有任何区别。</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　您还可以使用侦听器(listener)的 配置 按钮来决定要保存哪些字段。</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　<strong style="line-height: 18.2px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;&quot;;">2、线程组（Thread group）</strong></div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　线程组元素是任何测试计划的起点。所有控制器和采样器必须在线程组下。其他元素，例如侦听器，可以直接置于测试计划之下，在这种情况下，它们将适用于所有的线程组。顾名思义，线程组元素控制JMeter用来执行测试的线程的数量。线程组的控件允许:</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　&#183; Set the number of threads： 设置线程数</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　&#183;&nbsp;Set the ramp-up period：设置过渡时期</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　&#183;&nbsp;Set the number of times to execute the test：设置执行测试的次数</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　每个线程将完全独立地执行测试计划，完全独立于其他测试线程。多个线程用于模拟与服务器应用程序的并发连接。</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　这个过渡时期告诉JMeter要花多长时间才能&#8220;加速&#8221;到选择的全部线程数。如果使用10个线程，并且过渡时期是100秒，那么JMeter将花费100秒来启动所有10个线程并运行。在前面的线程开始后，每个线程将开始10(100 / 10)秒。如果有30个线程和一个上升周期120秒，则每个连续线程将延迟4秒。</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　需要足够长的时间来避免在测试开始时工作负载过大，足够短的时间，最后的线程在第一个线程完成之前就开始运行(除非有人希望发生这样的情况)。 从增加的线程数开始，根据需要调整向上或向下。</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　默认情况下，线程组被配置为通过它的元素循环一次。</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　线程组还提供了一个 调度器 。单击线程组面板底部的复选框，以启用/禁用额外的字段，在该字段中您可以输入测试持续时间、启动延迟、运行的开始和结束时间。您可以配置 持续时间（秒） 和 启动延迟（秒） 来控制每个线程组的持续时间和启动后的秒数。当开始测试时，JMeter会等待 启动延迟（秒） 之前启动的线程组的线程和运行配置的持续时间（秒）的时间。注意，这两个选项覆盖了 开始时间 和 结束时间 。</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　或者(尽管不建议不是很灵活)，您可以使用其他两个字段 开始时间 和 结束时间。当测试开始时，JMeter将在必要时等待，直到到达开始时间。在每个循环的末尾，JMeter检查是否已经到达了结束时间，如果是，则停止运行，否则测试将继续运行下去，直到达到迭代限制。</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　<strong style="line-height: 18.2px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;&quot;;">3、控制器（Controllers）</strong></div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　JMeter有两种控制器：采样器和逻辑控制器。这些驱动测试的处理。</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　采样器告诉JMeter发送请求到服务器。例如，如果你想要JMeter发送http请求添加一个HTTP请求取样器。您还可以通过向采样器中添加一个或多个配置元素来定制请求。更多信息，参见：采样器。</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　逻辑控制器让你自定义JMeter决定要发送请求时用什么样的逻辑。例如，您可以在两个HTTP请求采样器之间添加交错逻辑控制器。有关更多信息，参见：逻辑控制器。</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　<strong style="line-height: 18.2px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;&quot;;">　3.1、采样器（Samplers）</strong></div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　采样员告诉JMeter向服务器发送请求并等待响应。它们按照它们在树中出现的顺序进行处理。控制器可用于修改采样器的重复次数。</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　JMeter采样器包括：</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　&#183;&nbsp;FTP请求</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　&#183;&nbsp;HTTP请求(也可以用于SOAP或REST Webservice)</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　&#183;&nbsp;JDBC请求</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　&#183;&nbsp;Java对象请求</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　&#183;&nbsp;JMS请求</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　&#183;&nbsp;JUnit测试请求</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　&#183;&nbsp;LDAP请求</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　&#183;&nbsp;邮件请求</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　&#183;&nbsp;操作系统进程请求</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　&#183;&nbsp;TCP请求</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　每个采样器都有几个可以设置的属性。您可以通过在测试计划中添加一个或多个配置元素来自定义采样器。</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　如果要将同一类型的多个请求（例如HTTP请求）发送到同一服务器，请考虑使用默认配置元素。每个控制器都有一个或多个Defaults元素（见下文）。</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　请记住在测试计划中添加一个侦听器，以查看和/或将请求的结果存储到磁盘。</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　如果您有兴趣让JMeter对您的请求的响应进行基本验证，那么向sampler添加一个 断言 。例如，在压力测试<a target="_self" style="line-height: 18.2px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;color:#111010;&quot;;"><u style="line-height: 18.2px; word-wrap: break-word; margin: 0px auto; padding: 0px;"><strong style="line-height: 18.2px; word-wrap: break-word; margin: 0px auto; padding: 0px;">web</strong></u></a>应用程序时，服务器可能返回一个成功的&#8220;HTTP响应&#8221;代码，但是页面可能有错误，或者可能缺少部分。您可以添加断言来检查某些HTML标记、常见的错误字符串等。JMeter允许使用正则表达式创建这些断言。</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　<strong style="line-height: 18.2px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;&quot;;">　3.2、逻辑控制器（Logic Controllers）</strong></div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　逻辑控制器让您自定义JMeter决定要发送请求时的逻辑。逻辑控制器可以改变来自子元素的请求顺序。他们可以自己修改请求，导致JMeter重复请求，等等。</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　要了解逻辑控制器对测试计划的影响，请考虑以下测试树:</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　测试计划</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　&#183;&nbsp;线程组</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　&#183;&nbsp;仅一次控制器</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　登录请求(一个HTTP请求)</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　&#183; 加载搜索页面(HTTP采样器)</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　&#183; 交替控制器</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　搜索&#8220;A&#8221;(HTTP取样器)</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　搜索&#8220;B&#8221;(HTTP取样器)</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　HTTP请求默认值(配置元件)</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　&#183;&nbsp;HTTP默认请求(配置元件)</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　&#183;&nbsp;Cookie管理器(配置元件)</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　这个测试的第一件事是，登录请求将仅在第一次执行。随后的迭代将跳过它。这是由于Once Only Controller（只有一次控制器）的影响。</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　登录后，下一个采样器加载搜索页面(想象一个用户登录的web应用程序，然后进入搜索页面进行搜索)。这只是一个简单的请求，没有经过任何逻辑控制器的过滤。</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　加载搜索页面后，我们要进行搜索。实际上，我们想做两种不同的搜索。但是，我们希望在每次搜索之间重新加载搜索页面本身。我们可以通过4个简单的HTTP请求元素(加载搜索、搜索&#8220;A&#8221;、加载搜索、搜索&#8220;B&#8221;)来实现这一点。相反，我们使用Interleave Controller控制器每次通过测试传递一个子请求。它保持了排序(即它不会随机地传递一个，而是&#8220;记住&#8221;它的子元素的位置)。插入两个子请求可能会被过度使用，但是可能会有8个或20个子请求。</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　注意，HTTP Request Defaults属于Interleave Controller。假设&#8220;Search A&#8221;和&#8220;Search B&#8221;共享相同的路径信息(HTTP请求规范包括域、端口、方法、协议、路径和参数，以及其他可选项)。这是有意义的&#8212;&#8212;两者都是搜索请求，命中相同的后端搜索引擎(比如servlet或cgil - script)。我们可以将这些信息抽象为单个配置元素，而不是在路径字段中使用相同的信息配置两个HTTP Samplers。当Interleave控制器&#8220;传递&#8221;来自&#8220;Search A&#8221;或&#8220;Search B&#8221;的请求时，它将从HTTP默认请求配置元素的值中填充空白。因此，我们将这些请求的路径字段留空，并将这些信息放入配置元素中。在这种情况下，这充其量只是一个小的好处，但它展示了这个特性。</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　树中的下一个元素是另一个HTTP默认请求，这个时间添加到线程组本身。线程组有一个内置的逻辑控制器，因此，它使用这个配置元素，就像上面描述的那样。它填入经过的任何请求的空格。在web测试中，将所有HTTP Sampler元素中的域字段保留为空是非常有用的，相反，将这些信息放入HTTP默认请求元素中，添加到线程组中。通过这样做，您可以通过改变测试计划中的一个字段来测试您在不同服务器上的应用程序。否则，你必须编辑每一个采样器。</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　最后一个元素是HTTP Cookie管理器。所有web测试都应该添加一个Cookie管理器&#8212;&#8212;否则JMeter将忽略Cookie。通过在线程组级别添加它，我们确保所有HTTP请求将共享相同的cookie。</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　逻辑控制器可组合实现各种结果。请参阅内置逻辑控制器列表（ built-in Logic Controllers.）。</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　<strong style="line-height: 18.2px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;&quot;;">3.2.3、测试片段（Test Fragments）</strong></div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　测试片段元素是一种特殊类型的控制器，它存在于与线程组元素相同级别的测试计划树中。它与线程组不同，因为它没有被执行，除非由 模块控制器 或 包含控制器 引用。</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　此元素纯粹用于测试计划中的代码重用。</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　<strong style="line-height: 18.2px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;&quot;;">　4、侦听器（Listeners）</strong></div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　当JMeter运行时，侦听器提供对<a target="_self" style="line-height: 18.2px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;color:#111010;&quot;;"><u style="line-height: 18.2px; word-wrap: break-word; margin: 0px auto; padding: 0px;"><strong style="line-height: 18.2px; word-wrap: break-word; margin: 0px auto; padding: 0px;">测试用例</strong></u></a>的信息JMeter的访问。图的结果是监听器将响应时间绘制在图上。&#8220;视图结果树&#8221;侦听器显示了sampler请求和响应的详细信息，可以显示响应的基本HTML和XML表示。其他侦听器提供汇总信息或聚合信息。</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　此外，侦听器可以将数据直接引导到文件中以供以后使用。JMeter中的每个监听器都提供一个字段来指示要存储数据的文件。还有一个配置按钮，可以用来选择保存哪些字段，以及是否使用CSV或XML格式。</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　注意，所有侦听器都保存相同的数据;唯一的区别在于数据在屏幕上呈现的方式。</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　可以在测试的任何地方添加监听器，包括直接在测试计划下。他们只从他们的水平或低于他们水平的元素收集数据。</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　JMeter这里有这些监听器。</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　<strong style="line-height: 18.2px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;&quot;;">5、定时器（Timers）</strong></div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　默认情况下，JMeter线程在不暂停的情况下依次执行samplers。我们建议您通过向线程组添加一个可用的计时器来指定延迟。如果您不添加延迟，JMeter会在很短的时间内发出太多的请求，从而使服务器不堪重负。</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　定时器将导致JMeter在每个采样器在其范围内延迟一定的时间。</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　如果您选择将多个计时器添加到线程组，JMeter将使用计时器的总和，并在执行计时器所应用的samplers之前暂停此时间。计时器可以添加为samplers或控制器的子元素，以限制应用程序的采样器。</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　为了在测试计划中提供一个单独的位置，可以使用Test Action采样器。</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　<strong style="line-height: 18.2px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;&quot;;">6、断言（Assertions）</strong></div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　断言允许你断言你正在测试的服务器返回的结果。通过使用断言，你基本上可以断定你的程序返回的结果是否是你期望的值。</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　例如，你可以断言一个查询的返回结果将包含一些特定的文本，特定的文本可以是perl语言的正则表达式，也可以是返回结果中的一部分，或者整个返回值。</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　你可以为任何Sampler(取样器)添加断言，例如，您可以向&#8220;HTTP请求&#8221;中添加一个断言，用来检查文本 &#8220;&lt; / HTML &gt;&#8221; 。然后，JMeter将检查文本&#8216;&lt; / HTML &gt;&#8217;是否存在于HTTP响应中。如果JMeter不能找到文本，那么它将标记为请求失败。</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　注意：断言适用于所有的取样器，但是要将断言限制到具体的某一个取样器上，要将断言作为取样器的子元素添加。</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　要查看断言结果，请向线程组添加一个&#8220;断言结果&#8221;，断言失败的也会现在树视图和表侦听器中，并将统计到汇总、汇总报告的误差率里面。</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　<strong style="line-height: 18.2px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;&quot;;">7、配置元件（Configuration Elements）</strong></div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　一个配置元件与采样器紧密合作。虽然它不发送请求(HTTP(S)测试脚本记录器 除外)，但它可以添加或修改请求。</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　一个配置元件只能从放置元素的树分支中访问，例如，如果你把一个&#8220;HTTP Cookie管理器&#8221;放在一个简单控制器中，只有在简单控制器内，Cookie管理器才可以访问HTTP请求控制器(参见图1)。Cookie管理器可以访问HTTP请求&#8220;页面1&#8221;和&#8220;页面2&#8221;，而不是&#8220;页面3&#8221;。</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　此外，树分支中的配置元件的优先级高于&#8220;父&#8221;分支中的相同元素，例如，我们定义二个&#8220;HTTP请求默认值&#8221;元件：&#8221;HTTP请求默认值 1&#8221;和&#8221;HTTP请求默认值 2&#8221;,由于我们将&#8221;HTTP请求默认值 2&#8221;放在一个循环控制器中的，故只有&#8221;页面2&#8221;可以访问它。其他HTTP请求将使用&#8220;HTTP请求默认值 2&#8221;，因为我们将它放入了线程组(所有其他分支的&#8220;父&#8221;)。</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;"><a href="http://www.51testing.com/batch.download.php?aid=85330" data-ke-src="http://www.51testing.com/batch.download.php?aid=85330" target="_blank" style="line-height: 18.2px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;color:#111010;text-decoration-line:none;&quot;;"><img src="http://www.51testing.com/attachments/2018/04/14982672_201804041113091jRFu.png" data-ke-src="http://www.51testing.com/attachments/2018/04/14982672_201804041113091jRFu.png" border="0" style="line-height: 18.2px; border: 0px; word-wrap: break-word; margin: 0px auto; padding: 0px; max-width: 600px;"  alt="" /></a>　　</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">图1 测试计划显示了配置元件的可访问性</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　注意：配置元件中的&#8221;用户定义的变量&#8221;与其它元件是有区别的。它是在测试开始时进行处理的，而不管我们将它放在哪里。为了简单起见，建议将它放在线程组的开始处。</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　<strong style="line-height: 18.2px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;&quot;;">8、前置处理器（Pre-Processor Elements）</strong></div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　预处理器在执行Sampler(采样器)请求之前执行一些操作。如果一个预处理器被附加到一个采样器元件上，那么它就会在这个采样器元件运行之前执行。预处理程序通常用于在运行前修改采样品请求的设置，或者更新不是从响应文本中提取的变量。</div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　<strong style="line-height: 18.2px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;&quot;;">　9、后置处理器（Post-Processor Elements）</strong></div><div style="line-height: 24px; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; color: #3e3e3e;">　　在采样器请求完成后，后处理器执行一些操作。如果一个后处理器被附加到一个采样器元件上，那么它将在Sampler元件运行后执行。后处理器通常用于处理响应数据，通常是从它提取值。</div><img src ="http://www.cnitblog.com/shbwf/aggbug/90956.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/shbwf/" target="_blank">51testing</a> 2018-04-04 12:37 <a href="http://www.cnitblog.com/shbwf/articles/90956.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>提高处理BUG效率第一步：提高测试工程师排查BUG能力</title><link>http://www.cnitblog.com/shbwf/articles/90955.html</link><dc:creator>51testing</dc:creator><author>51testing</author><pubDate>Tue, 03 Apr 2018 03:43:00 GMT</pubDate><guid>http://www.cnitblog.com/shbwf/articles/90955.html</guid><wfw:comment>http://www.cnitblog.com/shbwf/comments/90955.html</wfw:comment><comments>http://www.cnitblog.com/shbwf/articles/90955.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shbwf/comments/commentRss/90955.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shbwf/services/trackbacks/90955.html</trackback:ping><description><![CDATA[<p style="padding-top: 0px; padding-bottom: 0px; line-height: 21px; color: #666666; font-size: 14px; word-wrap: break-word; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: &quot;Helvetica， Arial， sans-serif&quot;; white-space: pre-wrap;"><strong style="line-height: 1.5em !important; word-wrap: break-word; margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">转载：http://www.51testing.com/html/47/n-3725347.html?<br style="line-height: 1.5em !important; word-wrap: break-word;" />背景：</strong></p><p style="padding-top: 0px; padding-bottom: 0px; line-height: 21px; color: #666666; font-size: 14px; word-wrap: break-word; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: &quot;Helvetica， Arial， sans-serif&quot;; white-space: pre-wrap;">一家主要是做一款<strong style="line-height: 1.5em !important; word-wrap: break-word; margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;"><u style="line-height: 1.5em !important; word-wrap: break-word; margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">APP</u></strong>的公司，公司<strong style="line-height: 1.5em !important; word-wrap: break-word; margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;"><u style="line-height: 1.5em !important; word-wrap: break-word; margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">技术</u></strong>部门有三个组：爬虫组、服务端组和APP客户端组。</p><p style="padding-top: 0px; padding-bottom: 0px; line-height: 21px; color: #666666; font-size: 14px; word-wrap: break-word; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: &quot;Helvetica， Arial， sans-serif&quot;; white-space: pre-wrap;"><strong style="line-height: 1.5em !important; word-wrap: break-word; margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">事实回放：</strong></p><p style="padding-top: 0px; padding-bottom: 0px; line-height: 21px; color: #666666; font-size: 14px; word-wrap: break-word; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: &quot;Helvetica， Arial， sans-serif&quot;; white-space: pre-wrap;">1）每次运营或产品提出一个<strong style="line-height: 1.5em !important; word-wrap: break-word; margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;"><u style="line-height: 1.5em !important; word-wrap: break-word; margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">BUG</u></strong>给到<strong style="line-height: 1.5em !important; word-wrap: break-word; margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;"><u style="line-height: 1.5em !important; word-wrap: break-word; margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">测试</u></strong>工程师后。</p><p style="padding-top: 0px; padding-bottom: 0px; line-height: 21px; color: #666666; font-size: 14px; word-wrap: break-word; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: &quot;Helvetica， Arial， sans-serif&quot;; white-space: pre-wrap;">2）测试工程师就会凭感觉和经验（而不是技能判断）判断这个BUG是哪个组，判断之后就会把这个BUG指派给该组的负责同事A。</p><p style="padding-top: 0px; padding-bottom: 0px; line-height: 21px; color: #666666; font-size: 14px; word-wrap: break-word; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: &quot;Helvetica， Arial， sans-serif&quot;; white-space: pre-wrap;">注意：我们的绩效是按照每个团队每位同事产生的生产BUG去扣分的。</p><p style="padding-top: 0px; padding-bottom: 0px; line-height: 21px; color: #666666; font-size: 14px; word-wrap: break-word; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: &quot;Helvetica， Arial， sans-serif&quot;; white-space: pre-wrap;">3）接收到这个BUG的开发同事A开始排查问题，花了半小时排查完之后发现这个BUG不是我这边的问题，于是就又丢给测试工程师，同时责备测试不应该把不是他的BUG指派给他，一来浪费他的时间，二来又影响他的绩效。</p><p style="padding-top: 0px; padding-bottom: 0px; line-height: 21px; color: #666666; font-size: 14px; word-wrap: break-word; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: &quot;Helvetica， Arial， sans-serif&quot;; white-space: pre-wrap;">4）测试根据开发同事A的各种排查描述，得知这个BUG可能（是的，可能）是另一个组的开发同事B的问题，于是测试就把这个BUG指派给开发同事B。</p><p style="padding-top: 0px; padding-bottom: 0px; line-height: 21px; color: #666666; font-size: 14px; word-wrap: break-word; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: &quot;Helvetica， Arial， sans-serif&quot;; white-space: pre-wrap;">5）接收到这个BUG的开发同事B开始排查问题（每个组的开发排查方式未必相同），顺利的情况下，最后排查得出这个BUG确实是我的。</p><p style="padding-top: 0px; padding-bottom: 0px; line-height: 21px; color: #666666; font-size: 14px; word-wrap: break-word; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: &quot;Helvetica， Arial， sans-serif&quot;; white-space: pre-wrap;">6）开发同事B开始处理BUG，处理完之后给到测试验收，直到BUG关闭。</p><p style="padding-top: 0px; padding-bottom: 0px; line-height: 21px; color: #666666; font-size: 14px; word-wrap: break-word; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: &quot;Helvetica， Arial， sans-serif&quot;; white-space: pre-wrap;">流程图如下图1：</p><img showalt="提高处理BUG效率第一步：提高测试工程师排查BUG能力" alt="null" src="http://www.51testing.com/attachments/2018/03/15201284_201803231113021rafr.png" data-ke-src="http://www.51testing.com/attachments/2018/03/15201284_201803231113021rafr.png" style="border: none; color: #666666; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; list-style: none; box-sizing: border-box; vertical-align: middle; display: block; max-width: 50%; font-family: &quot;Helvetica， Arial， sans-serif&quot;; white-space: pre-wrap; line-height: 1.5em !important;" /><p style="padding-top: 0px; padding-bottom: 0px; line-height: 21px; color: #666666; font-size: 14px; word-wrap: break-word; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: &quot;Helvetica， Arial， sans-serif&quot;; white-space: pre-wrap;"><br style="line-height: 1.5em !important; word-wrap: break-word;" /></p><p style="padding-top: 0px; padding-bottom: 0px; line-height: 21px; color: #666666; font-size: 14px; word-wrap: break-word; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: &quot;Helvetica， Arial， sans-serif&quot;; white-space: pre-wrap;">图1</p><p style="padding-top: 0px; padding-bottom: 0px; line-height: 21px; color: #666666; font-size: 14px; word-wrap: break-word; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: &quot;Helvetica， Arial， sans-serif&quot;; white-space: pre-wrap;">在这个过程中，还有隐形的多种问题：</p><p style="padding-top: 0px; padding-bottom: 0px; line-height: 21px; color: #666666; font-size: 14px; word-wrap: break-word; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: &quot;Helvetica， Arial， sans-serif&quot;; white-space: pre-wrap;">1、验收在接收到测试工程师指派的无法确定是否是需要我处理的这类BUG时，会一直让这个BUG挂机在那不做处理，原因很简单，我花半小时去排查这个BUG，很有可能这个BUG不是我的。</p><p style="padding-top: 0px; padding-bottom: 0px; line-height: 21px; color: #666666; font-size: 14px; word-wrap: break-word; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: &quot;Helvetica， Arial， sans-serif&quot;; white-space: pre-wrap;">2、开发经常性怼测试工程师，你怎么证明这个BUG就是我的？我就是不处理！还有你为什么总是把不是我的BUG指派给我？而测试工程师的回怼总是无力的&#8220;我怎么知道这个BUG是不是你的？&#8221;。</p><p style="padding-top: 0px; padding-bottom: 0px; line-height: 21px; color: #666666; font-size: 14px; word-wrap: break-word; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: &quot;Helvetica， Arial， sans-serif&quot;; white-space: pre-wrap;">3、在互相扯皮的过程中，严重降低了&#8220;测试-研发&#8221;的合作效率。</p><p style="padding-top: 0px; padding-bottom: 0px; line-height: 21px; color: #666666; font-size: 14px; word-wrap: break-word; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: &quot;Helvetica， Arial， sans-serif&quot;; white-space: pre-wrap;"><strong style="line-height: 1.5em !important; word-wrap: break-word; margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">　处理方案：</strong></p><p style="padding-top: 0px; padding-bottom: 0px; line-height: 21px; color: #666666; font-size: 14px; word-wrap: break-word; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: &quot;Helvetica， Arial， sans-serif&quot;; white-space: pre-wrap;">孔子曰&#8220;其身正，不令而行；其身不正，虽令不从&#8221;，对于测试工程师来说，打铁还需自身硬。提高测试工程师排查BUG的能力势在必行。</p><p style="padding-top: 0px; padding-bottom: 0px; line-height: 21px; color: #666666; font-size: 14px; word-wrap: break-word; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: &quot;Helvetica， Arial， sans-serif&quot;; white-space: pre-wrap;">当测试工程师拿到一个BUG时，可以通过APP抓包和查找<strong style="line-height: 1.5em !important; word-wrap: break-word; margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;"><u style="line-height: 1.5em !important; word-wrap: break-word; margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">数据库</u></strong>表的方式排查这个问题到底是那个开发工程师的。</p><p style="padding-top: 0px; padding-bottom: 0px; line-height: 21px; color: #666666; font-size: 14px; word-wrap: break-word; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: &quot;Helvetica， Arial， sans-serif&quot;; white-space: pre-wrap;">举例：在APP上有一张图片无法正常呈现出来，而这个图片是由爬虫工程师采集过来的。</p><p style="padding-top: 0px; padding-bottom: 0px; line-height: 21px; color: #666666; font-size: 14px; word-wrap: break-word; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: &quot;Helvetica， Arial， sans-serif&quot;; white-space: pre-wrap;"><strong style="line-height: 1.5em !important; word-wrap: break-word; margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">　处理：</strong></p><p style="padding-top: 0px; padding-bottom: 0px; line-height: 21px; color: #666666; font-size: 14px; word-wrap: break-word; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: &quot;Helvetica， Arial， sans-serif&quot;; white-space: pre-wrap;">1）测试工程师先通过抓包的方式找出这个图片相关的HTTP请求内容，如果这个请求内容里面的图片URL为空，那么这个BUG很可能就是爬虫在采集数据或入库数据时出了问题，找出共性和规则给到爬虫工程师去处理。</p><p style="padding-top: 0px; padding-bottom: 0px; line-height: 21px; color: #666666; font-size: 14px; word-wrap: break-word; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: &quot;Helvetica， Arial， sans-serif&quot;; white-space: pre-wrap;">2）如果这个图片URL是有值的，并且这个URL可以正常打开，但是这个URL的格式不是OSS的格式（服务端会把外面的图片保存到我们的OSS环境中），那么这个问题就是服务端在保存图片时出了问题，找出共性和规则给到服务端工程师去处理。</p><p style="padding-top: 0px; padding-bottom: 0px; line-height: 21px; color: #666666; font-size: 14px; word-wrap: break-word; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: &quot;Helvetica， Arial， sans-serif&quot;; white-space: pre-wrap;">3）如果这个图片URL的格式是OSS，并且可以正常打开，但是只是在APP上无法呈现，那么这个问题就是客户端在显示图片时出了问题，找出共性和规则给到客户端工程师去处理。</p><p style="padding-top: 0px; padding-bottom: 0px; line-height: 21px; color: #666666; font-size: 14px; word-wrap: break-word; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: &quot;Helvetica， Arial， sans-serif&quot;; white-space: pre-wrap;">如果测试工程师可以做到这样的话，BUG提交和处理的流程变成如下图2所示：</p><img showalt="提高处理BUG效率第一步：提高测试工程师排查BUG能力" alt="null" src="http://www.51testing.com/attachments/2018/03/15201284_201803231113301ybyn.png" data-ke-src="http://www.51testing.com/attachments/2018/03/15201284_201803231113301ybyn.png" style="border: none; color: #666666; font-size: 14px; word-wrap: break-word; margin: 0px auto; padding: 0px; list-style: none; box-sizing: border-box; vertical-align: middle; display: block; max-width: 50%; font-family: &quot;Helvetica， Arial， sans-serif&quot;; white-space: pre-wrap; line-height: 1.5em !important;" /><p style="padding-top: 0px; padding-bottom: 0px; line-height: 21px; color: #666666; font-size: 14px; word-wrap: break-word; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: &quot;Helvetica， Arial， sans-serif&quot;; white-space: pre-wrap;"><br style="line-height: 1.5em !important; word-wrap: break-word;" /></p><p style="padding-top: 0px; padding-bottom: 0px; line-height: 21px; color: #666666; font-size: 14px; word-wrap: break-word; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: &quot;Helvetica， Arial， sans-serif&quot;; white-space: pre-wrap;">图2</p><p style="padding-top: 0px; padding-bottom: 0px; line-height: 21px; color: #666666; font-size: 14px; word-wrap: break-word; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: &quot;Helvetica， Arial， sans-serif&quot;; white-space: pre-wrap;">当然，在这个过程中，测试工程师一要提高自己排查BUG的准确度，二要提高自己排查BUG过程可以给开发做参考的可用度。</p><p style="padding-top: 0px; padding-bottom: 0px; line-height: 21px; color: #666666; font-size: 14px; word-wrap: break-word; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: &quot;Helvetica， Arial， sans-serif&quot;; white-space: pre-wrap;"><strong style="line-height: 1.5em !important; word-wrap: break-word; margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">扩展：</strong></p><p style="padding-top: 0px; padding-bottom: 0px; line-height: 21px; color: #666666; font-size: 14px; word-wrap: break-word; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: &quot;Helvetica， Arial， sans-serif&quot;; white-space: pre-wrap;">&#8220;作为一名<strong style="line-height: 1.5em !important; word-wrap: break-word; margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;"><u style="line-height: 1.5em !important; word-wrap: break-word; margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">软件测试</u></strong>工程师，需要具备哪些能力？&#8221;需要具备的能力很多，但是我觉得排查BUG能力是最重要，最有效，也是最容易被忽视的一点。</p><p style="padding-top: 0px; padding-bottom: 0px; line-height: 21px; color: #666666; font-size: 14px; word-wrap: break-word; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: &quot;Helvetica， Arial， sans-serif&quot;; white-space: pre-wrap;">测试工程师的主要职责包括质检和质控，质检的东西大家都说的很多，质控的就比较少啦，我在这里也提一下。</p><p style="padding-top: 0px; padding-bottom: 0px; line-height: 21px; color: #666666; font-size: 14px; word-wrap: break-word; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: &quot;Helvetica， Arial， sans-serif&quot;; white-space: pre-wrap;"><strong style="line-height: 1.5em !important; word-wrap: break-word; margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">质控一：上游工作质控</strong></p><p style="padding-top: 0px; padding-bottom: 0px; line-height: 21px; color: #666666; font-size: 14px; word-wrap: break-word; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: &quot;Helvetica， Arial， sans-serif&quot;; white-space: pre-wrap;">在产品刚立项、进行需求确认的时候，测试人员就会参与进去，仔细地Review需求，看需求是不是完整、有没有<strong style="line-height: 1.5em !important; word-wrap: break-word; margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;"><u style="line-height: 1.5em !important; word-wrap: break-word; margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">漏洞</u></strong>，这个时候还没有进入正式开发，修改需求对于项目组来说代价是最少的。在这个环节，测试人员凭借缜密的推演、发散性的思维，往往能发现很多需求的漏洞，提高了项目的整体效率。</p><p style="padding-top: 0px; padding-bottom: 0px; line-height: 21px; color: #666666; font-size: 14px; word-wrap: break-word; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: &quot;Helvetica， Arial， sans-serif&quot;; white-space: pre-wrap;">另外，测试人员在完成测试计划、<strong style="line-height: 1.5em !important; word-wrap: break-word; margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;"><u style="line-height: 1.5em !important; word-wrap: break-word; margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">测试用例</u></strong>以后，会邀请开发、产品一起评审测试用例，在这个环节，由于测试人员把每个需求如何细化测试都体现在了用例里面，就相当于再次把<strong style="line-height: 1.5em !important; word-wrap: break-word; margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;"><u style="line-height: 1.5em !important; word-wrap: break-word; margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">需求分析</u></strong>了个透，往往还能发现很多需求的漏洞。这也是提早发现需求漏洞的有效环节。</p><p style="padding-top: 0px; padding-bottom: 0px; line-height: 21px; color: #666666; font-size: 14px; word-wrap: break-word; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: &quot;Helvetica， Arial， sans-serif&quot;; white-space: pre-wrap;"><strong style="line-height: 1.5em !important; word-wrap: break-word; margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">质控二：下游工作质控</strong></p><p style="padding-top: 0px; padding-bottom: 0px; line-height: 21px; color: #666666; font-size: 14px; word-wrap: break-word; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: &quot;Helvetica， Arial， sans-serif&quot;; white-space: pre-wrap;">在产品完成了测试以后，就是发布的环节了，测试人员在发布的环节也能发挥作用。首先，测试人员为了部署测试环境，研究自动化部署的技术，可以把上线部署的环节也自动化，以前需要2个小时的部署环节压缩到半个小时甚至更少，而且更加准确可靠。</p><p style="padding-top: 0px; padding-bottom: 0px; line-height: 21px; color: #666666; font-size: 14px; word-wrap: break-word; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: &quot;Helvetica， Arial， sans-serif&quot;; white-space: pre-wrap;">如果有些版本修改比较多，上线的质量风险大，测试人员会跟产品一起制定灰度发布的方案并在技术上进行实现，让版本先面向一小部分用户开放，如果发现Bug了，影响的用户也比较小，Bug改掉以后，再逐渐扩大用户范围。</p><p style="padding-top: 0px; padding-bottom: 0px; line-height: 21px; color: #666666; font-size: 14px; word-wrap: break-word; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: &quot;Helvetica， Arial， sans-serif&quot;; white-space: pre-wrap;">另外，优秀的测试人员还会发动项目组的其他人一起来保证项目质量，比如推动开发进行代码Review；引入冒烟自测流程，让开发先自测以后再提交给测试做冒烟测试；通过在项目组分析Bug，让开发提高自测，降低Bug数量等；引入策划、交互、视觉在测试阶段进行走查等等各种措施。</p><img src ="http://www.cnitblog.com/shbwf/aggbug/90955.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/shbwf/" target="_blank">51testing</a> 2018-04-03 11:43 <a href="http://www.cnitblog.com/shbwf/articles/90955.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>性能测试混合场景用例设计</title><link>http://www.cnitblog.com/shbwf/articles/90940.html</link><dc:creator>51testing</dc:creator><author>51testing</author><pubDate>Fri, 23 Mar 2018 01:51:00 GMT</pubDate><guid>http://www.cnitblog.com/shbwf/articles/90940.html</guid><wfw:comment>http://www.cnitblog.com/shbwf/comments/90940.html</wfw:comment><comments>http://www.cnitblog.com/shbwf/articles/90940.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shbwf/comments/commentRss/90940.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shbwf/services/trackbacks/90940.html</trackback:ping><description><![CDATA[<p>常规业务混合操作场景性能测试用例：<br /><img alt="" data-cke-saved-src="https://static.oschina.net/uploads/space/2018/0323/094309_Siql_3634444.jpg" src="https://static.oschina.net/uploads/space/2018/0323/094309_Siql_3634444.jpg" style="width: 705px; height: 419px;" /><br /></p><p><img alt="" data-cke-saved-src="https://static.oschina.net/uploads/space/2018/0323/094320_gcSF_3634444.jpg" src="https://static.oschina.net/uploads/space/2018/0323/094320_gcSF_3634444.jpg" style="width: 709px; height: 547px;" /><br /></p><p>转载：http://www.51testing.com/html/09/n-3725309.html</p><img src ="http://www.cnitblog.com/shbwf/aggbug/90940.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/shbwf/" target="_blank">51testing</a> 2018-03-23 09:51 <a href="http://www.cnitblog.com/shbwf/articles/90940.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>谁让App工程师产生了泡沫？</title><link>http://www.cnitblog.com/shbwf/articles/90935.html</link><dc:creator>51testing</dc:creator><author>51testing</author><pubDate>Thu, 22 Mar 2018 02:13:00 GMT</pubDate><guid>http://www.cnitblog.com/shbwf/articles/90935.html</guid><wfw:comment>http://www.cnitblog.com/shbwf/comments/90935.html</wfw:comment><comments>http://www.cnitblog.com/shbwf/articles/90935.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shbwf/comments/commentRss/90935.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shbwf/services/trackbacks/90935.html</trackback:ping><description><![CDATA[<div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">这两年<a target="_self" style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;color:#111010;&quot;;"><u style="word-wrap: break-word; margin: 0px auto; padding: 0px;"><strong style="word-wrap: break-word; margin: 0px auto; padding: 0px;">移动</strong></u></a><a target="_self" style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;color:#111010;&quot;;"><u style="word-wrap: break-word; margin: 0px auto; padding: 0px;"><strong style="word-wrap: break-word; margin: 0px auto; padding: 0px;">互联网</strong></u></a>比较火，移动APP的开发人员也是比较紧缺。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　面试了一个做APP的，能力很一般，态度也比较傲慢。最后感觉肯定不会用这个人了，但是出于验证自己想法的目的，还是很诚恳地以一个决定录取他的态度，和他交谈。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　&#8220;刚才我问了你一些问题，可能比较偏，或者不是你所擅长的。我也是本着为公司负责的态度，问一些我们经常用到的问题。这一点请见谅。&#8221;，我说。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　他说：&#8220;没事的，问的确实有点偏。实际<a target="_self" style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;color:#111010;&quot;;"><u style="word-wrap: break-word; margin: 0px auto; padding: 0px;"><strong style="word-wrap: break-word; margin: 0px auto; padding: 0px;">工作</strong></u></a>中，根本用不到，用到了现查就行，网上好多例子，复制粘贴都能搞定！&#8221;。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　我说，我们企业招一个人，你入职一个企业，是一个相互选择的事情。我问完你了，你对我们公司有什么想了解的。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　他有点发楞，停顿了一会。我提示他，公司的业务发展，个人的提升空间，你的职业规划？</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　他说，噢，咱们公司是做什么的？</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　我回答道，我们主业务是做基于社区的O2O平台的，现在业务有几块，深度垂直做上门推拿服务，打通商家上下游做云商供应链，最终将打造一个庞大的社区服务生态体系。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　他似乎没有听懂，依然发楞。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　&#8220;还有什么想问的吗？&#8221;我问。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　他似乎早想问，一直不好意思问，但是又不想在这浪费时间了，问道：&#8220;公司都有什么福利，年终奖是多少，加班费怎么算&#8230;&#8230;&#8221;。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　我都一一回答了。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　沉默了一会。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　我问道：&#8220;你能接受的最低待遇是多少？&#8221;</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　他说，就是简历上写的那些。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　我死死地盯着他：&#8220;如果我给你降一千你愿意吗？&#8221;</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　他摇了摇头。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　&#8220;降五百呢？&#8221;</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　他回答说：&#8220;我已经面试了四五家公司了，他们都要我，我也答应了。现在就是再面试几家，看看哪家更高。所以，我没必要&#8230;&#8230;&#8221;，他向我耸肩，然后不说了。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　我说，你要的这个数，在我们公司不算高，好多人都拿的比这个多呢。你去过的那几家公司，多少人？</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　他说，也得有，差不多，估计一百多人吧。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　我问，做APP的多少人？</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　他回答，一两个，有的没有，我去了是第一个。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　谁面试的你，我问。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　有的是经理，有的是老板，都很希望我能快点入职。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　我说，好的，我们会把你面试的情况和你做的作品评估一下，然后再联系你。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　他走了。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　这不是个例。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　大多数年轻人都差不多这样。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　他们没房没车没压力，以单纯的收入高低作为亲友间的炫耀和比较的资本。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　让我陷入沉思的是，为什么一个近乎只能称得上操作和修理工的人，却顶着一个工程师的名号，可以到处要高价，而且还真有公司愿意给。享受能力所不匹配的东西，这显然是一种病态，结果必定可悲。谁赋予了他们这样的优厚际遇？或者，谁成心想害他们？</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　答案是这个飞速发展时代和无可奈何的企业。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　移动互联网，这五个字可谓炙手可热。互联网+，又让这热度增上三分。好多公司都想搭上这艘船，捞一桶金，弄不巧还会成就一番霸业。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　怎么搞？好多人都觉得移动互联网就是个APP。想踏入移动互联网，首先要搞一个APP出来，拿出去好说话嘛！这种想法就像是，我研发个POS机有一家银行了能做金融了一样。你的POS机之所以能刷卡转移资金，是因为后面还有一个银行体系支撑，来了钱给谁，扣的钱从哪里出，是有一套服务做支撑的。这套服务，相比一个POS机而言，大象和蚂蚁的关系。还不明白的话，去五金店买一个淋浴头，在太阳下试试会不会喷水，那个淋浴头就是业务中的APP。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　好多小企业老板很明白政治和经济局势，但是不明白技术，他们觉得第一步先需要APP，其他的根据需求再说。于是，他们老板甚至亲自面试，随便聊聊天，要多少给多少就招进来了，先有人开个头再说呗。最后，发现不是这么一回事，有了淋浴头了还需要水管才能喷水，自己建供水系统太大，在小区建使用人群太少，连接卫生间的水管，跟自己又没啥关系。命长公司的干上半年，招的人也不专业，凑合随便弄一个出来，员工感觉老板瞎弄没有成就感，老板也感觉看错了人不出成绩。于是，一拍两散。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　出来的这人再换工作，感觉自己没有被完全发挥出来，现在工作经验也涨了，薪水肯定也得涨。于是，又找到一个公司，老板一看，这人以前待遇都那么高，那老板肯定不傻，做了那么久了也有成果，我这又急需要人，再涨一段吧。这个公司干半年，和上一个公司一样循环，直到一个顶点。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　这就造成了，个人技术没有实质提高，待遇却虚高。公司支出增加了，回报却没有增加。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　这就是泡沫啊，在慢慢膨胀的泡沫。这泡沫在小企业中很明显，在中型以上企业中不明显。第一，因为中型企业都有专业的人才，这些人能判断和规划整个业务体系，不至于盲目。第二，也正是由于规范和专业，所以吸引了很多更看良性成长环境的有志之士。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　泡沫，毕竟是泡沫，终有爆破的那一天。这个时间不会很长，3到5年。随着新技术慢慢变旧（当<a target="_self" style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;color:#111010;&quot;;"><u style="word-wrap: break-word; margin: 0px auto; padding: 0px;"><strong style="word-wrap: break-word; margin: 0px auto; padding: 0px;">Android</strong></u></a>和IOS变成和C语言一样老），随着大批量的人才涌入和一些公司退出（十万开发者面对一千岗位），随着很多老板慢慢发现原理和真相（APP真的只是个终端）。我们再来设定一下，曾经那些在小公司频繁蹦来跳去的人，和那些在成熟部门茁壮成长的人，他们命运是不是会发生颠覆性的改变。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　互联网行业不同于传统行业，不存在第二。最终的局面是巨头垄断和精细化小企业填补的局面。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　其实公司和人历程都一样，都会遇到千奇百怪的事情，但是殊途同归平淡是真，最终都要踏实笃行。你一步一步地走，你眼看别人起高楼，你眼看别人宴宾客，你也眼看别人楼倒塌。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　你也可以心想自己建起一座壁垒，固若金汤，经久不衰，称为经典。</div><span style="font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 16px;">&nbsp; &nbsp; 转载：</span><span style="font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 16px;">http://www.51testing.com/html/00/n-3647600.html</span><img src ="http://www.cnitblog.com/shbwf/aggbug/90935.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/shbwf/" target="_blank">51testing</a> 2018-03-22 10:13 <a href="http://www.cnitblog.com/shbwf/articles/90935.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我为什么突然想转管理？</title><link>http://www.cnitblog.com/shbwf/articles/90923.html</link><dc:creator>51testing</dc:creator><author>51testing</author><pubDate>Tue, 20 Mar 2018 02:15:00 GMT</pubDate><guid>http://www.cnitblog.com/shbwf/articles/90923.html</guid><wfw:comment>http://www.cnitblog.com/shbwf/comments/90923.html</wfw:comment><comments>http://www.cnitblog.com/shbwf/articles/90923.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shbwf/comments/commentRss/90923.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shbwf/services/trackbacks/90923.html</trackback:ping><description><![CDATA[<div style="line-height: 24.5px; font-size: 14px; font-family: &quot;PingFang SC&quot;, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif;">&nbsp; &nbsp; &nbsp; &nbsp;转载：http://www.51testing.com/html/20/n-3725220.html<br />       写在前面<br />　　关注我的小伙伴可能都知道，我是一个测试开发工程师，目前在 GitHub 有着约 7k 的 Star 量，在各大博客网站访问量也是破百万大关，而且一直以来都被不少粉丝奉为「技术大佬」。其实并不是这样，我在 Android 技术领域，其实是一个十足的菜鸡，只是花了不少的时间在写作上罢了。<br />　　写作确实很重要，可以明确的说，写作成就了我的现在，虽然它还不够好，但我其实还是挺满意的。最近面试了一个 Android 开发，我似乎看到了我以前的影子，会的东西还好，但真的表达不出来，而现在的我，想必就是写作带给我的转变吧。<br />　　怎么突然有了转型管理的想法呢<br />　　我一直是深耕技术的一线 Android 开发者，自然大多数人都想着是一定会把技术进行到底，或者说至少还会做乐于做技术一段时间。其实不止你们这么认为，就连对我知根知底的公司领导，也这么认为我。因为对于一个尚且还年轻的小伙子来说，现在想转型，真的太早了。不过在这个问题上，我目前还是想的比较透彻的。<br />　　我目前渴望成为管理者的「理由」<br />　　&#183; 希望突破「个人贡献」的天花板<br />　　对于我自己来说，我还是希望对公司释放我更大的贡献。每个公司对技术研发都有不同的岗位和职级划分，其实归根结底归为两类：「个人贡献者」和「非个人贡献者」。<br />　　技术开发、 UI 设计和产品经理是典型的「个人贡献者」，开发的主要工作是写代码，他的所有产出就是一行行代码所构成的最终产品。UI 设计的产出就是他的设计稿，同样产品经理的产出就是他的原型图和需求文档。这些所有的产出和对公司的贡献，都是来自个人的，很少依赖别人。<br />　　而作为一名管理者的话，就完全不一样了，他做的工作可能是不停地组织沟通和协调这些人。对于一个「个人贡献者」，工作时间顶天就 24 小时，他不休息地高效工作。但一个好的管理者的话，发动身边的人，朝一个目标努力，这个团队贡献是上无止境的，想想都刺激！<br />　　所以这是我第一个理由:因为我想驱动更多人朝着一个方向努力，做出一个有着更大贡献的产品。<br />　　&#183; 终究我还是会面对管理<br />　　作为一个技术人来说，通常也就只有四条路：管理、产品、技术总监 or 转行。<br />　　可能有很多人说，「我不喜欢做管理，我就喜欢做技术，我就是纯技术控」。其实有很多人都这样想，包括我曾经也是如此。技术人的职业阶梯总是很美好，认为自己可以成为阿里多隆，对，就是哪个阿里仅有的 P11，我一直的偶像。<br />　　但不管我们的技术做的有多棒，终究还是会管理几个人的，当你达到技术的一个很高层次的时候，多多少少，我们还是得带新人，带其他技术人员，让大家一起朝一个方向冲刺。从这个角度讲，不管是不是想一直走纯技术路线，我们都需要增长自己的沟通和管理技能。<br />　　所以这是其二：我总会到管理。正如今天我们 CEO 给我讲的一样，「我们技术人总会慢慢转型，只是我们可以去把控这个时间而已，早一点上去可能意味着更多的困难，但迟一点上去可能意味着损失机遇」。<br />　　讲一讲很多人的「误区」<br />　　可能就会有不少人质疑我了，说南尘其实想做管理的原因其实不是这个，五花八门的都有。<br />　　&#183; 只是期望拿到更多的薪水<br />　　大多数人认为，管理人员的薪水都更高，所以难免以偏概全，认为我是为了薪水所以期望转行。<br />　　薪水确实很重要，但这个想法一点都不对。大多数技术足够牛逼的人，薪资都是比他的管理者高的，因为这些高级技术人员技术已经牛逼到了业界没几个能做好。<br />　　对我的家境来说，钱确实很重要，但远远没重要到这个地步。<br />　　&#183; 期望指引别人<br />　　其实用「指引」的时候，我好像用「指使」呀。因为肯定有很多人这样想了，管理人员可以高高在上，随意使唤别人。<br />　　但我觉得恰恰相反，很多时候，领导都是负责背锅的，负责给大家抗压擦屁股的，领导才是那个给大家端茶倒水，服务大家的人。<br />　　这是我真实的看法。我们公司技术副总贾总，就是这样的一个人，明明技术都牛逼的要死，却因为做管理，整天接受着来自外部和内部的轮番轰炸。其实我真的超级心疼他，因为本已经是最努力的那一批人之一，却还被这样到处被数落，而且还经常遇到下属闹脾气。<br />　　所以，放下心中的偏见吧，好好对待你们的老大。我也已经有了背黑锅，接收轰炸的觉悟。<br />　　&#183; 指望工作更加轻松<br />　　很多人认为程序员很累，996 加班已经是很多公司的常态，有时候改需求，上线任务，还要加班到深夜。还好我们公司基本很少加班，是个标准的每周 40 小时的公司。但我们的技术领导，真的是一年 365 天，98% 的时间都在工作。所以，我会为了让工作更轻松而产生这个想法吗？<br />　　&#183; 更容易换工作<br />　　这可能是最扯淡的一种看法了。对于我们开发人员来说，只要技术实力过硬，根本就不可能愁找不到工作的，而且觉得是薪资待遇还不低。<br />　　但作为一个管理人员，换工作会更容易吗？完全扯淡。一个空降的管理，要融入技术团队是非常困难的，这需要非常多的时间。因为他们需要去面对这些出名的「寡言者」( 对，说的就是你，程序员！)，需要去了解团队每一个人的擅长点和不擅长点，需要去了解团队成员是属于「自我驱动型」还是「被动接受型」人才，这是非常需要时间的。和每个人打交道，应该用怎样的方式才合适，自己公司的产品有怎样的用户场景和用户行为，为什么需要做这些功能，未来产品发展何去何从？需要思考的问题太多了，而且这大多数情况下还不是通用的。<br />　　说的简单点，我一个 Android 开发，假设想换工作的话，完全不可能想着从事管理行业。甚至退一步说，即使有天我离职了，我依然肯定会选择我擅长的 Android 开发岗位，而这时候，下家公司看重的却只是我的技术实力。<br />　　所以，我可能为了换工作而想转行管理吗？<br />　　我为这次转型管理做了哪些准备？或者说我的优势<br />　　&#183; 高效的时间管理能力<br />　　可能大多数程序员都是「被动接受型」，我们只需要把每天领导安排的开发任务完成就可以愉快地玩耍了。但我不是那样的人，我是典型的「主动驱动型」选手，没事的时候，强迫症的我总是喜欢去重写那些自己看不惯的代码，优化超垃圾的逻辑。所以经常可以看到我怒怼产品经理，但恰恰我和我们的公司的产品经理关系非常要好。我想这大概是怼多了，导致顺从我了吧。<br />　　这个我其实知道，因为一个公司很重要一点是解决用户需求，所以很多时候我们的产品经理是迫不得已的，有些功能是没有按照想象的出发的。<br />　　我认为时间管理应该是技术转型管理的第一课，而非常 Nice 的一点是这个能力我早已具备了。我一直以来是一个喜欢规划任务的人，这从小而来的习惯，现在正促就了我现在。<br />　　&#183; 强大的总结能力<br />　　正好今天我们 CEO 找我面谈的时候，他提到了他这个「放电影」能力：即每天晚上睡觉前会自动过一遍当天的所有事情，这正好也是我从小学习成绩优异的原因。我上学那会儿，记忆力一直不好，就连抄写在笔记本上也不行。但我后面每天晚上过一遍当天内容，我发现我很多东西自然而然就记住了，正好这个方法，也推荐大家运用，因为作为一个技术开发来说，学习能力和记忆力太重要了。<br />　　对于总结方面，其实和上面的时间管理有很大的挂钩。因为一个管理者的时间正常由「被动时间」和「主动时间」所构成。而所有的「主动时间」都应该花在总结上，作为一个管理人员来说，需要对各种事情做有效的排期，最重要的当然要放在最前面。<br />　　对于一个长期写博客的我来说，总结能力方面自然是尚可的。<br />　　&#183; 表达能力（沟通能力）<br />　　对于一个管理型人才来说，这个相当重要，因为每天可能都需要大量地时间去和各种各样的人打交道。需要去说服市场部的人员了解自己手中的进度，并接受自己的排期；也需要去和本部门的员工做各种各样的交流协调，而有个很重要的一点就是，都需要用他们最喜欢的方式。<br />　　很多人认为指导新人是一件非常累的事情，因为要给他讲超级多的东西。在我们公司，严格说，我不算带过新人，但确实也做了不少的入职培训和后期工作安排，而这，对我的表达能力提升非常重要。每个新人的特点都不一样，你需要针对每个人的特点，来定制他的个人能力和成长计划，并且需要做刻意的沟通。说到这里，也是希望大家改变一下自己的观点，其实，带新人的时候，这对你的表达能力锻炼非常大。<br />　　&#183; 「刻意练习」能力<br />　　说这个词，同样是去年我的公司老总告诉我的。当时是准备去参加「Android 巴士线下交流会成都站」，而我作为一名技术演讲嘉宾。我感到非常恐惧，因为从来没上台的我，突然要面对这么多同为 Android 开发的技术大牛，这对我来说要求太突然了。<br />　　于是我找到了我们的高总，他语重心长给我说了一大堆话，其中提到了一个很关键的词语就是「刻意练习」。至今深刻的是，他说他现在能做到随便脱稿演讲，就是因为他之前「刻意练习」过很多演讲活动。<br />　　非常庆幸，我现在已经学会了时刻「刻意练习」自己的能力，并不断提高。<br />　　&#183; 「向上管理」能力<br />　　严格来说，这方面的能力还是我当下比较欠缺的。我目前仅仅是做好了及时回馈自己的工作进度以及公司每天要求的日报。但实际上在「向上管理」层面，我能做的还差的多。<br />　　但当管理一个团队的时候，向上级汇报情况就变得非常重要了，就连 CEO 不是也得向董事会汇报嘛。<br />　　总应该会有一个「向上管理」的过程，我们需要去和老大沟通，以便于明确整个团队在未来需要解决问题的主次方向。<br />　　在德鲁克的那本书里举过这样一个例子：主管写下一个目标，然后让上司写下他对主管的工作目标和期望，你会发现大部人写的都不一样，这就是缺乏沟通的一个问题。<br />　　如果没有这个「向上管理」的话，你可能把整个团队都给带偏了，最后老大会说我要的并不是这个，我要的是另外一个东西。所以说一定要做好向上管理。<br />　　写在最后<br />　　其实作者南尘本篇的总结还是蛮多的，那ZOE还是想告诉大家，首先要清楚自己做的是什么，如果自己一时没有清楚挥着跟风附和，那你将苦了自己~</div><img src ="http://www.cnitblog.com/shbwf/aggbug/90923.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/shbwf/" target="_blank">51testing</a> 2018-03-20 10:15 <a href="http://www.cnitblog.com/shbwf/articles/90923.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>良好的BUG报告可以为你节省宝贵的时间</title><link>http://www.cnitblog.com/shbwf/articles/90922.html</link><dc:creator>51testing</dc:creator><author>51testing</author><pubDate>Mon, 19 Mar 2018 02:23:00 GMT</pubDate><guid>http://www.cnitblog.com/shbwf/articles/90922.html</guid><wfw:comment>http://www.cnitblog.com/shbwf/comments/90922.html</wfw:comment><comments>http://www.cnitblog.com/shbwf/articles/90922.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shbwf/comments/commentRss/90922.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shbwf/services/trackbacks/90922.html</trackback:ping><description><![CDATA[<div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">&nbsp; &nbsp; &nbsp; &nbsp;转载：http://www.51testing.com/html/45/n-3721645.html&#8203;<br style="word-wrap: break-word;" />&#8203;&nbsp; &nbsp; &nbsp;&nbsp;一份糟糕的<a target="_self" style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;color:#111010;&quot;;"><u style="word-wrap: break-word; margin: 0px auto; padding: 0px;"><strong style="word-wrap: break-word; margin: 0px auto; padding: 0px;">BUG</strong></u></a>记录不仅烦人，而且大大增加了时间长的开销。为你的下一份BUG报考增加更多更详细的信息，可以使你更快速的定位BUG从而节省时间成本。 注释: 这篇<a target="_self" style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;color:#111010;&quot;;"><u style="word-wrap: break-word; margin: 0px auto; padding: 0px;"><strong style="word-wrap: break-word; margin: 0px auto; padding: 0px;">文章</strong></u></a>在早些的时候已经在我的网站发表过。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　<strong style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;&quot;;">介绍</strong></div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　我想一份糟糕的BUG报告和很多人都有着或多或少的关联，或是客户支持的工作人员， 用户的反馈<a target="_self" style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;color:#111010;&quot;;"><u style="word-wrap: break-word; margin: 0px auto; padding: 0px;"><strong style="word-wrap: break-word; margin: 0px auto; padding: 0px;">报告</strong></u></a>、开发人员、<a target="_self" style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;color:#111010;&quot;;"><u style="word-wrap: break-word; margin: 0px auto; padding: 0px;"><strong style="word-wrap: break-word; margin: 0px auto; padding: 0px;">测试</strong></u></a>人员或一级<a target="_self" style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;color:#111010;&quot;;"><u style="word-wrap: break-word; margin: 0px auto; padding: 0px;"><strong style="word-wrap: break-word; margin: 0px auto; padding: 0px;">技术</strong></u></a>支持，一份糟糕的BUG报告给他们带来时间上的开销。除了一些（大多数）开源项目，人们花费了宝贵时间，但是这也意味着他们花费了金钱。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　我将通过这篇文章告诉你一份糟糕的BUG报告怎样浪费你宝贵的时间和金钱的，同时也会告诉你如何才能做的更好。下面开始从一个简短的解释来告诉你们一份糟糕的BUG报告到底长什么样子。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　<strong style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;&quot;;">　糟糕的BUG报告是什么样子的?</strong></div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　当我想到糟糕BUG报告的时候，我的脑海里它是这样的:</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　&#8220;我试着执行 sendMsg(&#8220;hello world!&#8221;)但是没有成功.&#8221;</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　相当不错的一个例子对吧? 这个报告只告诉我们它无法正常执行工作，但是并没有告诉我们任何其他详细的信息, 开发人员会打开程序的一部分代码检查，我保证大部分都会正常的工作。所以，什么样的BUG报告才算是标准的呢？ 这里有几个例子，我认为是比较重要。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　<strong style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;&quot;;">　1.缺少细节</strong>就想上面的例子当中，你很难去发现到底哪里出现了错误，因为这份BUG报告没有提供任何细节。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　<strong style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;&quot;;">2.且少日志/错误消息</strong>错误消息的出现, 日志的写入、但是不知为何有些人总是忘记把他们写出到BUG报告中去。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　<strong style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;&quot;;">3.一份报告中多种BUG的组合</strong>为此为曾花费了大量的时间. 人们找到各种各样的BUG 但是没有全部都写入到一份报告中去。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　这里还有更多类似的情况，但是这些我认为是最重要的，下面我继续看看如果你提交这样的一份糟糕的BUG报告会有什么后果。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　<strong style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;&quot;;">　糟糕的BUG报告浪费时间和金钱</strong></div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　另外一个例子: 比如说你提交了一个联系人系统的一份很差的BUG报告：</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　&#8220;我尝试添加新的联系人，但是没有添加成功！&#8221;</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　现在在另外一边的票务系统会发生什么？ 其他人在他们的机器上执行同样的程序，设置添加联系人并且成功了。现在至少有两件事情会发生:</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　1.你肯定会马上把票据拿回来，然后客户会问你发生了什么？（至少我肯定会这么问你）</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　2.有人可能会尝试着寻找一切可能造成这个BUG报告的原因: 这个联系人不能被添加. 没人知道是不是哪里有错误消息, 或者根本没有执行. 或者这个BUG出现是因为点击了添加联系人的按钮又或者是保存数据的时候出错. 大多数情况这个人是没有办法找到原因的所在, 所以最终你只能拿回票据并且被不停的追问到底发生了什么.</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　<strong style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;&quot;;">　退回发票继续时间的浪费</strong></div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　无论售后人员和技术支持作何反应都会加大时间的开销.首先有人需要对这个问题做基本的分析. 由于你没有提供详细的BUG描述，这会让他们只能猜想哪里出了问题. 技术支持会一直找问题的原因直到最终来问你。 也有可能他们会把这张票据直接给你，因为你没有提供任何可供参考的BUG描述。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　不管怎样都会到你这里, 因为除了你没人直到发生这个BUG的原因，因此他们可能会让你对BUG增加一些更详细的解释 (他们为什么自己就不能搞定这个问题呢？你心里一定这么想) 时间一天一天的过去，就是因为你提交了一个这样糟糕的BUG报考. 但是你需要提供一些信息, 否则其他技术售后无法重现BUG，无所修复这个BUG. 那么你现在会怎么做呢？我想你应该会打开那个票务系统尝试在你的机器上操作，你猜怎么着？它很可能这次不会出任何问题. 就因为你没有对BUG做一个良好的处理，对软件公司造成了时间上的流失，时间就是金钱。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　但是让我们假设一下你可以重现这个BUG, 你打开这个票务系统，这次你添加了一些对BUG的描述. 然后技术售后看到这个问题，但是这一次你提供了一些BUG描述，然后他们通过你你提供的错误报告极有可能马上就可以修复这个BUG. 但是大部分的时候他们还是无法修复这个BUG. 然后他们有找到你让你在编写代码的时候 写入更多对BUG的处理信息.然后没完没了 &#8230;.</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　<strong style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;&quot;;">时间就是金钱，不要浪费金钱。</strong></div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　这张票据来回折腾浪费了很多时间. 每当有一个技术售后的一个人拿到这样的一张有问题的票据, 他或者她每次都需要想办法重新BUG，找出问题。技术售后同时还有其他的事情需要做，原本他们可以一周做更多的事情，但是现在他们需要花更多的时间来处理票据的问题，对于软件公司来说，时间就是金钱，你就是在浪费公司的钱。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　那你呢？他们每次来问你关于这个BUG的时候，你每次都需要重新检查问题出在哪里然后再告诉他们解决方案. 如果你是自由职业者或者在做生意, 你可以用这些时间做其他的事情. 就好比赚钱，你可以用这些时间赚钱，而不是花更多时间而一分钱挣不到. 当然你是程序员你是被雇佣的，你会拿到工资, 但是浪费了在这个项目上的时间，就是浪费了公司的钱，试着想一下，如果你能处理好这个问题你的工资会更多呢？</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　现在你看到了一份BUG报告的影响有多大. 你和技术售后肯定都已经烦了. 除此之外 每个人都在失去金钱. 但是我们不想浪费时间和金钱, 所以让我们来看看怎么避免这样的情况。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　<strong style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;&quot;;">一份良好的BUG报告应该长什么样?</strong></div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　在此之前，我想说有很多的方法可以写出好的BUG报告. 这取决于你要提交BUG报告的产品, 有一些BUG报告的模板. 如果是这样的话, 下面这些模板提供了详细的BUG信息。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　如果没有模板遵循的时候，至少你要学会提供 at least (!) 这样的信息:</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　1.如果可以的话: 这里添加BUG的版本号. 有些时候你修复过的BUG会再出现另外的BUG，这个时候你需要用BUG版本号来区分。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　2.怎么重现 提供一个详细的步骤告诉别人怎么够能够重现你遇到的情况</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　3.预期行为 提供多种可能引起这个BUG的可能性，例如：1、可能是您那里操作错误了。2、可能是提供的参数错误。3、可能是XXX ，像这样多种的可能性。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　4.观察行为 描述一个程序应该发生的行为和预期的行为. 这里你就可以解释为什么会有这个BUG报告，哪里出错了。因为这里发生的行为是和预期行为里的某一项是一样的。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　5.如果可以的话: 包含一份日志 这个取决于产品的类型. 如果你知道日志在哪里的话直接使用它们并且发送出来就可以，对于某些类型的产品，它可以让你得到一些详细的信息，找到一个日志文件. 也有一些你没有办法访问日志文件,这样的话他们也就不会问你要日志。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　当然，你总是可以提供更多的信息，如截图和代码示例 (如果是框架或者库), 总之尽量去添加多重可能性，2-5个，这样可以为你节省大把的时间。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　<strong style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;&quot;;">总结</strong></div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　今天你学到了</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　&#9679;糟糕的BUG报告。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　&#9679;它对于时间和金钱的开销很大。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　&#9679;如果写一个良好的BUG报告。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　几个星期前，我在Twitter上看到一个话题是关于糟糕BUG报告的,但是具体是谁发起我记不太清楚了。 但是我想分下分享里面的一句话，一直停留在我脑海里的。 原话：</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　Bug reports are handled with the same effort you put in writing them.</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　译：</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　大概意思就是，多少努力多少回报，你在BUG上下了多少工夫，那么它给你带来的受益也成正比的。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　也许你会记住今天学到的，或许你改天会创建一个这样的票务系统。我肯定会这么做的。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　PS: 如果你知道这是谁说的，我一定会很感谢他/她</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　我希望这篇文章能够让你了解BUG报告的重要性，也希望在以后你在对BUG的处理上多少有些帮助。</div><img src ="http://www.cnitblog.com/shbwf/aggbug/90922.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/shbwf/" target="_blank">51testing</a> 2018-03-19 10:23 <a href="http://www.cnitblog.com/shbwf/articles/90922.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>换过很多工作，却依然无法在科技行业过好一生</title><link>http://www.cnitblog.com/shbwf/articles/90901.html</link><dc:creator>51testing</dc:creator><author>51testing</author><pubDate>Fri, 16 Mar 2018 03:01:00 GMT</pubDate><guid>http://www.cnitblog.com/shbwf/articles/90901.html</guid><wfw:comment>http://www.cnitblog.com/shbwf/comments/90901.html</wfw:comment><comments>http://www.cnitblog.com/shbwf/articles/90901.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shbwf/comments/commentRss/90901.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shbwf/services/trackbacks/90901.html</trackback:ping><description><![CDATA[<p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp; &nbsp; 作为工程师或者<strong>开发</strong>人员，你可能会认为除了写代码以外的一切都是没有生产力的。但是往往却会遇到各种影响生产力的事情。Alejandro Wainzinger就是这样，他以为自己遇到的这些问题也许是进的公司不对，结果大中小型公司都换了一遍之后，发现到头来工作总是会变糟。为此,下文在计划、所有权、<strong>技术</strong>债务、设计、编码、会议、流程、沟通、评估、宣传、面试等方面的常见问题，并给出了自己的解决方案，供各位参考。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;"><img src="https://www.testwo.com/attachments/13977/1521168988164.jpg" data-ke-src="/attachments/13977/1521168988164.jpg" alt="" style="border: 0px;" /><br /></p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">无论我去过多少家公司，工作到最后都会变糟。在我工作过的技术公司里面，早晚都会出现一些问题，这些问题要么需要做出管理方面的改变，要么需要对现有的管理风格迅速做出极端改变。但通常这些需要的改变都不会发生，然后我开始换地方，希望能遇到更好的管理。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;&nbsp;作为独立贡献者，我已经在大中小规模都有的好几家技术公司当过<strong>web</strong>后端软件工程师。我想通过本文卑微的努力把我所见到的事情、问题出在哪里、以及可能的解决方案是什么说清楚。我写这个是为了梳理自己的思路，同时也希望有人能从这些故事当中找到熟悉的东西，并且了解到并不是只有他自己才体会到这些。在某些情况下，这些看起来似乎是开发者的问题，但是开发者是在管理层创造的环境下工作的，所以我也把它们列进来了。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;&nbsp;如果你很忙的话，我已经把要点标出来了。不过，知道这些要点是什么意思会更好一些。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;"><strong>1、计划</strong></p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;"><strong>　没有路线图，或者路线图很虚</strong></p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;对成功应该是什么样没有想法或者想法很少的话，你是永远也无法实现的。项目的想法模糊会导致写出来的代码也含糊，运行&#8220;晚&#8221;（没有路线图的话你怎么知道呢？），以及各种沮丧。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;解决方案：制订路线图。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;&nbsp;路线图不以现实为基础（没有找工程师/利益攸关者进行估计，过程中没有检查点）</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;管理层决定了一系列他们想要的事情，并且决定这个季度就要完成。但如果没有来自执行那些工作的人提供输入的话，那些设想可能就是空中楼阁。没有检查点去了解事情的进展情况的话，项目就会完成得很迟，往往太迟了以至于要重新确定范围，希望能完成点有意义的事情。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;解决方案：强迫那些负责做事的分解时间表，并且要合理化。让他们暂停写代码（很多开发者认为只有写代码才算生产力），先做完这个。对于好的、周密的估计要激励。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;路线图制订得太迟（在开发期间）</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;先做项目，上路后才制订路线图。突然才意识到正在做的项目毫无意义。时间和精力还有士气都没了。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;解决方案：在开始工作前花时间制订路线图。你不需要预测每一种可能的未来，但是当你了解形势时就更容易把握好方向不至于撞车。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;路线图的极端改变不是因为环境变化，而是因为短视或者原先的计划缺乏周密性。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;某一天商业团队一觉醒来决定另一个项目的优先级应该更高，因为这样才可能有高速发展的走势，只是他们一开始没有事先花时间确定好事情的优先级。几个月的努力变成白费功夫，而这其实是完全可以避免的。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">解决方案：认真对待路线图。好好确定优先级。除非商业方面发生了极端的变化，路线制订好就要坚定走下去。犹豫不决造成的损失比坏决定还要糟糕。致力于你说自己要做的项目。那是可以衡量的生产力。如果你对上一个优先级感到后悔的话，下个季度别再犯同样的错误了。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;"><strong>2、所有权</strong></p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;"><strong>项目缺乏直接负责人</strong></p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;项目是建立了，也分配给团队了。也许某人下达跟踪要完成工作的工单。一些人想起来的时候就去处理这些工单。经理偶尔会在邮件里面问问进展情况。开发者都是各自回答问题。结果表明该项目严重滞后，而且很多工作都没做好。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;解决方案：选定1个人，其工作是确保项目取得进展。这个人有权力跟经理去谈，如果必要的话可以申请更多的资源，但到头来回答关于进展情况并且推动事情发展的都是这个人。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;"><strong>&nbsp;&nbsp;某个大项目只有一位工程师孤军作战</strong></p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;每个人都忙着做项目。一个人有点空闲，然后被分配去做一个重要的项目。并行主义万岁对吧？错。这位工程师试图知道事情是怎么做的，但是得到的帮助寥寥，因为别人都很忙。没人审核她的工作。他们问什么地方耽误了她也回答了，但是没人对答案感到满意。她请求帮助但是被告知没有人有空。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;解决方案：除非你是在初创企业，已经快没钱，再过几周就要死掉，否则的话一个项目至少要分配2个人，理想的话3个最好。他们会提出问题的可能性要高得多，因为相互之间可以讨论工作，一起推进事情前进。而引入第三个人可以在设计决策和代码审核方面打破僵局。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;代码评审缺乏责任担当，不够彻底，指责代码作者</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;来了一个pull请求。你很忙，这个人可能知道他们在做什么，只需要同意就可以继续你的事情了。轻而易举的同意谁不喜欢呢，对吧？再想想。看都没看只能说明你是个懒人。而且你还给别人开了先例，行啊，我以后也可以不审核代码了。当别人写的代码出问题时人家会说你不是看过了吗？代码是你批准的，负责也有你一份。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;解决方案：认真对待代码评审。如果你没有时间，把它分配给别人，或者问问pull的请求者是不是能够等久一点因为自己还没时间。我向你保证，你会对自己的所谓感到高兴的。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;"><strong>技术债务</strong></p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;没有采取合适行动让旧系统退役，重写及/或撤除现有遗留系统</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;到了一定时候，某个遗留的单一程序规模达到了像利维坦巨兽那样的地步，而且给web带来的灾难之严重已经到了妨碍开发的地步。现有的资深开发者处理相关事情的时候都有困难，新的开发者更是骂骂咧咧了好几个月才稍微提高了一点效率，奇怪的崩溃潜伏着，导致你的客户时不时会出现莫名的问题。但管理层总是优先考虑产品，并没有意识到技术债务拖累了他们非常渴望的产品功能研发。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;解决方案：企业必须赋予技术债务足够的优先级。遗留系统中最臭名远扬的问题必须优先处理。重写的工作必须按照规模大小依次处理。这会给将后的功能开发带来时间红利，连开发者的幸福感和寿命都会增加。大家常说开发者离开的不是自己的工作，而是他们的老板，但我认为很多时候，开发者离开的也是他们的代码库。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;"><strong>　开发没有必要写的系统</strong></p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;&#8220;你有没有听说过那门很酷的新语言？我用周末的时间学了，现在想看看用到生产过程里面会怎么样。我听说挺棒的。&#8221;然后，一个用新语言开发的新系统做出来了，结果发现它做的东西跟某个现成的开源库非常类似，只是针对了比较特殊的用例，而且支持的开发者比较少。这个项目迟早都会延误，开发者离开了那家公司，可是在这个系统上已经浪费了很多大可不必的时间，但其实这些本来可以用在对业务很关键的工作上的。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;解决方案：这个问题比较棘手。需要有一位老练的经理知道什么对这种项目亮红灯，转而采用现成的解决方案，以及什么时候开绿灯。你当然不希望打压好的开发者，但是你也不想浪费时间精力。最好是让那位开发者写一份详细的建议书说清楚实现细节，然后进行详细的审查。也就是说，这是招到经验欠缺的经理可能会遇到的陷阱之一。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;把错全都归咎到遗留系统上面</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;差点忘记，遗留系统。人人都喜欢喷原有代码，指责往往已经不在那里的开发者，因为对方无法还击。情况变得这么糟糕一定是因为那帮人太烂了，但我们比他们好。当然我们不会去修改原来的东西，我们的额外修改是必要，但我们比他们好，真的，我们保证。在别人的东西基础上增加修改要容易多了，它会让你琢磨为什么要有原来的东西。这会创造出一种抱怨没完没了的有毒环境，最终受害的将是代码质量和团队和谐。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;解决方案：尽管对原有的确质量不高的系统没完没了的抱怨可能会很有吸引力，但是请记住，正是因为原先的代码才让公司走到了现在，而那些有疑问的涉及决定也许是几次变更、商业决策以及紧急灾难共同造成的结果，这在任何快速成长的企业里面都是很常见的事情。某个东西很糟糕？做出具体计划改进它。要行动而不是抱怨，哪怕你的举措是慢慢削弱旧系统。你后面的人（可能也是你自己）会对此感激不尽的。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;"><strong>3、设计</strong></p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;如果你在绕开系统弱点上面用的代码量多过利用其优点的代码量的话，就是坏设计</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;有人有一个很棒的新设计，他们想实现这个设计，因为它比原来的那个好多了，原来的设计太糟糕。只是这么做会需要到处修补一下，但这完全是可以接受的，因为整体上新设计更好。直到后来才发现需要的修补的地方太多了，但是你已经全力以赴，没法走回头路了。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;解决方案：重新开始。沉没成本谬论是真的。你已经犯了一个错误，没关系，你可以吸取教训然后做出更好的。不要无奈地接受混乱。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;如果致力于这一代码库的大多数人都遇到了同样的问题，并且这些问题采用不同的架构时可以避免的话，就属于糟糕设计</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;你会注意到同一段代码被拷贝粘贴到系统的每一个被牵涉到的地方。你问某人为什么，他们解释说&#8220;哦，那是因为这个系统因为某个原因预计要做这个，其实这不是真的，但听起来不错，所以大家只好跟着做。&#8221;你不知道为什么他们要这么做，但你很忙，所以就把这段代码粘贴进去然后继续自己的事情了。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;解决方案：我说的话听起来会很痛苦，但是，还是重构吧。重构整个东西，把那些拷贝粘贴都去掉。付出会有回报的。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;"><strong>4、编码</strong></p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;随意编码。没有<strong>测试</strong>，或者测试糟糕。没有处理极端情况，而主要是编写基本逻辑（happy-path）代码</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;&#8220;这里是初创企业，我们没有时间做这个，晚点再处理。这是可以接受的，&#8221;这些年来很多开发者都这么说，每个人都为最后的混乱局面贡献了自己的力量。未经测试就上线代码，产品出问题晚点再修复，哪怕写测试也只是测基本逻辑，或者甚至连这个都不做。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;解决方案：管理层可以强制要求测试的覆盖面，不过其实这并不是代码库测试是否到位的好的衡量手段。有效的办法是让周密的人对这些代码进行评审，让那些代码评审只是做表面<strong>文章</strong>的走人。不幸的是，不幸的是，当你招进来的工程师缺乏经验或者不够尽责的时候就会出现这种情况，所以招人的时候要擦亮眼睛。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;"><strong>　5、会议</strong></p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;没有日程，或者日程不明确，没有可衡量的输出</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;你查看日程发现自己有个叫做&#8220;系统讨论会&#8221;要参加，但是要干什么并没有描述，只知道邀请了10个人，要进行1个小时。身为好员工的你出席了，但是绝大部分时间内都是默不作声，只有其中的2个人在那里漫谈，到会议最后的时候，组织者拍拍那两个人的后背中断了同名的谈话，并且威胁着要再举行一次会议。大家的时间被白白浪费掉了，一点收获都没有。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;解决方案：在全公司范围强制执行一项政策，要求所有会议都要有日程，有可衡量的输出，只让必须参加的人出席，而且要有备忘录，看看会议的结果是否达到预期。一旦目标达成或者时间到马上结束会议。任何违背这些原则的会议，要么允许大家走人，要么允许将来不再出席。这样就会迫使大家做出改变。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;可以邮件或者私聊解决的会议</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;你参加了一个会议，会议有可衡量的输出（耶！），但这只是一个只需简单回答是与否的问题，通过邮件或者私聊完全就可以解决。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;解决方案：是的，就用邮件或者私聊。用好你的常识，以及合适的媒介。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;该参加的人不参加不该参加的人却参加的会议</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;你参加了一个有10个人出席但是主要设计师缺席的会议。大家都举手说了点东西，但到最后，所有的东西都被负责的人拒绝了。那天晚些时候，因为某些原因你出息了一个有工程负责人参加的会议，为的是审查了一下底层代码决策的事情，可是他在不了解背景的情况下对东西吹毛求疵，浪费了大家的时间（也包括他自己的）。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;解决方案：邀请每一个人参加会议都要有个好的理由。如果你想不出好理由，那就别邀请那个人。如果某件事情的主要决策者应该参与，那就邀请他。最重要的是，不要把可来可不来的人加进来。如果某个人是可选的话，那就不要邀请。就这么简单。这是一场公司会议，不是技术研讨会。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;为了开会而开会（站立会议，你究竟想从中得到什么？）</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;你在参加每天的站立会议？大家讨论的都是你没有想法或者不在意的事情。你分享的东西可能跟他们也毫无关系。跟你有关系少数人你早就在会下交流过了，然后你报告说你们已经在私下交流过了，而且还会继续在会下跟他们讲。等一下，为什么我们还要站在这里呢？</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;解决方案：如果你绝对必须知道其他人在做什么，把它写成文字以聊天或者邮件形式进行。但你会说：&#8220;哦，但是没人会看。&#8221;对。那是因为没人在意。可是你以为大声说出来他们就会在意了吗？作为这种日常仪式的结果你现在就会做得更好了吗？未必。不要再浪费别人的时间了，把焦点放在结果上面。要消灭一切无用的会议，尤其是那些重复性的、主要是出于惯例进行的会议。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;开会太早或者太晚。注意力广度很低，愤怒情绪高涨。你不会从这些会议中收获好结果的。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;现在是下午6点，有人还在开会。你的手紧紧握住了当天的第三杯咖啡并且祈祷这次会议要么有个好结果要么很快就会结束。很可惜，一件事情都没有通过。第二天早上你意识到有人已经安排了早上8:30的会议。你握住手里当天的第一杯还没喝完一半的咖啡希望有个好结果。有人问了你一个yes/no的问题，然后会议结束了。没开玩笑吧？</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;解决方案：认真点。很多时候我们考虑事情都忽略了人的因素了。不要把会议安排得太早或者太晚，要安排在核心时间段。如果会议很重要，就需要马上进行。否则的话，没有什么事情是不可以等1天或者几个钟头的。那样的话，大家会更愿意出席，更愿意参与，你也更有可能得到想要的结果。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;"><strong>　6、流程</strong></p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;"><strong>不评估当前情况就盲目遵守流程</strong></p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;冲刺！谁不喜欢冲刺呢？我们行动敏捷。你什么意思敏捷可不是名词。我给它大写，必须这样。不管怎样，让我们大概一周左右都要冲刺一下，让大家弄清楚自己都在做什么。我怎么知道这么做有效？因为我们每周都要开始新的冲刺啊。什么？结果怎么衡量？我们创建并完成了很多工单。你还想要什么？</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;解决方案：流程是个好东西。流程指导工作，引导得到路线图（你当然要有！）上想要的结果。然而，无法衡量你是否离目标更近或者是否实现了目标的流程要么是不必要的、要么是错误的、浪费时间的，或者以上都是。永远都要评估你的流程，看看它能给你带来什么，又会让你失去什么，并且确保前者永远比后者更多。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;民主过度导致优柔寡断</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;每个人的意见都很重要。因为我们不是专制的，对吧？我们听听工程部门所有人的意见。等一下，有两个人不同意，这可不好。其中一位工程师虽然跟项目没有关系，但是他很有经验啊！我们还是搞定他再继续吧。别管期限了，我们需要把事情做对！正确才是最重要的。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;解决方案：企业不是政府，这里不应该民主。又快又好的决定可以拯救公司，决策慢的话无论好坏都会毁掉一家公司。如果你让某人负责这个项目，他们就有最后的话语权，他们会迅速做出决定。争端可以在更加私下的场合解决，不用把整个工程部门都牵扯进来。关注你的人，这样可以让结果最大化。让他们每个人都有话语权的话，你就会毫无理由地陷入僵局。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;过分微观管理，经理不去关心更大的局面，IC沮丧，糟糕的工作出现</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">经理是管人的人，他跟你在一个战壕上。在不知道是什么原因导致你做出这个决定的情况下，他问你这行代码为什么不换种写法。你用了一个小时的时间才跟他解释清楚，最后他就说了一句&#8220;哦&#8221;然后同意你了。与此同时，路线图已经延误而且跑偏了，工程师愤怒了，但是该解决这些真正的问题的时候经理却不见了。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;解决方案：要相信人。如果你无法信任他们，那就开除对方。微观管理是任何组织的丧钟，会阻止任何团队扩大。如果经理不去处理真正高层的决策，一行代码是起不到作用的，因为当房子都已经着火的时候你却在跟木匠争吵新椅子的问题。要站得高一点，用鸟瞰的视角来做出好的决策，即便底层会出现一些低效的事情，但大船仍然朝着正确的方向航行。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;"><strong>越级管理</strong></p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;&nbsp;你在做某件事情，你的老板问你情况怎样，于是你提供了一个更新。然后你的老板的老板又问，你给出同样的回答只是没说那么详细。然后他的老板问，你就说&#8220;不错。&#8221;然后一位跟你的团队毫无关系的经历又来问，你开始猜测发生了什么事。你决定写一封全公司范围的报告，说清楚进展情况，这浪费了你的时间，因为你要向那些不应该有其他考虑的经理解释清楚事情。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;解决方案：就像过去说的那样，企业不是一般社会。层级的存在不是为了压制下级，而是为了保持秩序和效率。如果3级经理定期询问非直接下属项目的进展情况，这就是微观管理或者管理层级太多的迹象。这些问题的解决方案也很明显。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">缺乏有用的检查点</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;项目结束时我们会知道。我们以工单完结数来汇报项目状态。当然，尚未完结的工单数是会随时间转移而变化，但那只是粗略的估计，对吧？直到根据安排需要2周的事情最后拖到了6个月完成。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;解决方案：增加检查点。&#8220;这些那些应该要在第二周结束时完成。&#8221;如果检查点任务未达标，必须进行重新评估， 可能还要给项目多分配资源如果其优先级比较高的话。否则的话，你的项目范围和时间就会不断膨胀，超出你的控制。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;工程师陷入困境的时候不去拉他们一把</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;每个人都知道Jacike在做住这个长期项目，而且已经做了一段时间了。你经常会想了解他的进展情况。管理层似乎并不关心他是否延误，因为嘿，你知道的，这个项目很困难。时间过去了，没人介入进去。他时不时会请求帮忙，但被告知大家都很忙。项目就这么一直搁置下去了。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;解决方案：管理层应该对项目状态有一定的了解。如果某件事情明显拖得太久了的话，那么到了一定时候，管理层介入找出缺失了什么信息，或者是否需要加人等是完全适合的。这不是微观管理，这是管理的核心部分，但害怕微观管理的经理往往赋予的自由度太高了，根本就没有起到管理的责任。是，当然这种权衡是有点像走钢丝线，但这是好的管理的标志。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;&nbsp;注：从下面内容开始我就只列表了，因为实在抽不出时间展开讲了，但希望列出的东西能够不言自明。如果确实很重要并且时间允许的话，我会展开说一下。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;"><strong>　7、沟通</strong></p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;&nbsp;过度沟通。出于所谓的透明性，事无巨细都邮件给一大群人。收件箱堆满了信，大家就会有意识地过滤掉，导致对此漠不关心。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;&nbsp;沟通不足。你要进行大改很可能会有影响到其他团队，但是却没有通知对方。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;"><strong>　8、评估</strong></p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;经理没有让直接下属来评估</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;对如何改进的描述很含糊，经常说那个人从来都没有超过期待这样的话来打压别人工资，但是又从来没有明确这是什么意思</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;奖励所谓的&#8220;灭火队员&#8221;，也就是那些对糟糕的代码部署做出迅速响应的人，而不是那些设计和编码都很仔细，设法避免问题出现的人</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;没有清晰的发展路径</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;"><strong>　9、宣传</strong></p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;&#8220;公司是个大家庭。&#8221;不，不是，如果是的话，很多公司都像虐待孩子的父母，只有孩子不断付出，而父母却一直都只有期望和惩罚。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;&#8220;利用社交媒体来传播公司的文章。&#8221;这往好里说顶多算是不够诚实。希望利用大家的个人关系来推销公司就是不拿工作和个人<strong>生活</strong>当两回事了。这是手伸过头的表现。如果员工喜欢公司所为的话，他们自己会传播的。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;"><strong>　10、面试</strong></p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;流程与目标不一致：面试的目标是要找到那份工作跟公司和团队都很搭的合适人选。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;工程师负担过重，经常要进行面试，跟工作一样频繁。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;强调雇佣更多的人，而没有把焦点放在留住现有人才上（如果你的工程师感觉没有被公司好好对待的话，他们又会如何介绍你的公司给别人呢？）。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;"><strong>11、酒精</strong></p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;常规活动也提供酒精饮料。喝酒带来的纯粹是压力，不好的健康习惯，不良的工作环境。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;宣扬喝酒文化，把它正常化</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;"><strong>　12、歧视</strong></p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;种族主义、性别歧视、LGBT歧视、年龄歧视。虽然这方面的培训很多，但是出现了一些微妙的歧视形式。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;多元化水平很低</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;"><strong>13、员工福祉</strong></p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;工作过度、紧张过度或者忽视劳累的明显迹象，美其名曰&#8220;勤奋的员工&#8221;。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">&nbsp;&nbsp;忽略了员工也是人。无视人际关系问题、健康问题等。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: Helvetica, Arial, sans-serif; font-size: 14px;">转载：http://www.51testing.com/html/62/n-3725162.html</p><div style="word-wrap: break-word; font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 15px;">&#8203;</div><img src ="http://www.cnitblog.com/shbwf/aggbug/90901.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/shbwf/" target="_blank">51testing</a> 2018-03-16 11:01 <a href="http://www.cnitblog.com/shbwf/articles/90901.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>个人总结—web测试留意的小细节</title><link>http://www.cnitblog.com/shbwf/articles/90900.html</link><dc:creator>51testing</dc:creator><author>51testing</author><pubDate>Thu, 15 Mar 2018 02:55:00 GMT</pubDate><guid>http://www.cnitblog.com/shbwf/articles/90900.html</guid><wfw:comment>http://www.cnitblog.com/shbwf/comments/90900.html</wfw:comment><comments>http://www.cnitblog.com/shbwf/articles/90900.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shbwf/comments/commentRss/90900.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shbwf/services/trackbacks/90900.html</trackback:ping><description><![CDATA[<p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 15px;">转载：http://www.51testing.com/html/46/n-3725146.html</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 15px;"><img src="https://www.testwo.com/attachments/13977/1521081990688.jpg" data-ke-src="/attachments/13977/1521081990688.jpg" alt="" style="border: 0px;" />&#8203;</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 15px;">网页测试留意的细节</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 15px;">1、每次测试之前都需要代码更新、清理缓存。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 15px;">2、各模块的信息归类是否正确。比如进入一级栏目或二级栏目的列表页，查看左侧栏目名称，右侧文章标题及内容是否正确。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 15px;">3、Logo图片是否正确显示，比如大小、位置和图片的相关说明等。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 15px;">4、所有文章标题、图片、导航等链接跳转是否正确。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 15px;">5、查询： 1）精确查询还是模糊查询；</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 15px;">2）输入存在的信息，正确搜索出结果；</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 15px;">3）输入特殊字符，搜索不出结果或者给出相应提醒信息；</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 15px;">4）输入空格，搜索不出结果或者给出相应提醒信息；</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 15px;">5）不输入任何内容，搜索出全部信息或者给出相应提醒信息。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 15px;">6、分页： 1）分页的总页数及当前页数显示是否正确；</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 15px;">2）是否正确跳转到指定的页数；</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 15px;">3）翻页后，列表中的数据是否按照指定的顺序进行排序。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 15px;">7、导入：导入条件不符合时，能否给出提示； 导入信息符合时，是否成功导入。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 15px;">8、导出：导出信息是否正确（全部导出和筛选过后的导出）。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 15px;">9、输入框： 1）必填项的判断是否准确；</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 15px;">2）数据边界值、超边界值的处理；</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 15px;">3）对于特殊字符的处理是否正确，特别要注意单引号和&amp;符号；</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 15px;">4）字符长度是否有限制；</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 15px;">5）输入超长字段，输入框是否被撑开。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 15px;">10、下拉框的数据是否显示正确，比如添加了一条信息，下拉框中的数据是否也增加。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 15px;">11、前后台交互的部分，数据传输是否正确。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 15px;">12、提示、警告或错误提示信息是否清楚易懂，用词准确。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 15px;">13、页面中错别字和乱码的检查。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 15px;">14、切换窗口大小，将窗口缩小后，页面是否按比例缩小或其他合理处理方式，文字或图片是否窜行。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 15px;">15、系统是否支持Enter键、Tab键等。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 15px;">16、浏览器的前进、后退、刷新按钮，系统是否正确处理。</p><p style="word-wrap: break-word; margin-top: 5px; margin-bottom: 5px; font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 15px;">17、主流浏览器是否兼容。</p><img src ="http://www.cnitblog.com/shbwf/aggbug/90900.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/shbwf/" target="_blank">51testing</a> 2018-03-15 10:55 <a href="http://www.cnitblog.com/shbwf/articles/90900.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 如何利用区块链技术解决方案改善行业与业务流程</title><link>http://www.cnitblog.com/shbwf/articles/90899.html</link><dc:creator>51testing</dc:creator><author>51testing</author><pubDate>Wed, 14 Mar 2018 03:59:00 GMT</pubDate><guid>http://www.cnitblog.com/shbwf/articles/90899.html</guid><wfw:comment>http://www.cnitblog.com/shbwf/comments/90899.html</wfw:comment><comments>http://www.cnitblog.com/shbwf/articles/90899.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shbwf/comments/commentRss/90899.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shbwf/services/trackbacks/90899.html</trackback:ping><description><![CDATA[<div><span style="font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 16px;">&#8203;</span><span style="font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 16px;">&#8203;</span><span style="font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 16px;">&#8203;</span><span style="font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 16px;">&#8203;</span><span style="font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 16px;">&#8203;</span><span style="font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 16px;">&#8203;</span><span style="font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 16px;">&#8203;</span><span style="font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 16px;">&#8203;</span><span style="font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 16px;">&#8203;&#8203;</span><span style="word-wrap: break-word; font-size: 16px; color: #333333; font-family: -apple-system, &quot;white-space:normal;background-color:#FFFFFF;&quot;;">当您听到区块链这个词时，会想到什么？比特币还是以太坊？ 我们常将区块链技术与加密货币相关联。这种令人赞叹的分布式技术将无处不在。</span><p style="word-wrap: break-word; margin-bottom: 25px; padding-top: 0px; padding-bottom: 0px; font-size: 16px; box-sizing: border-box; word-break: break-word; color: #333333; font-family: -apple-system, &quot;white-space:normal;background-color:#FFFFFF;&quot;;">20年前，互联网就把每个人带到了电脑前。最开始，媒体和其他企业开始排斥互联网和相关概念，称无关紧要或者是虚拟泡沫。故事到后来发生了变化，互联网涌现了数百万个企业，并不断有创新的故事涌现。</p><p style="word-wrap: break-word; margin-bottom: 25px; padding-top: 0px; padding-bottom: 0px; font-size: 16px; box-sizing: border-box; word-break: break-word; color: #333333; font-family: -apple-system, &quot;white-space:normal;background-color:#FFFFFF;&quot;;">什么是区块链技术</p><div style="word-wrap: break-word; box-sizing: border-box; margin: 0px -40px 20px; width: calc(100% + 80px); text-align: center; font-size: 0px; color: #333333; font-family: -apple-system, &quot;white-space:normal;background-color:#FFFFFF;&quot;;"><img src="http://upload-images.jianshu.io/upload_images/10256972-cea9e85ace145359..jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" data-ke-src="http://upload-images.jianshu.io/upload_images/10256972-cea9e85ace145359..jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" width="auto" height="auto" style="word-wrap: break-word; border: 0px; box-sizing: border-box; vertical-align: middle; max-width: 100%; width: auto; height: auto; min-height: 200px; min-width: 200px;"  alt="" /><br style="word-wrap: break-word; box-sizing: border-box;" /><div style="word-wrap: break-word; box-sizing: border-box; min-width: 20%; max-width: 80%; min-height: 43px; display: inline-block; padding: 10px; margin: 0px auto; border-bottom-color: #d9d9d9; font-size: 13px; color: #999999; line-height: 1.7;"></div></div><p style="word-wrap: break-word; margin-bottom: 25px; padding-top: 0px; padding-bottom: 0px; font-size: 16px; box-sizing: border-box; word-break: break-word; color: #333333; font-family: -apple-system, &quot;white-space:normal;background-color:#FFFFFF;&quot;;">这是当前高热门的话题。但对于大多数人来说，这仍然是一个似懂非懂的概念。</p><p style="word-wrap: break-word; margin-bottom: 25px; padding-top: 0px; padding-bottom: 0px; font-size: 16px; box-sizing: border-box; word-break: break-word; color: #333333; font-family: -apple-system, &quot;white-space:normal;background-color:#FFFFFF;&quot;;">简言之，区块链是一个具有分布式数据库的分类账本，这些数据库在互联网上自动更新。网络用户可以看到这些数据库。</p><p style="word-wrap: break-word; margin-bottom: 25px; padding-top: 0px; padding-bottom: 0px; font-size: 16px; box-sizing: border-box; word-break: break-word; color: #333333; font-family: -apple-system, &quot;white-space:normal;background-color:#FFFFFF;&quot;;">因此，区块链网络可以是私有也可以是公共的。</p><p style="word-wrap: break-word; margin-bottom: 25px; padding-top: 0px; padding-bottom: 0px; font-size: 16px; box-sizing: border-box; word-break: break-word; color: #333333; font-family: -apple-system, &quot;white-space:normal;background-color:#FFFFFF;&quot;;">私有区块链网络的工作方式类似于内部网，成员权限受到限制，而公共网络可供所有人访问。但是我们可以大可放心，无论使用的网络是什么，安全性都是有保证的。易受攻击的中间人机制会被淘汰。</p><p style="word-wrap: break-word; margin-bottom: 25px; padding-top: 0px; padding-bottom: 0px; font-size: 16px; box-sizing: border-box; word-break: break-word; color: #333333; font-family: -apple-system, &quot;white-space:normal;background-color:#FFFFFF;&quot;;">由于信息没有集中存储，所以不可能从一个源头进行破坏或窃取重要数据。在黑客对一个区块进行任意形式的攻击后，犯罪分子需要同时侵入该区块链网络中的每一个分类账（近数百万条信息），这是根本不可能的。</p><p style="word-wrap: break-word; margin-bottom: 25px; padding-top: 0px; padding-bottom: 0px; font-size: 16px; box-sizing: border-box; word-break: break-word; color: #333333; font-family: -apple-system, &quot;white-space:normal;background-color:#FFFFFF;&quot;;">区块链技术的核心特征</p><p style="word-wrap: break-word; margin-bottom: 25px; padding-top: 0px; padding-bottom: 0px; font-size: 16px; box-sizing: border-box; word-break: break-word; color: #333333; font-family: -apple-system, &quot;white-space:normal;background-color:#FFFFFF;&quot;;">分布式系统</p><div style="word-wrap: break-word; box-sizing: border-box; margin: 0px -40px 20px; width: calc(100% + 80px); text-align: center; font-size: 0px; color: #333333; font-family: -apple-system, &quot;white-space:normal;background-color:#FFFFFF;&quot;;"><img src="http://upload-images.jianshu.io/upload_images/10256972-9d8e7db692c0bd0e..jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" data-ke-src="http://upload-images.jianshu.io/upload_images/10256972-9d8e7db692c0bd0e..jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" width="auto" height="auto" style="word-wrap: break-word; border: 0px; box-sizing: border-box; vertical-align: middle; max-width: 100%; width: auto; height: auto; min-height: 200px; min-width: 200px;"  alt="" /><br style="word-wrap: break-word; box-sizing: border-box;" /><div style="word-wrap: break-word; box-sizing: border-box; min-width: 20%; max-width: 80%; min-height: 43px; display: inline-block; padding: 10px; margin: 0px auto; border-bottom-color: #d9d9d9; font-size: 13px; color: #999999; line-height: 1.7;"></div></div><p style="word-wrap: break-word; margin-bottom: 25px; padding-top: 0px; padding-bottom: 0px; font-size: 16px; box-sizing: border-box; word-break: break-word; color: #333333; font-family: -apple-system, &quot;white-space:normal;background-color:#FFFFFF;&quot;;">用通俗的话来讲，区块链不只存储在一台电脑上，通过分布式表征分散特征。随着交易完成，这些分布式节点不断更新，为您提供安全性和匿名隐私。</p><p style="word-wrap: break-word; margin-bottom: 25px; padding-top: 0px; padding-bottom: 0px; font-size: 16px; box-sizing: border-box; word-break: break-word; color: #333333; font-family: -apple-system, &quot;white-space:normal;background-color:#FFFFFF;&quot;;">数据认证</p><p style="word-wrap: break-word; margin-bottom: 25px; padding-top: 0px; padding-bottom: 0px; font-size: 16px; box-sizing: border-box; word-break: break-word; color: #333333; font-family: -apple-system, &quot;white-space:normal;background-color:#FFFFFF;&quot;;">数据可以以各种格式存储在区块链中，其优点是整个区块链都有相同的安全措施。在数据被访问之前，技术确保每个用户都被彻底审查，以防止欺诈。认证方法是创建提供签名的公私密钥对。</p><p style="word-wrap: break-word; margin-bottom: 25px; padding-top: 0px; padding-bottom: 0px; font-size: 16px; box-sizing: border-box; word-break: break-word; color: #333333; font-family: -apple-system, &quot;white-space:normal;background-color:#FFFFFF;&quot;;">利用区块链技术赋能&amp;提升行业</p><p style="word-wrap: break-word; margin-bottom: 25px; padding-top: 0px; padding-bottom: 0px; font-size: 16px; box-sizing: border-box; word-break: break-word; color: #333333; font-family: -apple-system, &quot;white-space:normal;background-color:#FFFFFF;&quot;;">众筹</p><div style="word-wrap: break-word; box-sizing: border-box; margin: 0px -40px 20px; width: calc(100% + 80px); text-align: center; font-size: 0px; color: #333333; font-family: -apple-system, &quot;white-space:normal;background-color:#FFFFFF;&quot;;"><img src="http://upload-images.jianshu.io/upload_images/10256972-e0ff749f8ac5a296..jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" data-ke-src="http://upload-images.jianshu.io/upload_images/10256972-e0ff749f8ac5a296..jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" width="auto" height="auto" style="word-wrap: break-word; border: 0px; box-sizing: border-box; vertical-align: middle; max-width: 100%; width: auto; height: auto; min-height: 200px; min-width: 200px;"  alt="" /><br style="word-wrap: break-word; box-sizing: border-box;" /><div style="word-wrap: break-word; box-sizing: border-box; min-width: 20%; max-width: 80%; min-height: 43px; display: inline-block; padding: 10px; margin: 0px auto; border-bottom-color: #d9d9d9; font-size: 13px; color: #999999; line-height: 1.7;"></div></div><p style="word-wrap: break-word; margin-bottom: 25px; padding-top: 0px; padding-bottom: 0px; font-size: 16px; box-sizing: border-box; word-break: break-word; color: #333333; font-family: -apple-system, &quot;white-space:normal;background-color:#FFFFFF;&quot;;">对于初创企业来讲，资金短缺问题普遍存在，创始人必须解决从适合的渠道筹集资金的问题。及时完成这项任务也是一件艰巨的任务，但区块链技术的出现可谓是应对这些挑战的灵丹妙药。</p><p style="word-wrap: break-word; margin-bottom: 25px; padding-top: 0px; padding-bottom: 0px; font-size: 16px; box-sizing: border-box; word-break: break-word; color: #333333; font-family: -apple-system, &quot;white-space:normal;background-color:#FFFFFF;&quot;;">通过采用分布式筹集资金的制度，解决了与风险投资商长期会面、金融机构错综复杂的问题，还有其它造成时间延误的因素。</p><p style="word-wrap: break-word; margin-bottom: 25px; padding-top: 0px; padding-bottom: 0px; font-size: 16px; box-sizing: border-box; word-break: break-word; color: #333333; font-family: -apple-system, &quot;white-space:normal;background-color:#FFFFFF;&quot;;">有了这项技术，企业就可以加速增长，可以获得所需的资金，有助于企业快速执行和提供更优秀的解决方案。隐私保护的严格遵守确保安全交易过程无缝完成。</p><p style="word-wrap: break-word; margin-bottom: 25px; padding-top: 0px; padding-bottom: 0px; font-size: 16px; box-sizing: border-box; word-break: break-word; color: #333333; font-family: -apple-system, &quot;white-space:normal;background-color:#FFFFFF;&quot;;">智能合约</p><div style="word-wrap: break-word; box-sizing: border-box; margin: 0px -40px 20px; width: calc(100% + 80px); text-align: center; font-size: 0px; color: #333333; font-family: -apple-system, &quot;white-space:normal;background-color:#FFFFFF;&quot;;"><img src="http://upload-images.jianshu.io/upload_images/10256972-21e0fcd875d19b42..jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" data-ke-src="http://upload-images.jianshu.io/upload_images/10256972-21e0fcd875d19b42..jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" width="auto" height="auto" style="word-wrap: break-word; border: 0px; box-sizing: border-box; vertical-align: middle; max-width: 100%; width: auto; height: auto; min-height: 200px; min-width: 200px;"  alt="" /><br style="word-wrap: break-word; box-sizing: border-box;" /><div style="word-wrap: break-word; box-sizing: border-box; min-width: 20%; max-width: 80%; min-height: 43px; display: inline-block; padding: 10px; margin: 0px auto; border-bottom-color: #d9d9d9; font-size: 13px; color: #999999; line-height: 1.7;"></div></div><p style="word-wrap: break-word; margin-bottom: 25px; padding-top: 0px; padding-bottom: 0px; font-size: 16px; box-sizing: border-box; word-break: break-word; color: #333333; font-family: -apple-system, &quot;white-space:normal;background-color:#FFFFFF;&quot;;">智能合约是如何工作的</p><p style="word-wrap: break-word; margin-bottom: 25px; padding-top: 0px; padding-bottom: 0px; font-size: 16px; box-sizing: border-box; word-break: break-word; color: #333333; font-family: -apple-system, &quot;white-space:normal;background-color:#FFFFFF;&quot;;">电子合同已经存在了一段时间，区块链技术的出现扩展了其应用范围。这些自动执行的程序避免了传统业务交易的固有问题。</p><p style="word-wrap: break-word; margin-bottom: 25px; padding-top: 0px; padding-bottom: 0px; font-size: 16px; box-sizing: border-box; word-break: break-word; color: #333333; font-family: -apple-system, &quot;white-space:normal;background-color:#FFFFFF;&quot;;">采用区块链技术可以保证系统不会停机，同时检查欺诈和其它数据损坏手段等措施。您的合同会被安全存储，并且可根据事件发送给相关收件人。</p><p style="word-wrap: break-word; margin-bottom: 25px; padding-top: 0px; padding-bottom: 0px; font-size: 16px; box-sizing: border-box; word-break: break-word; color: #333333; font-family: -apple-system, &quot;white-space:normal;background-color:#FFFFFF;&quot;;">还有一个好处是，区块链技术可以保证交易成本降低，因为我们已经成功绕过传统金融交易相关固有的冗长流程。</p><p style="word-wrap: break-word; margin-bottom: 25px; padding-top: 0px; padding-bottom: 0px; font-size: 16px; box-sizing: border-box; word-break: break-word; color: #333333; font-family: -apple-system, &quot;white-space:normal;background-color:#FFFFFF;&quot;;">供应链管理</p><div style="word-wrap: break-word; box-sizing: border-box; margin: 0px -40px 20px; width: calc(100% + 80px); text-align: center; font-size: 0px; color: #333333; font-family: -apple-system, &quot;white-space:normal;background-color:#FFFFFF;&quot;;"><img src="http://upload-images.jianshu.io/upload_images/10256972-b9c76b225701dce9..jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" data-ke-src="http://upload-images.jianshu.io/upload_images/10256972-b9c76b225701dce9..jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" width="auto" height="auto" style="word-wrap: break-word; border: 0px; box-sizing: border-box; vertical-align: middle; max-width: 100%; width: auto; height: auto; min-height: 200px; min-width: 200px;"  alt="" /><br style="word-wrap: break-word; box-sizing: border-box;" /><div style="word-wrap: break-word; box-sizing: border-box; min-width: 20%; max-width: 80%; min-height: 43px; display: inline-block; padding: 10px; margin: 0px auto; border-bottom-color: #d9d9d9; font-size: 13px; color: #999999; line-height: 1.7;"></div></div><p style="word-wrap: break-word; margin-bottom: 25px; padding-top: 0px; padding-bottom: 0px; font-size: 16px; box-sizing: border-box; word-break: break-word; color: #333333; font-family: -apple-system, &quot;white-space:normal;background-color:#FFFFFF;&quot;;">我们消费的每一件SKU商品都是多种力量共同完成的产物，无论是活着的还是无生命的，这个过程都涉及多方采购和供应链服务商提供。与此相关的问题是，人为因素往往导致过程拖延且较难于进行处理。</p><p style="word-wrap: break-word; margin-bottom: 25px; padding-top: 0px; padding-bottom: 0px; font-size: 16px; box-sizing: border-box; word-break: break-word; color: #333333; font-family: -apple-system, &quot;white-space:normal;background-color:#FFFFFF;&quot;;">区块链技术可以帮助您的企业采取主动的方式。我们可以轻松提供不可变的数字记录，并且不会被伪造，从而减少人为干预，错误或贿赂的发生亦会减少。</p><p style="word-wrap: break-word; margin-bottom: 25px; padding-top: 0px; padding-bottom: 0px; font-size: 16px; box-sizing: border-box; word-break: break-word; color: #333333; font-family: -apple-system, &quot;white-space:normal;background-color:#FFFFFF;&quot;;">分布式云存储</p><p style="word-wrap: break-word; margin-bottom: 25px; padding-top: 0px; padding-bottom: 0px; font-size: 16px; box-sizing: border-box; word-break: break-word; color: #333333; font-family: -apple-system, &quot;white-space:normal;background-color:#FFFFFF;&quot;;">目前企业和个人每年都会消费数十亿美元以上购买存储空间。这种系统的主要缺点是，数据集中存储在一个数据中心，服务器非常容易受到攻击。如果发生这种情况，黑客可以获得有价值的数据，用这些信息欺骗你或你的客户。</p><p style="word-wrap: break-word; margin-bottom: 25px; padding-top: 0px; padding-bottom: 0px; font-size: 16px; box-sizing: border-box; word-break: break-word; color: #333333; font-family: -apple-system, &quot;white-space:normal;background-color:#FFFFFF;&quot;;">而且，集中存储的高成本令人吃惊。当我们应用区块链技术时，通过利用您用户的额外空间，您管理的存储空间额度将扩展到30,000%以上。</p><p style="word-wrap: break-word; margin-bottom: 25px; padding-top: 0px; padding-bottom: 0px; font-size: 16px; box-sizing: border-box; word-break: break-word; color: #333333; font-family: -apple-system, &quot;white-space:normal;background-color:#FFFFFF;&quot;;">区块链存储的数据是加密的，只有拥有密钥的人才能访问。区块链解决方案不仅更便宜，也更安全。</p><p style="word-wrap: break-word; margin-bottom: 25px; padding-top: 0px; padding-bottom: 0px; font-size: 16px; box-sizing: border-box; word-break: break-word; color: #333333; font-family: -apple-system, &quot;white-space:normal;background-color:#FFFFFF;&quot;;">下图是比较几个基于区块链的P2P云存储和内容交付平台的对照：</p><div style="word-wrap: break-word; box-sizing: border-box; margin: 0px -40px 20px; width: calc(100% + 80px); text-align: center; font-size: 0px; color: #333333; font-family: -apple-system, &quot;white-space:normal;background-color:#FFFFFF;&quot;;"><img src="http://upload-images.jianshu.io/upload_images/10256972-9270f233aeb637a7..jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" data-ke-src="http://upload-images.jianshu.io/upload_images/10256972-9270f233aeb637a7..jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" width="auto" height="auto" style="word-wrap: break-word; border: 0px; box-sizing: border-box; vertical-align: middle; max-width: 100%; width: auto; height: auto; min-height: 200px; min-width: 200px;"  alt="" /><br style="word-wrap: break-word; box-sizing: border-box;" /><div style="word-wrap: break-word; box-sizing: border-box; min-width: 20%; max-width: 80%; min-height: 43px; display: inline-block; padding: 10px; margin: 0px auto; border-bottom-color: #d9d9d9; font-size: 13px; color: #999999; line-height: 1.7;"></div></div><p style="word-wrap: break-word; margin-bottom: 25px; padding-top: 0px; padding-bottom: 0px; font-size: 16px; box-sizing: border-box; word-break: break-word; color: #333333; font-family: -apple-system, &quot;white-space:normal;background-color:#FFFFFF;&quot;;">快速安全付款</p><div style="word-wrap: break-word; box-sizing: border-box; margin: 0px -40px 20px; width: calc(100% + 80px); text-align: center; font-size: 0px; color: #333333; font-family: -apple-system, &quot;white-space:normal;background-color:#FFFFFF;&quot;;"><img src="http://upload-images.jianshu.io/upload_images/10256972-9c5a210beabef116..jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" data-ke-src="http://upload-images.jianshu.io/upload_images/10256972-9c5a210beabef116..jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" width="auto" height="auto" style="word-wrap: break-word; border: 0px; box-sizing: border-box; vertical-align: middle; max-width: 100%; width: auto; height: auto; min-height: 200px; min-width: 200px;"  alt="" /><br style="word-wrap: break-word; box-sizing: border-box;" /><div style="word-wrap: break-word; box-sizing: border-box; min-width: 20%; max-width: 80%; min-height: 43px; display: inline-block; padding: 10px; margin: 0px auto; border-bottom-color: #d9d9d9; font-size: 13px; color: #999999; line-height: 1.7;"></div></div><p style="word-wrap: break-word; margin-bottom: 25px; padding-top: 0px; padding-bottom: 0px; font-size: 16px; box-sizing: border-box; word-break: break-word; color: #333333; font-family: -apple-system, &quot;white-space:normal;background-color:#FFFFFF;&quot;;">如果您的企业是全球型企业，每天做国际贸易，那么您就非常熟悉收发资金的压力了。有时，这些订单交易需要几天才会生效到账，这对许多企业来说也是一种负担。</p><p style="word-wrap: break-word; margin-bottom: 25px; padding-top: 0px; padding-bottom: 0px; font-size: 16px; box-sizing: border-box; word-break: break-word; color: #333333; font-family: -apple-system, &quot;white-space:normal;background-color:#FFFFFF;&quot;;">连接智能设备</p><div style="word-wrap: break-word; box-sizing: border-box; margin: 0px -40px 20px; width: calc(100% + 80px); text-align: center; font-size: 0px; color: #333333; font-family: -apple-system, &quot;white-space:normal;background-color:#FFFFFF;&quot;;"><img src="http://upload-images.jianshu.io/upload_images/10256972-b189d045a15dc45a..jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" data-ke-src="http://upload-images.jianshu.io/upload_images/10256972-b189d045a15dc45a..jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" width="auto" height="auto" style="word-wrap: break-word; border: 0px; box-sizing: border-box; vertical-align: middle; max-width: 100%; width: auto; height: auto; min-height: 200px; min-width: 200px;"  alt="" /><br style="word-wrap: break-word; box-sizing: border-box;" /><div style="word-wrap: break-word; box-sizing: border-box; min-width: 20%; max-width: 80%; min-height: 43px; display: inline-block; padding: 10px; margin: 0px auto; border-bottom-color: #d9d9d9; font-size: 13px; color: #999999; line-height: 1.7;"></div></div><p style="word-wrap: break-word; margin-bottom: 25px; padding-top: 0px; padding-bottom: 0px; font-size: 16px; box-sizing: border-box; word-break: break-word; color: #333333; font-family: -apple-system, &quot;white-space:normal;background-color:#FFFFFF;&quot;;">一些公司已经实现自动连接设备、小型配件等想法，实现数据和信息的安全共享。区块链技术为该系统奠定了基础，充当许多设备的公共账本。</p><p style="word-wrap: break-word; margin-bottom: 25px; padding-top: 0px; padding-bottom: 0px; font-size: 16px; box-sizing: border-box; word-break: break-word; color: #333333; font-family: -apple-system, &quot;white-space:normal;background-color:#FFFFFF;&quot;;">通过这种区块链技术，我们创建了一个自治的网络，它负责设备到设备的通信，设备管理与更新，自主决策等。设备可以自主日常维护，不会导致用户停机。</p><p style="word-wrap: break-word; margin-bottom: 25px; padding-top: 0px; padding-bottom: 0px; font-size: 16px; box-sizing: border-box; word-break: break-word; color: #333333; font-family: -apple-system, &quot;white-space:normal;background-color:#FFFFFF;&quot;;">转移到设备自处理，这项技术也更加节省成本。整个办公室由于互联互通，管理得当，节省大量的时间和成本。</p><p style="word-wrap: break-word; margin-bottom: 25px; padding-top: 0px; padding-bottom: 0px; font-size: 16px; box-sizing: border-box; word-break: break-word; color: #333333; font-family: -apple-system, &quot;white-space:normal;background-color:#FFFFFF;&quot;;">应用程序进化无止境。互联网以类似的方式改变了每一个行业，区块链技术更是如此。许许多多的公司正在利用区块链技术，取得了惊人的收益。</p><p style="word-wrap: break-word; margin-bottom: 25px; padding-top: 0px; padding-bottom: 0px; font-size: 16px; box-sizing: border-box; word-break: break-word; color: #333333; font-family: -apple-system, &quot;white-space:normal;background-color:#FFFFFF;&quot;;">&#8220;攻城狮们&#8221;，还不来一试：）</p><p style="word-wrap: break-word; margin-bottom: 25px; padding-top: 0px; padding-bottom: 0px; font-size: 16px; box-sizing: border-box; word-break: break-word; color: #333333; font-family: -apple-system, &quot;white-space:normal;background-color:#FFFFFF;&quot;;">&#8203;</p></div><img src ="http://www.cnitblog.com/shbwf/aggbug/90899.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/shbwf/" target="_blank">51testing</a> 2018-03-14 11:59 <a href="http://www.cnitblog.com/shbwf/articles/90899.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>抵御百万级在线用户强压，服务器性能测试就该这么做！</title><link>http://www.cnitblog.com/shbwf/articles/90895.html</link><dc:creator>51testing</dc:creator><author>51testing</author><pubDate>Fri, 09 Mar 2018 03:20:00 GMT</pubDate><guid>http://www.cnitblog.com/shbwf/articles/90895.html</guid><wfw:comment>http://www.cnitblog.com/shbwf/comments/90895.html</wfw:comment><comments>http://www.cnitblog.com/shbwf/articles/90895.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shbwf/comments/commentRss/90895.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shbwf/services/trackbacks/90895.html</trackback:ping><description><![CDATA[<h2><strong style="word-wrap: break-word; font-size: 16px; margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">导读</strong></h2><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">大量用户登录游戏产生的&#8220;洪荒之力&#8221;往往会对游戏服务器产生巨大的压力，游戏上线之前对服务器的承载能力做测试是必须要做的事。本文从腾讯游戏服务器性能测试的经历出发，对服务器性能测试的原理、指标和方法进行了介绍，并介绍了内部目前流行的一些工具和使用技巧。</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">在四年磨一剑的奥运会，要想成功，必须顶住压力，在0.13秒错失400米自由泳金牌之后，孙杨在200米自由泳比赛中后来居上，夺回冠军；傅园慧靠着自己的&#8220;洪荒之力&#8221;，反复刷新自己的最好成绩。</p><img alt="null" src="http://d.ifengimg.com/q100/img1.ugc.ifeng.com/newugc/20180309/10/wemedia/f2192c6ef70c98ec8a6a507ccc77e202af591088_size38_w461_h346.jpg" data-ke-src="http://d.ifengimg.com/q100/img1.ugc.ifeng.com/newugc/20180309/10/wemedia/f2192c6ef70c98ec8a6a507ccc77e202af591088_size38_w461_h346.jpg" style="word-wrap: break-word; border: none; margin: 0px auto; padding: 0px; list-style: none; box-sizing: border-box; vertical-align: middle; display: block; max-width: 50%; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;" /><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><br style="word-wrap: break-word;" /></p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">那么，同样也是多年磨一剑，游戏开发者精心制作的游戏在面对大量用户的&#8220;洪荒之力&#8221;时，服务器应该怎样顶住压力，高效运转？</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">先来看看用户的洪荒之力能产生什么样的后果？</p><h2><strong style="word-wrap: break-word; margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;"> 1、面对开服压力，服务器宕机</strong></h2><img alt="null" src="http://d.ifengimg.com/q100/img1.ugc.ifeng.com/newugc/20180309/10/wemedia/7805e325ff5f2a7079f3acd2c03a73aa249997a5_size25_w552_h357.jpg" data-ke-src="http://d.ifengimg.com/q100/img1.ugc.ifeng.com/newugc/20180309/10/wemedia/7805e325ff5f2a7079f3acd2c03a73aa249997a5_size25_w552_h357.jpg" style="word-wrap: break-word; border: none; margin: 0px auto; padding: 0px; list-style: none; box-sizing: border-box; vertical-align: middle; display: block; max-width: 50%; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;" /><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><br style="word-wrap: break-word;" /></p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">版本上线之后，新的服务器开放或者服务器更新，面对大量玩家的涌入，如果服务器的性能不好，就会发生登录失败的问题。</p><h2><strong style="word-wrap: break-word; margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">2、运营期压力，玩家体验损失</strong></h2><img alt="null" src="http://d.ifengimg.com/q100/img1.ugc.ifeng.com/newugc/20180309/10/wemedia/3e31065df65486ae7c2bfd6aba398cacf8af792f_size90_w600_h435.jpg" data-ke-src="http://d.ifengimg.com/q100/img1.ugc.ifeng.com/newugc/20180309/10/wemedia/3e31065df65486ae7c2bfd6aba398cacf8af792f_size90_w600_h435.jpg" style="word-wrap: break-word; border: none; margin: 0px auto; padding: 0px; list-style: none; box-sizing: border-box; vertical-align: middle; display: block; max-width: 50%; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;" /><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><br style="word-wrap: break-word;" /></p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">服务器的一个外网活动，比如副本双倍掉落，可能就会造成玩家在某个场景堆积，此时副本玩家就会比平时高很多，对于服务器而言副本这个业务请求会产生比平常高很多的压力，就极容易引发相关的性能问题。</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">据数据公司预测，获得苹果推荐的价值相当于200万美元左右的推广费用。法国工作室Ankama Games研发的游戏Tactile Wars拿到了苹果50多个国家(几乎是所有上线的地区)的首页&#8220;最佳新游戏&#8221;推荐，而且曾一度达到了美国iPhone免费榜第二名，日均下载量突破25万，而一个月后该游戏在美国的下载排名已经降到了475，并且有持续下滑的趋势。归根结底是因为开发商没有应对大量玩家涌入服务器的准备，服务器卡死、宕机，闪退让玩家失望选择离开。在这之后Ankama花了两个月的时候才优化服务器逐步挽回了局面。</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">我们团队也曾经接入过一款代理游戏，有百万级的在线人数预估，当时进行了服务器性能测试，测试结果是当时对方的服务器只能承受1500人的同时在线，如果一套服务器只能承载1500个用户，该游戏要上线需要多少服务器？需要1000套，这无疑是一个巨大的浪费。</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">面对用户的&#8220;洪荒之力&#8221;，惨痛的经历一次次的发生，外网问题无小事，游戏发行、渠道对服务器承压情况越来越重视，很多都会要求CP提供服务器性能测试报告作为凭据。</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">然而目前市场上还没有针对游戏的服务器性能检测工具，无论是开源还是商业软件都不能很好的满足游戏的专项测试需求，与此同时受限于开发周期短以及人力的问题，中小型CP往往采取编写模拟机器人进行简单的压测，测试的覆盖面窄，无法保证并发请求，造成潜伏的问题遗漏到线上。</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">同样是百万级的游戏，有的公司需要上千台服务器，而有的公司只要几百台服务器，巨大的服务器采购运维成本差异皆因各家公司做服务器性能测试乃至性能调优的能力参差不齐。</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">那么问题就来了，服务器性能测试是什么？要怎么做才最有效呢？</p><h2><strong style="word-wrap: break-word; margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;"> 什么是服务器性能测试？</strong></h2><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">提到服务器性能测试，不得不提到很多术语。为了让大家更容易理解，举个生活中的例子：</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">你中午去&#8220;海底捞&#8221;吃饭。</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">我们可以把&#8220;海底捞&#8221;这个酒楼看成一个被测系统。</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">你去吃饭，就是对这个被测系统发起请求，对这个系统造成了一定的负载。你带去的人越多，那么这个餐馆就越繁忙，可以说餐馆承受的负载就越大。</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">你开始点菜。这个时候你隔壁桌的人也开始点菜。那么你们两个对这个系统产生了并发的请求。同时，其他桌有的在吃菜，有的在等菜，这些都是并发进行的事务。一个完整的吃饭事务可以定义成包括：点菜，下单，上菜，买单四个步骤。对于一个C/S的系统来说，可以对应于：建立连接，发送请求，接受应答，断开连接。</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">影响一个餐馆生意好坏的一个重要原因是上菜速度。上菜速度体现在两个方面：</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">1.一个顾客请求的处理耗时，从下单到上菜中间等待的时间，我们称之为响应时间。</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">2.这个餐馆同时为多名顾客上菜的频率，我们称之为吞吐量。</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">很多因素会影响上菜速度，比如服务员的个数、厨师的个数。对于一个C/S的系统，服务员相当于是接入层，厨师相当于是后台服务。假如服务员太少，下单很慢，后面的厨师都闲着，那么上菜速度也快不了；假如服务员够多，下单足够快，但是厨师太少，下的单来不及做，同样上菜速度也很慢；如果服务员很多，厨师也很多，但是来的客人很少，那么大部分的服务员和厨师都闲着，资源全部浪费掉了。因此，接入层和后台服务进程个数、以及资源配比，都是需要根据实际情况进行调优的。</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">来多少顾客，这是酒楼自己无法控制的，但是酒楼的上菜速度、餐位多少都会制约客流量。一定有一个峰值客流量，当来的客人超过了这个峰值，那么这些客人就会等位，或者是上菜速度超慢让客人无法容忍。容量测试就是通过工具模拟足够多的顾客来吃饭的事务，希望找到这样一个客流量对酒楼产生一定的负载，这个时候酒楼既能接待最多的客户同时也能保证最短的等待时间。更多的，还可以对这个酒楼人员配置和餐位设置等进行调优，以期达到一个最理想的资源利用率和效率。</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">客流量跟进来的客人多少有关，也跟餐馆的接待能力有关。单方面增加来就餐的顾客，遭到投诉的可能性就越大，上错菜的可能性也越大。</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">性能测试的核心概念主要包括两部分：正确的测试方法，正确的评价性能的指标。测试方法会告诉你用什么样的套路去执行测试；性能指标是告诉你如何用数值来描述你的测试对象的性能。</p><h2><strong style="word-wrap: break-word; margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">常用的性能指标</strong></h2><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">在介绍测试方法之前，先来了解一下关于服务器性能测试的一些指标含义。</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">&#9679;吞吐量：固定时间间隔内的处理完毕事务个数。通常是1秒内处理完毕的请求个数，单位：事务/秒（tps）。</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">&#9679;平均吞吐量：一段时间内吞吐量的平均值。无法体现吞吐量的瞬间变化。</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">&#9679;峰值吞吐量：一段时间内吞吐量的最大值。是用来评估系统容量的重要指标之一。</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">&#9679;最低吞吐量：一段时间内吞吐量的最小值。如果最小值接近0，说明系统有&#8220;卡&#8221;的现象。</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">&#9679;70%的吞吐量集中区间：通过统计15%和85%的吞吐量边界值，计算出70%的吞吐量集中区间。区间越集中，吞吐量越稳定。</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">&#9679;响应时间：一次事务的处理时间。通常指从一个请求发出，到服务器进行处理后返回，再到接收完毕应答数据的时间间隔，单位：毫秒。</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">&#9679;平均响应时间：一段时间内响应时间的平均值。无法体现响应时间的波动情况。</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">&#9679;中间响应时间：一段时间内响应时间的中间值，50%响应时间，有一半的服务器响应时间低于该值而另一半高于该值。</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">&#9679;90%响应时间：一段时间内90%的事务响应时间比此数值要小。反应总体响应速度，和高于该值的10%超时率。是用来评估系统容量的重要指标之一。</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">&#9679;最小响应时间：响应时间的最小值。反映服务最快处理能力。</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">&#9679;最大响应时间：响应时间的最大值。反映服务器最慢处理能力。</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">&#9679;CPU占用率：1-CPU空闲率，表示CPU被使用情况，反映了系统资源利用情况。</p><h2><strong style="word-wrap: break-word; margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;"> 常用的测试方法</strong></h2><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">关于服务器性能测试，目前常用的测试方法有这些：</p><h2><strong style="word-wrap: break-word; margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;"> 1、现网数据预估</strong></h2><img alt="null" src="http://d.ifengimg.com/q100/img1.ugc.ifeng.com/newugc/20180309/10/wemedia/b4c56e732c34e764a980ab285baf8cc89347ce39_size25_w597_h405.jpg" data-ke-src="http://d.ifengimg.com/q100/img1.ugc.ifeng.com/newugc/20180309/10/wemedia/b4c56e732c34e764a980ab285baf8cc89347ce39_size25_w597_h405.jpg" style="word-wrap: break-word; border: none; margin: 0px auto; padding: 0px; list-style: none; box-sizing: border-box; vertical-align: middle; display: block; max-width: 50%; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;" /><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><br style="word-wrap: break-word;" /></p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">现网数据预估是根据压力测试过程中的部分数据，对未来大量用户访问的情况机型预估。图中的横轴代表现网吞吐量，纵轴代表CPU压力。</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">图中绿色的部分代表当前的服务器压力，当收集一段时间数据之后，可以模拟一条曲线。假设对服务器的上线成本预估是80%，可以通过曲线拟合的方式推测出现网的能力是多少，也从而推断出最大上限是多少。</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">缺点：通常游戏服务器都是比较复杂的，这种方式只适合简单的服务器拟合，复杂服务器数据就不太准确。</p><h2><strong style="word-wrap: break-word; margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;"> 2、真人压测</strong></h2><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">真人压测就是通过邀请一定数量的真实用户来玩游戏，从而对服务器达到一个测试效果。这种方式他最大特点在于用户的行为相对是最真实的，因为用户的使用完全不会受到限制，和线上一个真实用户一样。目前游戏上线过程中的&#8220;封测&#8221;，就可以被认为是一种真人压测，可以帮助开发者发现一些性能问题。</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">但是这种方式也存在着弊端：</p><h2><strong style="word-wrap: break-word; margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">&#9679;暴露出的性能问题有限</strong></h2><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">许多经过封测的游戏到上线还会产生问题，原因之一就是封测人数通常还是太少，虽然有几百或者几千用户在玩，但是并发并不够，不足以暴露服务端性能问题；</p><h2><strong style="word-wrap: break-word; margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;"> &#9679;不适合调优</strong></h2><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">服务器性能测试不光需要暴露服务器的问题，暴露问题之后还需要不断的回归调优，但是真人是无法完全重复这些行为方式的。</p><img alt="null" src="http://d.ifengimg.com/q100/img1.ugc.ifeng.com/newugc/20180309/10/wemedia/18c1f77eca74a2630b966f03ba09d29557b507a9_size55_w596_h449.jpg" data-ke-src="http://d.ifengimg.com/q100/img1.ugc.ifeng.com/newugc/20180309/10/wemedia/18c1f77eca74a2630b966f03ba09d29557b507a9_size55_w596_h449.jpg" style="word-wrap: break-word; border: none; margin: 0px auto; padding: 0px; list-style: none; box-sizing: border-box; vertical-align: middle; display: block; max-width: 50%; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;" /><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><br style="word-wrap: break-word;" /></p><h2><strong style="word-wrap: break-word; margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;"> 3、接口测试</strong></h2><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">服务器方面的接口测试与传统意义上的接口测试略有不同，当开发人员需要对一套服务器进行评估，但是又时间不足的情况下，我们可以考虑选择一些具有代表性的功能，以及一些高风险功能进行测试，通过以小见大的方式，来评估整套服务器性能。</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">当然这个方法的主要问题就是无法遍历整个服务器的接口，难以避免一些微小的问题。</p><img alt="null" src="http://d.ifengimg.com/q100/img1.ugc.ifeng.com/newugc/20180309/10/wemedia/69a004220e1c5340430eea0c6e9f982c8c3e7fcb_size26_w593_h430.jpg" data-ke-src="http://d.ifengimg.com/q100/img1.ugc.ifeng.com/newugc/20180309/10/wemedia/69a004220e1c5340430eea0c6e9f982c8c3e7fcb_size26_w593_h430.jpg" style="word-wrap: break-word; border: none; margin: 0px auto; padding: 0px; list-style: none; box-sizing: border-box; vertical-align: middle; display: block; max-width: 50%; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;" /><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><br style="word-wrap: break-word;" /></p><h2><strong style="word-wrap: break-word; margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;"> 4、录制回放</strong></h2><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">这里面包含两部分，&#8220;录制&#8221;就是通过抓取数据包的方式，来获取游戏时的协议，比如用户登录游戏时抓取登录包；&#8220;回放&#8221;即把这些捕获的协议重新发送给服务端，这样理论上就可以通过工具放大协议量级达到性能测试的目的，比如将之前录制的登入协议扩大1w倍给服务器，这样就模拟了1w人同时登入的情况。</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">这个方法存在的问题是，游戏的协议交互非常复杂，如果只是单纯的放大数据包，对于服务器是产生不了多大的压力的。这类方法比较适合固定输入输出服务类型的测试。</p><img alt="null" src="http://d.ifengimg.com/q100/img1.ugc.ifeng.com/newugc/20180309/10/wemedia/b5e5869135ca179f37205a7c78708671533e7f9d_size28_w577_h393.jpg" data-ke-src="http://d.ifengimg.com/q100/img1.ugc.ifeng.com/newugc/20180309/10/wemedia/b5e5869135ca179f37205a7c78708671533e7f9d_size28_w577_h393.jpg" style="word-wrap: break-word; border: none; margin: 0px auto; padding: 0px; list-style: none; box-sizing: border-box; vertical-align: middle; display: block; max-width: 50%; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;" /><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><br style="word-wrap: break-word;" /></p><h2><strong style="word-wrap: break-word; margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">5、机器人模拟</strong></h2><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">机器人模拟测试是对以上各种测试做了一个平衡， 通过高还原真实玩家的用户行为，模拟高并发场景，从而得到类似很多人同时游戏的测试效果。机器人模拟有三个优势：</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">高还原游戏玩法，深度模拟真实用户行为：</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">1.&nbsp;并发性不受限制，从1W到10W，压力能够自主设置；</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">2.&nbsp;可以反复执行，便于性能调优回归；</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">3.&nbsp;实现7*24小时不断监控，在开发提交代码之后，版本在自动编译之后就跑新的测试，这样每天都能进行性能监控，在调优方面，完全地进行一个重复性测试，可以不断的进行回归和调优。</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">这个方法的问题就在于机器人模拟需要专人开发，对测试者的开发能力，分析能力都有一个比较高的要求。</p><img alt="null" src="http://d.ifengimg.com/q100/img1.ugc.ifeng.com/newugc/20180309/10/wemedia/bf75a5de7c0dd7a6635b8a258e0985fa8f59cff1_size21_w576_h329.jpg" data-ke-src="http://d.ifengimg.com/q100/img1.ugc.ifeng.com/newugc/20180309/10/wemedia/bf75a5de7c0dd7a6635b8a258e0985fa8f59cff1_size21_w576_h329.jpg" style="word-wrap: break-word; border: none; margin: 0px auto; padding: 0px; list-style: none; box-sizing: border-box; vertical-align: middle; display: block; max-width: 50%; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;" /><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><br style="word-wrap: break-word;" /></p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">说到这里，我们对之前所有的服务器性能测试方法进行了一个总结：</p><img alt="null" src="http://d.ifengimg.com/q100/img1.ugc.ifeng.com/newugc/20180309/10/wemedia/febcd325b5462fd4b960b8e24ac92bfcb4e34513_size53_w553_h589.jpg" data-ke-src="http://d.ifengimg.com/q100/img1.ugc.ifeng.com/newugc/20180309/10/wemedia/febcd325b5462fd4b960b8e24ac92bfcb4e34513_size53_w553_h589.jpg" style="word-wrap: break-word; border: none; margin: 0px auto; padding: 0px; list-style: none; box-sizing: border-box; vertical-align: middle; display: block; max-width: 50%; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;" /><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><br style="word-wrap: break-word;" /></p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">我们可以发现，速度与准确性始终是对立的，如果游戏开发者队友服务器测试有一个明确的规划，对服务器压测有一定的时间预留，机器人模拟的效果是非常好的。</p><h2><strong style="word-wrap: break-word; margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;"> 如何实现机器人模拟</strong></h2><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">那么我们到底是如何来开发一款进行服务器性能测试的机器人呢？</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">整个开发过程主要可以概括为三大步骤，建模， 分析， 开发。</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><strong style="word-wrap: break-word; margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;"> 第一步，建模。</strong></p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">建模是什么呢，建模是为了模拟真实玩家行为，分为两种方法：</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">1）探索典型玩家关键路径</p><img alt="null" src="http://d.ifengimg.com/q100/img1.ugc.ifeng.com/newugc/20180309/10/wemedia/59ecdc879a2491f9a7e22005de94ba09994b0d09_size45_w640_h425.jpg" data-ke-src="http://d.ifengimg.com/q100/img1.ugc.ifeng.com/newugc/20180309/10/wemedia/59ecdc879a2491f9a7e22005de94ba09994b0d09_size45_w640_h425.jpg" style="word-wrap: break-word; border: none; margin: 0px auto; padding: 0px; list-style: none; box-sizing: border-box; vertical-align: middle; display: block; max-width: 50%; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;" /><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><br style="word-wrap: break-word;" /></p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">通过大量玩家数据的支撑，选择最多的行为路径，设计机器人模拟的行为。</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">2）通过封测过程中的运营数据，生成专家视图</p><img alt="null" src="http://d.ifengimg.com/q100/img1.ugc.ifeng.com/newugc/20180309/10/wemedia/df783e00a895ac07247ec1bc659588b90e7b9b82_size38_w640_h418.jpg" data-ke-src="http://d.ifengimg.com/q100/img1.ugc.ifeng.com/newugc/20180309/10/wemedia/df783e00a895ac07247ec1bc659588b90e7b9b82_size38_w640_h418.jpg" style="word-wrap: break-word; border: none; margin: 0px auto; padding: 0px; list-style: none; box-sizing: border-box; vertical-align: middle; display: block; max-width: 50%; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;" /><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;"><br style="word-wrap: break-word;" /></p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">这个方法就是通过去测试服中搜集用户的协议数据，并对这些协议数据进行分析，确定各自是什么行为，把用户的这些协议数据还原成为用户行为的操作过程就像是把一块块散乱的拼图重新组织起来一样。</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">在这个过程中，最简单的是按比例组织，通过数据分析，发现用户登录，战斗各自占据多少比例，以这个比例来分配一定的人数进行登录和战斗。但是这个方式并不太适合游戏，对于游戏本身来说，一百个人不断的重复登录的行为，一百个人同时重复游戏的行为，显然是不符合逻辑的。</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">那么在分析的过程中，采用概率的方式，是更加贴近一个真实用户的行为的。当模拟一个真实用户登录之后，有一定的可能性会重新登录，还有一部分可能性就进行战斗，例如机器人有10%概率重新登入，50%概率进行战斗。 同时我们还需要考虑对角色身上的装备数据， Cache的命中，数据库容量等等，目的是让机器人更接近真实用户，更加符合一个真实用户的行为。</p><h2><strong style="word-wrap: break-word; margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;"> 第二步，分析。</strong></h2><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">那么我们会对客户端进行行为交互和协议分析。一方面，为后续协议开发实现做准备；另外，在登入的过程中，会产生大量的协议，如果没有对客户端进行分析，可能只是调用了登录的协议，从实际的协议交互上来说，一次登录可能包含了很多其他的协议信息，那这时我们实现登入就不能仅仅是个简单的登录协议，可能还包含拉取邮件信息，拉取好友信息等协议，两者之间对登入的性能差异影响非常大。</p><h2><strong style="word-wrap: break-word; margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;"> 第三步，代码开发。</strong></h2><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">主要包含两部分：</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">1）协议的开发，包括协议的实现，协议的解包等；</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">2） 业务逻辑的组织，主要对上述游戏模型进行实现。</p><h2><strong style="word-wrap: break-word; margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;"> 服务器性能测试工具的使用</strong></h2><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">不过令人遗憾的是，对于游戏开发者的实际情况来说，充足的测试时间并不是每次都可以保证的，而且对于模拟机器人的开发过程本身又是一个很大的投入，对于一些通用场景，如果能够有通用的平台代码可以调用，相信对于游戏开发者是一种极大的解放。</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">对于服务器性能测试来说，好的测试要做到这样几点：</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">业务场景模拟。可编码解析任意协议，实现复杂业务场景。</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">发现瓶颈。支持使用场景中复杂的数据传输行为，比如&#8220;登录&#8221;&#8220;查看个人信息&#8221;等，更加真实的模拟用户行为，发现服务器问题；</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">持续压力。实现7*24小时一定量级的服务器压力；</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">触达极限。短时间内触达服务器的压力上限。</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">灵活自定义。对于类似游戏的复杂混合场景，可以结合在线代码开发IDE，实现对任何标准或自定义协议的通信。</p><p style="word-wrap: break-word; padding-top: 0px; padding-bottom: 0px; list-style: none; box-sizing: border-box; counter-reset: list-1 0 list-2 0 list-3 0 list-4 0 list-5 0 list-6 0 list-7 0 list-8 0 list-9 0; font-family: Helvetica, Arial, sans-serif; font-size: 14px; white-space: pre-wrap;">转载：http://www.51testing.com/html/22/n-3725022-2.html</p><img src ="http://www.cnitblog.com/shbwf/aggbug/90895.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/shbwf/" target="_blank">51testing</a> 2018-03-09 11:20 <a href="http://www.cnitblog.com/shbwf/articles/90895.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>