﻿<?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/6168.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 20 Jun 2018 20:19:36 GMT</lastBuildDate><pubDate>Wed, 20 Jun 2018 20:19:36 GMT</pubDate><ttl>60</ttl><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>游戏开发过程中需求变化那些事</title><link>http://www.cnitblog.com/shbwf/articles/91047.html</link><dc:creator>51testing</dc:creator><author>51testing</author><pubDate>Thu, 07 Jun 2018 05:26:00 GMT</pubDate><guid>http://www.cnitblog.com/shbwf/articles/91047.html</guid><wfw:comment>http://www.cnitblog.com/shbwf/comments/91047.html</wfw:comment><comments>http://www.cnitblog.com/shbwf/articles/91047.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shbwf/comments/commentRss/91047.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shbwf/services/trackbacks/91047.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;;">项目管理</a>越来越重要，流程分工也在不断细化。传统的<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;">　　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、<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;">　　4、概要设计</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;">　　6、编码</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　7、<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;">　　8、集成交付</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;不再改变&#8220;。</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;">　　&#8220;小步试错，快速迭代&#8221;的前提否定了需求的&#8221;圣神性&#8220;和&#8221;不变性&#8220;，默认需求是&#8221;错&#8220;的，是会随时变化的。虽然游戏产品大多数没有了严格意义上的传统软件开发过程中的步骤分工，但是这些步骤所代表的开发内容是存在的，只是因为需要&#8221;快速&#8220;，各步骤的界限被打破简化融合到了一起。变化的需求依然会导致后续开发个阶段的变化。</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;">　　具体到游戏产品，产品的方向更多是公司老板或者制作人看好某个游戏细分领域，构造出这个游戏产品的核心玩法，基于该核心玩法，结合各种辅助系统，最后得到一个完整的游戏。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　游戏的具体做法是，产品策划根据制作人的宏观构想，首先设计出核心玩法原型，并和程序紧密配合，实现出第一个核心玩法demo。项目主要参与人员（特别是老板，制作人等）体验并头脑风暴，可能经过多次的迭代修改后，得到一个大家都认可的核心玩法demo。核心玩法是游戏的存在的根基，是能够满足玩家对游戏性，可玩性的要求，或者超出玩家的预期。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　为了构建一个完整的游戏，需要在核心玩法之外建立各种辅助游戏系统（如角色，等级，成长，装备，任务，副本，好友，工会，组队等等），而游戏开发过程中最大量的需求，即来自这些辅助功能系统。辅助功能系统大多数都有一定程度的同质化，简单粗暴的方法都是copy友商的系统规则和设计，好一点的进行一些微创新，极少数的会有原创功能玩法。无论是copy，微创新还是原创，针对开发（程序，美术）来说，都是任务需求。</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;">　　世界在不断的发展变化，行业环境在变化，用户的喜好也在变化，唯一不变的就是&#8221;变化&#8220;本身。如果将游戏功能简单的分成核心玩法和辅助系统两部分，那么需求变化也来自这两部分。</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;">　　核心玩法是游戏存在的根本，理想情况下核心玩法的变化只应该在demo打磨阶段，已经demo确定后，核心玩法就不应当再改变。此时发生的改变的原因是发现核心玩法并不能满足用户的需求，或者有了更好的想法。</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;">　　有了&#8221;更好&#8220;的想法：对于同一个功能，策划有了新的更好的想法。</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;更理解市场和用户&#8220;，他们会加入自己的想法到游戏中。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　来自&#8221;新人&#8220;的不同想法：项目的新成员，特别是新策划（新制作人）的加入，会导致需求的大量变化。</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;">　<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;">　　项目开发周期不可控：需求的变化意味着开发工作量和沟通工作的提升，必然导致开发周期delay。又要引入变化，还需要强制按原计划时间完成都是天真的一厢情愿。一厢情愿的事情累计多了之后，会在团队中逐渐产生怨气，从而危害团队。</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;既然还会继续变化&#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;;">怎么解决需求变化问题</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;">　<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;">　　作为团队管理者，需要挖掘和发挥每个人的优势，让他们能够发挥自己的全部潜能，并不断提高。在项目中不断做出自己的贡献，形成一种成就感和归属感，一旦事情从&#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;"><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;">　　<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;">　　<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;">　　项目开发过程中，很多时候为了&#8221;快&#8220;，导致系统设计和规则逻辑并未想彻底就已经开工。最终做到一半或者快要完成时发现机制有缺陷，需要重新设计，此时的改动可大可小。开发前的充分设计，彻底理解和吃透产品逻辑规则，有利于减少开发中的不稳定因素。</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;">　　人与人在沟通过中，广泛存在&#8220;信息漏斗&#8221;现象。假设A有一件事情需要B去做，信息漏斗作用过程如下：</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　A在心里想了一件事情，假设完整度是100%。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　A找到B，把事情描述给B的过程中，因为表达能力或者语言表意缺陷，只能把80%的事情说出来。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　B在听A表达的过程中，由于自己注意力分散或主观偏见等因素，只能听到事情的60%。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　B在理解自己听到内容的过程中，因为自己的知识结构，理解偏差等，又会损失掉20分的信息完整度，得到40%的信息。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　B在执行的过程中，因为执行力或者其他因素导致偏差，又损失掉20，最终只能得到一个20%的结果。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　从以上模拟的&#8220;信息漏斗&#8221;可以看出，最初A的一个100%完整度的事情交代给B执行出来后，只变成了一个20%的结果，和最初要的东西已经大相径庭。最终A和B在核对最终结果的时候，会出现无穷的争执和矛盾。</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;;">　需求分期</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;"><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;">　<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;">　　首先，需要确保成员都理解变化是不可避免的，确保大家对共同目标的认可，都在为达到目标积极的想办法改进，大家的沟通还在一个&#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;，一旦沟通双方都感觉到了对方的坦诚沟通态度，自己的防备和抵抗情绪就会消减，更容易回归到事情本身。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　再次，沟通时要给与对方足够的尊重，任何人都有被得到尊重的需求，&#8221;你的心理有没有我&#8220;？我们交流的时候，你是否是一种愿意解决问题的态势，这个很重要，中国是人情社会。大部分人对应别人对自己的态度是很在乎的，知道是&#8221;你在乎我&#8220;的前提下，任何问题都不是问题。</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;&nbsp;如果有任何疑问，欢迎添加qq群测试入门到大神 755431660 共同学习~<br style="word-wrap: break-word;" />&#8203;<img src="http://blog.chinaunix.net/attachment/201806/7/29734443_1528342440U92c.png" data-ke-src="/attachment/201806/7/29734443_1528342440U92c.png" width="617" height="501" alt="" style="word-wrap: break-word; border: 0px;" /></div><img src ="http://www.cnitblog.com/shbwf/aggbug/91047.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-07 13:26 <a href="http://www.cnitblog.com/shbwf/articles/91047.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基层管理者项目管理二三事</title><link>http://www.cnitblog.com/shbwf/articles/91045.html</link><dc:creator>51testing</dc:creator><author>51testing</author><pubDate>Wed, 06 Jun 2018 03:53:00 GMT</pubDate><guid>http://www.cnitblog.com/shbwf/articles/91045.html</guid><wfw:comment>http://www.cnitblog.com/shbwf/comments/91045.html</wfw:comment><comments>http://www.cnitblog.com/shbwf/articles/91045.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shbwf/comments/commentRss/91045.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shbwf/services/trackbacks/91045.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>管理者如何做好团队和项目的管理。</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;;">　项目delay的撕逼</strong></div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　小Q是A组开发人员，小J是B组技术经理。周一AB两组联合开发会议，周五需要完成所有开发工作，下周一送测。当时情形还是历历在目，小J拍拍胸脯地说，周五必须没问题的，大家愉快的达成一致意见。1天、2天、3天，时间一天天地过去了，转眼已经来到周五早上。小Q这边本身的工作已经完成，就等着小J的接口联调啦。当然，小Q已经催过很多次，小J的组员小P一直都说没问题，下午给，下午给。结果大家当然是可想而知的，到了周六小Q依然是陪着小P他们加班联调，然并卵啊。周一无法送测啊，<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>过来一顿屌，小Q怼到小J那边，不是拍着胸脯说好的必须没问题嘛，为什么最后给不出来。怼来怼去，怼天怼地没什么用，毕竟人家小J是管理层嘛，扯点理由忽悠下上面的管理层那还不简单。表面看来没事，试问小Q他们组与小J组的关系还能好么，以后还能有一个和谐的合作环境么，我想挺难的。</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;">　　一拍脑袋，就这么干。一拍胸脯，没有问题。一拍大腿，出事了。一拍屁股，走人了。相信很多程序员哥哥都对这句话很熟啦，身边经常性出现这样的事情。上面的小故事里面小J同学就是拍拍胸脯哦，当时过任务时我看小J都没有仔细想想，也没有问过组员是否有问题，任务量到底有多大，全然不知，全然不管。胸脯再厚，拍多了也会疼啊。</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;">　　作为有职业素质道德的小Q每天都有去找小J组的人确认开发的情况，早上永远都是说下午搞好，今天总是说明天搞好。小J常常挂在嘴边的话就是事情太多啦，人手不够的，没办法。我有看到相关开发人员确实是晚上有加班，但是原因如何确实不知。是工作量太大，还是效率太低，这些我们就不知道了。我们可以看到的就是一次次的延期，而他们的其他组员每天都似乎挺清闲的，晚上早早就回家。而这样的情况，在小J眼中看来就是事情很多，人手不够。</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;">　　很多公司或是团队经常都会以兄弟来拉近同事之间的距离，不可否认的是如果大家之间有这种默契的话，那当然是没有问题咯，大家都是兄弟，帮帮忙是没所谓。可是这一切都是有前提的，显然小J与小Q关系并不是很好。当然这都是其次的，在小Q看来，小J他们每天晚上并没有加班到很晚，而且很多人基本上都是不加班的。基于这种情形，小Q组的人怎么可能愿意周末陪着他们联调，你自己的活都干完了，牺牲周末的时间陪你坐在公司傻傻的点点按钮，看看log。大家都不是傻X，工作一周，单身狗还不想回去睡个懒觉，有家室的还不想老婆孩子热炕头嘛。结果就是，周末肯定搞不成器的，索性大家都不来了咯。</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;">项目管理</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;"><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;">　　庖丁解牛过程中，出现拍拍胸脯的动作就是源于小J对于项目内容不了解，胡乱答应做决策。作为一名基层管理者，不能脱离业务，不能脱离项目。小J同学平日里基本是已经不再敲码了，对于技术基本上是慢慢生疏。但是作为队长，如果不能深入了解项目的内容，技术的难度，工作量大小，那你又拿什么去拍胸脯呢？如果是在战场，你这是拿弟兄们的命作为你猜测的赌注呢。想要做出正确的决策，合理的规划，必须要对事情有足够的了解，权衡各方利弊方能妥当。</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;">　　一名基层管理者，除了基础的技术性工作，还要了解关心整个团队成员的工作和<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;">　　很多基层管理者在面对很多事情的时候，常常会变得手足无措。通常将任务分配给别人之后，基本上不再去管到底进行的怎么样了，到最后如果同事来一句这个我搞不定，没办法完成的时候，简直就是慌成??了。临门一脚，有几个人能有这么强能力去把所有事情给搞定啊，所以实时了解情况，让风险能够早点暴露，给自己更多的时间去处理，收益的始终是自己。可以试想一下，某天你的上级突然问你某某项目进行如何，是不是遇到什么问题了，而你自己全然不知，除了劈头盖脸的一堆怼，你上级心中的形象也就差不多了。知己知彼，方能百战百胜。只有实时了解信息，才能培养自己的随机应变能力，不至于被动。</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;">　　继开篇之后的一篇项目管理短文，该文章主要针对基层管理者去写，给基层管理同学和意欲从事管理工作的同学们一些参考。在现实工作中，还有很多因为管理不到位引起的问题事件，相信大多数人都有遇见过。欢迎大家开怀畅谈。<br style="word-wrap: break-word;" />&#8203;&nbsp; &nbsp; &nbsp;&nbsp;如果有任何疑问，欢迎添加qq群测试入门到大神 755431660 共同学习~<br style="word-wrap: break-word;" />&#8203;<img src="http://blog.chinaunix.net/attachment/201806/6/29734443_1528256867mdLv.png" data-ke-src="/attachment/201806/6/29734443_1528256867mdLv.png" width="617" height="501" alt="" style="word-wrap: break-word; border: 0px;" /></div><img src ="http://www.cnitblog.com/shbwf/aggbug/91045.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-06 11:53 <a href="http://www.cnitblog.com/shbwf/articles/91045.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>你不知道的软件测试那些事？</title><link>http://www.cnitblog.com/shbwf/articles/91044.html</link><dc:creator>51testing</dc:creator><author>51testing</author><pubDate>Tue, 05 Jun 2018 05:54:00 GMT</pubDate><guid>http://www.cnitblog.com/shbwf/articles/91044.html</guid><wfw:comment>http://www.cnitblog.com/shbwf/comments/91044.html</wfw:comment><comments>http://www.cnitblog.com/shbwf/articles/91044.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shbwf/comments/commentRss/91044.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shbwf/services/trackbacks/91044.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 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;;">　你不知道的<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;">软件测试</strong></a>那些事？</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></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;;">单元测试</a>，但这也通常是我们发现没时间时跳过的第一步。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; line-height: 24px;">　　作为团队的领导者或者管理者我们都知道测试是必要的，但是当截止日期临近的时候，我们倾向于减少测试，而把更多的重点放到编码上。这样看测试领域似乎很紧张。我们都知道测试对我们是有利的，但是一旦项目面临压力时我们就不再测试了。</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></div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; line-height: 24px;">　　Edsger W Dijkstra 说过:测试可以用来找到显式的缺陷（bug），但是无法显示潜伏的软件缺陷（bug）。这意味着测试不能百分百保证你的软件没有缺陷（bug），但是它确实很有帮助。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; line-height: 24px;">　　我们也可以换种说法，如果我们不进行测试我们几乎可以百分百保证我们的软件会有缺陷（bug），除非我们是在编写像&#8220;hello world！&#8221;那样简单的程序。但是即使这么简单的程序你也会测试，因为一旦你输入完你的代码你就会很好奇它的输出是不是真的是&#8220;hello world！&#8221;。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; line-height: 24px;">　　而这就是第一类形式的测试，也是我们一直在做的: 手工测试. 我们编写程序，然后启动它去检验运行结果。 对于一个简单的&#8220;hello world&#8221;这可能是足够的，但是对于复杂度更高的程序这可能会导致时间的浪费，这是对一个已知的行为结果集的手工重复。这难道不是我们发明计算机的初衷吗?</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; line-height: 24px;">　　对于&#8220;hello world&#8221;这不是大问题，但是当你创建一个&nbsp;<a target="_self" style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;color:#111010;&quot;;">web</a>&nbsp;应用时，测试场景是在翻页十次，点击某些按钮，在大量表单中输入（正确的）数据之后再测试某些特定条件，你就看到自动化会节省大量的时间。如果你能通过测试运行器（testrunner）直接执行你想要测试的函数，而不是必须花费半分钟手工执行到那个函数，你会节省很多时间！但这也意味着我们需要多一点点编程，而更多的编程意味着更多的时间和精力。所以它会花费更多的时间而你的项目可能因此完工的晚些。</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></div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; line-height: 24px;">　　让我们创建一个控制台应用程序来计算最大公约数(GCD)的两个整数。有很多方法可以解决这个问题，但为简单起见，我们将</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; line-height: 24px;">　　1.输入两个整数</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; line-height: 24px;">　　2.不管其算法怎么样，计算一下 GCD</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; line-height: 24px;">　　3.显示输出</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; line-height: 24px;">　　让我们浏览一下正常的开发周期。我们通常写一个 main() 函数，得到了两个整数，以及调用一个函数来计算一下 GCD，然后显示结果。测试。在你的控制台中输入 2 个整数会花一些时间，这将变得相当无聊，如果你需要多次重复你的代码。这也很容易在控制台应用程序中输入出错，导致程序崩溃。这意味着你必须重新启动程序，输入两位数，然后再次验证结果。请你要记住，我们讨论的是一个控制台应用程序，只需要两个输入值，不需要点击(在 web 应用程序中)，我们已经看到，这将需要花费一些时间。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; line-height: 24px;">　　然后，我们很可能会想要测试一些更多意味着重启程序的值，进入两位数（正确地），然后测试。。。所以我们即使看到也不会立即这样做，因为它要花费太多的时间。Edge 案例将会被遗忘，错误只会在生产中被发现！此外，当我们改变一些我们需要再次运行所有的测试(手动)，使用一个被遗忘的，或者使用快捷键的高风险的测试。在那儿，不会有跟踪我们的测试工作。不写入日志文件，在整个测试期间，除非你增加这个你做的事情列表工作(手动)。</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></div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; line-height: 24px;">　　通常，当项目（因为某种原因）延期了，则容易陷入一种消极反馈循环。有时我们会先决定跳过编写测试代码，而这则会造成情况。<br style="word-wrap: break-word;" />&#8203;<div style="word-wrap: break-word; margin: 0px auto; padding: 0px; line-height: 24px;">项目延期，造成我们不得不去编写更多的代码。所以与其&#8220;浪费时间&#8221;去不停地测试代码，不如不停地去开发项目。而这样做的结果就是代码质量进一步下降，并最终（或早或晚）导致返工。返工又通常会在最有限的时间里变得十分紧急（有些人叫这种现象为&#8220;墨菲是个乐天派！&#8221;）。其实返工什么也改变不了，项目现在只会进一步被延迟。很奇怪吧，我们编写越多的代码，我们的项目完工越晚。一种常用应对措施是让更多的开发人员被参与到项目的研发中，然而这样的作用也只是加剧消极反馈循环而已。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; line-height: 24px;">　　若项目缺乏测试，在验收和生产环境时，通常用户则会发现许多 bug，这将会快速地降低用户对项目的信任度，从而产生消极反馈。这种反馈传递给（工作过度的）开发人员，就造成开发人员&#8220;疲劳&#8221;现象。后果就是开发人员工作积极性下降，开发人员离职，&#8230;&#8230;，项目又进一步延迟了。</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></div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; line-height: 24px;">　　我想你已经想到有一个办法可以解决这种现象。让我们来绘制一幅不同的场景：我们可以从一个理想计划&#8220;项目按时完工&#8221;开始。我们开发代码，然后立即测试它。测试最好是自动化（编码实现）的，这样我们可以轻松有效的去执行它们。我们把开发和测试紧密的结合在一起，每个开发测试循环可以很快速的执行。当一个开发测试循环结束时我们有信心保证代码质量是很高的，因为它已经通过了测试。而且用户因为发现缺陷（bug）的数目变少而对我们继续高度信任。即使他们发现了一个缺陷（这依然是有可能的），我们也可以扩充我们的测试集合，去避免相关缺陷的重现。如此下去，返工将不再是必须的，项目得有继续。如果我们的项目已经延期了，就需要我们花些时间来采用这种方法论。对新功能的冻结也许是必须的。停止开发新的代码，取而代之去为最严重的（恼人的－清晰的－高代价的）缺陷编写测试。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; line-height: 24px;">　　项目延期的情况下再去为你完整的代码库编写测试是不可行的，只针对其中的一些部分就可以，不要去浪费你的时间。但是要记住其它部分也还是需要编写测试的。我在这种情况下会去找出最严重的问题（划分优先级），然后为它们编写测试。之后&#8220;快速&#8221;修改代码就会变的更容易，并且可以保证在修改其他部分是它不会出错。<a target="_self" style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;color:#111010;&quot;;">自动化测试</a>可以很频繁的执行，从而降低了缺陷（bug）重现的风险。大讲台，最实用的 IT 职业在线学习平台。好了，现在可以开始去有效的强健我们项目了</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></div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; line-height: 24px;">　　大部分的项目中，会考虑测试和编码之间的平衡。不过我希望大家都能清楚，测试其实是项目的加速器，而不是在浪费时间。<br style="word-wrap: break-word;" />&#8203;&nbsp; &nbsp; &nbsp; &nbsp;如果有任何疑问，欢迎添加qq群测试入门到大神 755431660 共同学习~<br style="word-wrap: break-word;" />&#8203;&nbsp;<img src="http://blog.chinaunix.net/attachment/201806/5/29734443_15281777210Xf4.png" data-ke-src="/attachment/201806/5/29734443_15281777210Xf4.png" width="617" height="501" alt="" style="word-wrap: break-word; border: 0px;" /></div></div></div><img src ="http://www.cnitblog.com/shbwf/aggbug/91044.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-05 13:54 <a href="http://www.cnitblog.com/shbwf/articles/91044.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>像个专业人士一样去调试Bug</title><link>http://www.cnitblog.com/shbwf/articles/91016.html</link><dc:creator>51testing</dc:creator><author>51testing</author><pubDate>Mon, 14 May 2018 05:24:00 GMT</pubDate><guid>http://www.cnitblog.com/shbwf/articles/91016.html</guid><wfw:comment>http://www.cnitblog.com/shbwf/comments/91016.html</wfw:comment><comments>http://www.cnitblog.com/shbwf/articles/91016.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shbwf/comments/commentRss/91016.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shbwf/services/trackbacks/91016.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=83169" data-ke-src="http://www.51testing.com/batch.download.php?aid=83169" 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/02/14982672_201802241143571TUos.png" data-ke-src="http://www.51testing.com/attachments/2018/02/14982672_201802241143571TUos.png" border="0" data-bd-imgshare-binded="1" 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;">　　欢迎收藏。当你遇到非常难缠的<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>时，不妨回来这里看看...</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;">　　&#183; 修复了一个Bug，却引入了更加致命的Bug</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　&#183;&nbsp;不停的修改代码，重启服务器，Bug依然没有修复</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　&#183;&nbsp;补丁打上去后，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真的出现时，我们往往十分慌乱，像一只无头苍蝇一样，调试的过程<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;">　　直到最近偶然看到了这本书&#8212;&#8212;《调试九法》，这是我看到的第一本讲<strong style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: &quot;&quot;;">调试方法论</strong>的书，回想自己之前在解决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时，思路更加清晰，心情更加淡定，从容不迫地去解决问题。</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;">　<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;">　　准备工作：</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　&#183; 如果你要调试这个系统，首先你必须先理解它。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　&#183;&nbsp;在开始调试之前，检查一下&#8220;插头&#8221;，别因为一些简单的问题而瞎忙活半天。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　&#183;&nbsp;确定&#8220;插头&#8221;没有问题之后，你需要重现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;">　　&#183;&nbsp;不要认为你猜测的原因是对的，要去观察，验证你的猜测。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　&#183;&nbsp;采用分而治之的方法，定位多模块的系统问题和修复由多个子问题引发的问题。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　&#183;&nbsp;一次只修改一个地方</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　&#183;&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;">记录</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;">　　&#183;&nbsp;如果正向调试走不通，不妨试一下反向调试法</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　&#183;&nbsp;最后一招：求助他人</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;">　　理解系统是定位Bug的前提条件。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　我之前遇到程序抛出异常时，经常就把异常信息贴到网上搜，然后把网上的解决方案执行一遍，有时work了，就大吉大利，可大多数时候，是不work的，原因很简单，也许对方的JDK版本跟你的不一样，也许你们俩只是报错信息相同，但是抛异常的原因不同，更大的可能，对方的解决方案本来就行不通。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　这就能理解为什么理解系统是定位Bug的前提了，如果你在定位一个JDK异常，那么至少你要掌握Java SE吧，如果你能掌握JVM的垃圾回收原理、类加载机制，自然更好；而如果你在定位一个支付系统为什么没有把账打到客户的账户，那么你得了解支付的流程吧。</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>，你需要理解整个系统，才能够进行调试。<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;">　　&#183;&nbsp;阅读手册：阅读需求设计文档、产品文档、使用手册等</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　&#183;&nbsp;仔细阅读手册的每一个细节：说不定解决Bug的方案就在某个段落里</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　&#183;&nbsp;掌握基础知识：最后你总是要看源码的，至少你要掌握相应的编程语言把</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　&#183;&nbsp;了解工作流程：从整体的角度来观察，而不是做井底之蛙</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>，以为问题一定出在自己这个模块，而其实问题是在上游的某个模块里。这一点，和《程序员的思维修炼》中提到的，&#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;;">检查插头</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;">　　甚至当出现一些不可理喻的错误时，你要去软件的运行目录下，比如Tomcat的webapps目录，看看软件包是不是完整。</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或者别人跟自己说这里有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时，你也会去尝试重现它，原因很简单：</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　&#183;&nbsp;重现失败让你可以观察失败发生时的上下文信息，进而找到失败的原因</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　&#183;&nbsp;重现失败让你可以判断是否已经修复了问题</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;">　　&#183;&nbsp;模拟失败发生的条件，但是不要模拟失败的机理，因为你认为的导致失败的机理很可能是错误的。举个例子，你认为是高并发导致的bug，于是你模拟了高并发的环境，问题重现了，然后你就说是高并发导致的，其实呢，只不过是高并发提高了问题发生的几率。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　&#183;&nbsp;只影响错误发生的频率，不影响错误发生的方式。其实高并发的环境可以用来提高错误发生的频率，只不过你要在问题重现时，要找到相应的日志信息，然后定位出问题发生的原因，而不是直接认为就是并发导致的。</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;">　　主观臆断的人，总是为了套用理论而扭曲事实，而不是用理论来解释事实。</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;">　　记住，调试是一门科学，任何不懂原理就进行的操作都是耍流氓。</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;">　　但是，如果你的业务执行是线性的，也就是说如果节点A执行失败，那么节点A之后的也都会执行失败，那么你就可以采用二分法的方式来定位了。要知道，在1到100里猜一个数字，最多也就需要7次。</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;">　<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;;">以免这个修改引入了新的Bug。</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;;">　做好修改记录</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;;">把你调试过程中的操作和结果按顺序全部记录下来</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;;">　反向调试法</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;">　　<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;">　　如果你对系统有一定理解的情况下，可以上软件供应商的官网、<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>、StackOverflow等网站寻找相关的资料。</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;">　　<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;">　　本书的例子虽然大多数都是关于工程<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>。完善而充分的<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时，也就说明你的<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><span style="word-wrap: break-word; color: #1a1a1a; font-family: Helvetica, 黑体; font-size: 16.5px; letter-spacing: 0.7px;">如果有任何疑问，欢迎添加qq群测试入门大神 755431660 共同学习~</span><span style="font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 16px;">&#8203;</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/14/29734443_152627472148qe.png" data-ke-src="/attachment/201805/14/29734443_152627472148qe.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/91016.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-14 13:24 <a href="http://www.cnitblog.com/shbwf/articles/91016.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>iOS顶部状态栏改变造成的Bug解决</title><link>http://www.cnitblog.com/shbwf/articles/91007.html</link><dc:creator>51testing</dc:creator><author>51testing</author><pubDate>Thu, 03 May 2018 03:51:00 GMT</pubDate><guid>http://www.cnitblog.com/shbwf/articles/91007.html</guid><wfw:comment>http://www.cnitblog.com/shbwf/comments/91007.html</wfw:comment><comments>http://www.cnitblog.com/shbwf/articles/91007.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shbwf/comments/commentRss/91007.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shbwf/services/trackbacks/91007.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，发现当状态栏改变（比如出现开启热点，另一个程序后台获取位置等）后，有些view会下移，而有些view不会下移，如果是底部的view下移后就会造成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;">　　当状态栏出现后，当前视图的根view的frame会发生改变，它的y值会增加20，高度会减少20。而[UIScreen mainScreen].bounds和[UIApplication sharedApplication].keyWindow.bounds这两个方法得到的frame是不会改变的（始终等于屏幕大小）。所以一不注意就很容易写出状态栏改变后会引起视图下移的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;">　　1、view创建的时候已经有状态栏</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　2、view创建的时候没有状态栏，view显示完全后才出现状态栏</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;">　　最简单的办法就是使用autolayout进行约束，并且靠底部的视图一定要从底部进行约束，这样无论是第一种情况还是第二种情况都不会产生bug。或者使用autoresizing，即设置view.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　如果在不使用autolayout和autoresizingMask的情况下</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　&#183; view创建的时候已经有状态栏</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　这种情况就很简单，当我们写frame获取当前视图大小的时候不要使用[UIScreen mainScreen].bounds和[UIApplication sharedApplication].keyWindow.bounds这两个方法，改为[UIApplication sharedApplication].keyWindow.rootViewController.view.bounds这样来获取，这样获取的结果就是当前有无状态栏的时候的视图尺寸。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　&#183;&nbsp;view创建的时候没有状态栏，view显示完全后才出现状态栏</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　这种情况就是view已经创建后状态栏会动态改变这种情况，而我们写代码的时候为了避免出现bug也是必须要兼容这种情况的。这种情况除了前面说的用autolayout来创建视图，另一种方法就只能监听状态栏改变的通知了，并且在收到通知后去动态的调整。</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、如果是要获取当前视图的大小（而不是屏幕尺寸），建议使用[UIApplication sharedApplication].keyWindow.rootViewController.view.bounds</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　2、靠底部的简单视图尽量使用autolayout或者autoresizing，并且从底部进行约束（这样完全可以避免bug）</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　3、如果是用frame创建的视图，并且视图靠近底部，一定要考虑状态栏改变后视图下移可能造成遮挡的情况，所以这时候就只能去监听通知并进行一下动态的改变或者使用autoresizing。</div><div style="word-wrap: break-word; font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 16px;">如果有任何疑问，欢迎添加qq群测试入门大神 755431660 共同学习~<br style="word-wrap: break-word;" />&#8203;&#8203;<img src="http://blog.chinaunix.net/attachment/201805/3/29734443_152531857566G0.png" data-ke-src="/attachment/201805/3/29734443_152531857566G0.png" width="402" height="381" alt="" style="word-wrap: break-word; border: 0px;" />&#8203;</div><img src ="http://www.cnitblog.com/shbwf/aggbug/91007.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-03 11:51 <a href="http://www.cnitblog.com/shbwf/articles/91007.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>大爷点菜的需求管理智慧</title><link>http://www.cnitblog.com/shbwf/articles/90998.html</link><dc:creator>51testing</dc:creator><author>51testing</author><pubDate>Mon, 23 Apr 2018 05:52:00 GMT</pubDate><guid>http://www.cnitblog.com/shbwf/articles/90998.html</guid><wfw:comment>http://www.cnitblog.com/shbwf/comments/90998.html</wfw:comment><comments>http://www.cnitblog.com/shbwf/articles/90998.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shbwf/comments/commentRss/90998.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shbwf/services/trackbacks/90998.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"  color:#111010;"="" style="word-wrap: break-word; color: #565656; margin: 0px auto; padding: 0px;"><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;">　　然而,&nbsp;<a target="_self"  color:#111010;"="" style="word-wrap: break-word; color: #565656; margin: 0px auto; padding: 0px;"><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>并不是一个简单的事情，人的需求和想法很容易发生变化，从而导致项目工作会不断返工。这很可能导致成本上升，时间延迟，由此产生团队情绪不稳定和抱怨等连锁的反应。据全球项目管理协会（PMI）统计数字表明，因为需求管理不善而项目失败的概率高达37%。</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;">下面通过一个&#8220;大爷点菜&#8221;的故事看看如何进行需求管理。</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;">【原始需求】</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;">　　服务员：好嘞！</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;">【中途需求变更】</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;">　　服务员：不放肉怎么做啊？</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;">　　<strong "="" style="word-wrap: break-word; margin: 0px auto; padding: 0px;">【需求改动太大，返工成本过高】</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;">　　然而大厨还是一点点挑出来了。</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;">【低估需求变更成本】</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;">　　<strong "="" style="word-wrap: break-word; margin: 0px auto; padding: 0px;">【新需求引入了新的成本】</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;">　　大厨：我怎么知道他要往宫保鸡丁里放腐竹。</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;">【奇葩需求】</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;">　　服务员：好好好，您稍等，您稍等&#8230;&#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;">　【奇葩需求也得实现】</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;">　　服务员：茄丁抄好了扔里边不就行了吗&#8221;</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　大厨：那TM还能叫菜吗？哪个系的？</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;">　<strong "="" style="word-wrap: break-word; margin: 0px auto; padding: 0px;">　【最终决战】</strong></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;">　　大爷：咦，我上次吃的不是这个味啊？</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;">如何应对顾客的&#8220;奇葩&#8221;需求</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;">　　其实段子里的大爷对应客户的角色，服务员对应项目经理的角色，而大厨对应项目成员的角色。项目管理中很大一部分工作都在&#8220;为客人点菜&#8221;，也就是需求管理。需求管理分为两个方面：需求从哪里来，需求到哪里去了。</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.需求的实现管理：如何做好优先级排期，临时需求怎么处理等。</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;">　　服务员：好的，我们这有凉拌腐竹，上菜速度快，可以先给您先上一份。</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;">　　<strong "="" style="word-wrap: break-word; margin: 0px auto; padding: 0px;">需求管理的来源和实现</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;">　　明确了客户的真实需求后，接下来就是要考虑需求实现了。我们已经了解到了客户的需求：客户想吃腐竹，带茄丁不带肉的宫保鸡丁，那么如何操作，先做哪个？</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　关于需求优先级划分以及如何实现需求，我们可以用一个经典的需求模型来解决：卡诺模型（Kano model）。卡诺模型把需求分为三类：</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　&#183; 基本型需求：基本需求往往属于此类。对于这类需求，必须满足，可以做的按部就班，少量创新。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　&#183;&nbsp;期望型需求：用户、竞争对手和自身都需要关注的需求，平时工作中需要重点关注的需求。</div><div style="word-wrap: break-word; margin: 0px auto; padding: 0px; font-family: 微软雅黑; line-height: 24px; color: #3e3e3e; font-size: 14px;">　　&#183;&nbsp;兴奋型需求：用户自身都没有想到的需求，满足此类需求很容易引起产品的爆点。</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=86298" target="_blank"  color:#111010;text-decoration-line:none;"="" style="word-wrap: break-word; color: #565656; margin: 0px auto; padding: 0px;"><img src="http://www.51testing.com/attachments/2018/04/14982672_201804201121401aaJd.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;">　　实现优先级上，首先满足基本需求，其次是期望型需求，然后根据用户情况，调整兴奋型需求的优先级。</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; color: #666666; font-family: 宋体, Arial; font-size: 16px;"><p font-size:14px;white-space:normal;background-color:#ffffff;"="" style="word-wrap: break-word; margin-bottom: 10px; padding-top: 0px; padding-bottom: 0px; color: #555555;">&nbsp; &nbsp; &nbsp; 如果有任何疑问，欢迎添加qq群测试入门大神 755431660 共同学习~</p><div font-size:14px;white-space:normal;background-color:#ffffff;"="" style="word-wrap: break-word; color: #555555;"><img src="https://www.testwo.com/attachments/13977/1524214426280.png" alt="" style="word-wrap: break-word; border: 0px; height: auto; max-width: 100%; vertical-align: middle;" /></div><div></div></div><img src ="http://www.cnitblog.com/shbwf/aggbug/90998.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-23 13:52 <a href="http://www.cnitblog.com/shbwf/articles/90998.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>软件测试人员在工作中如何运用Linux</title><link>http://www.cnitblog.com/shbwf/articles/90997.html</link><dc:creator>51testing</dc:creator><author>51testing</author><pubDate>Mon, 23 Apr 2018 05:45:00 GMT</pubDate><guid>http://www.cnitblog.com/shbwf/articles/90997.html</guid><wfw:comment>http://www.cnitblog.com/shbwf/comments/90997.html</wfw:comment><comments>http://www.cnitblog.com/shbwf/articles/90997.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shbwf/comments/commentRss/90997.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shbwf/services/trackbacks/90997.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;">从事过软件测试的小伙们就会明白会使用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;">对于软件测试人员来说，不需要你多么熟练使用Linux所有命令，也不需要你对Linux系统完全了解，你只需要学会一些常用的基本命令，这些命令足够支撑你去查看日志，定位bug，修改文件，搭建环境就完全OK了。对于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;"><strong style="word-wrap: break-word; margin: 0px; padding: 0px; list-style: none; box-sizing: border-box;">我们是如何在我们的工作中使用Linux呢？</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;">相信很多人都知道，之所以我们会用到Linux，是因为我们的产品将Linux系统作为我们的服务器使用，当我们去测试产品时需要在Linux上部署产品，若产品某个功能出现错误，我们需要去排查出错的原因，出于这二个目的，我们就需要掌握一定的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;">&#8203;<br style="word-wrap: break-word;" /></p><img alt="null" src="http://d.ifengimg.com/q100/img1.ugc.ifeng.com/newugc/20180423/11/wemedia/3f2feae84d5afecbb508481a9680b3bcf152b944_size21_w550_h367.jpg" data-ke-src="http://d.ifengimg.com/q100/img1.ugc.ifeng.com/newugc/20180423/11/wemedia/3f2feae84d5afecbb508481a9680b3bcf152b944_size21_w550_h367.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;"><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;">01</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;">根据每个公司的情况，软件测试人员需要自己在Linux系统上部署测试环境，也有公司是开发人员帮忙在Linux服务器上部署，不需要测试人员自己部署，而现在大部分开始做自动化部署了，就更不需要软件测试人员手工部署，直接在Jenkins上自动部署就完成了，然后打开web界面，新部署上的去的代码就生效了。</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;"><br style="word-wrap: break-word;" /></p><img alt="null" src="http://d.ifengimg.com/q100/img1.ugc.ifeng.com/newugc/20180423/11/wemedia/7ced98934ac9078cc02e65c7844763710fee50e5_size47_w550_h530.jpg" data-ke-src="http://d.ifengimg.com/q100/img1.ugc.ifeng.com/newugc/20180423/11/wemedia/7ced98934ac9078cc02e65c7844763710fee50e5_size47_w550_h530.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;">02</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;">对软件测试人员来说，查看日志恐怕是软件测试人员运用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;">查看日志主要是用于定位bug，或者查看程序执行情况（什么时候调用哪个服务，什么时候在哪个表中写数据，什么时候发起请求等都可以在日志中查询到）。</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;">（1）vi</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;">vi/vim&nbsp;原本是指修改文件，同时可以使用vi&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;">（2）less</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;">less命令是王豆豆查看日志最常用的命令。</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;">用法：less 日志文件名&nbsp;--分页显示文件的内容</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;">空格或f 向下翻页</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;">enter键 换行&nbsp;</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;">q或Q 退出</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;">pgup/pgdn 向上/向下一页一页切换</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;">方向键 向上/向下一行一行切换</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;">先输入/，然后在/后面输入要查找的指定字符串，回车</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;">--》显示的一个指定字符串是从当前位置查找到的第一个，可以按&#8220;n&#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;">（3）cat</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;">查看文件内容比较少的文件，经常用cat命令。</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）tail</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;">tail命令的意义是显示文件最后的几行，默认显示十行。</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;">当执行出错时，我们一般都会查看日志，但如果日志过多，查找很麻烦，这时王豆豆一般会使用tail命令动态显示日志。</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;">tail -400f XX.log&nbsp;--&gt;动态就是显示日志文件新增的内容</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;">（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;">在文件里面搜索，先用less命令查看文件，然后输入指定字符串进行查找。</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;">在文件外面搜索特定的字符串，可以用grep命令查找</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;">=》 grep 'ERROR' test.log</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;">查找test.log文件中包含'ERROR'的行，并且显示出来</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;">=》 grep 'ERROR' test.log | wc -l</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;">返回test.log文件中包含'ERROR'行的数目</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;">根据查看日志定位到软件出错时的日志，通过分析日志来解决bug，当然这有可能也定位不出bug， 查看日志是定位bug的手段之一。</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;">03</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><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;">vi 命令前面有讲过这个命令是找开文件，在我们需要修改文件时，就需要使用vi/vim其意为在vim编辑器中打开文件，达到可以编辑文件的目的。</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;">vi 命令除了可以修改文件 ，还可以作为新增文件的命令。</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;">=》vi 不存在的文件名&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;">=》vi 存在的文件名 ---》表示可以修改该文件</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;">vim编辑器有三种模式：</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;">使用vi命令进入的那个模式就是一般模式</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;">在一般模式下输入：或/ 即进入了命令模式</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;">在一般模式下按I,i,A,a,O,o,R 即进入了编辑模式</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;">在编辑模式下会提示INSERT REPLACE字样</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;">从命令模式或者编辑模式切换到一般模式，按ESC</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;">通过vi命令找开文件，初始状态为一般模式，如果要修改文件，需要切换到编辑模式。</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;">在一般模式时通过按I,i,A,a,O,o,R 都可以进入到编辑模式，使用哪一个都可以，唯一的区别就是插入的光标所在位置不同，王豆豆一般使用i/I，然后通过移动光标到达目标位置进行修改，所以不用记那么多，记住一个就好，是不是很聪明？</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;">修改的操作就和我们编辑doc文件大致差不多，其他复杂的命令能记住就记住，记不住也不影响我们修改文件，唯一的区别是修改的效率快慢。</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;">修改文件之后，需要保存修改的内容，这样才算修改成功。</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;"><br style="word-wrap: break-word;" /></p><img alt="null" src="http://d.ifengimg.com/q100/img1.ugc.ifeng.com/newugc/20180423/11/wemedia/1af73d45117eb69963a454b4bf9cd4bc328df548_size6_w419_h293.png" data-ke-src="http://d.ifengimg.com/q100/img1.ugc.ifeng.com/newugc/20180423/11/wemedia/1af73d45117eb69963a454b4bf9cd4bc328df548_size6_w419_h293.png" 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;">根据上面的使用场景来看是不是觉得掌握Linux命令非常的简单，真正需要你记的也不是很多，能记住常用的命令就完全足够我们使用了，其他的命令就随着我们在实际使用时再查再记，也是OK的。</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 共同学习~<br style="word-wrap: break-word;" />&#8203;<img src="http://blog.chinaunix.net/attachment/201804/23/29734443_1524455662Z2bQ.png" data-ke-src="/attachment/201804/23/29734443_1524455662Z2bQ.png" width="402" height="381" alt="" style="word-wrap: break-word; border: 0px;" />&#8203;</p><div></div><img src ="http://www.cnitblog.com/shbwf/aggbug/90997.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-23 13:45 <a href="http://www.cnitblog.com/shbwf/articles/90997.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>换过很多工作，却依然无法在科技行业过好一生</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>记录一次壮烈牺牲的阿里巴巴面试</title><link>http://www.cnitblog.com/shbwf/articles/90887.html</link><dc:creator>51testing</dc:creator><author>51testing</author><pubDate>Tue, 27 Feb 2018 03:15:00 GMT</pubDate><guid>http://www.cnitblog.com/shbwf/articles/90887.html</guid><wfw:comment>http://www.cnitblog.com/shbwf/comments/90887.html</wfw:comment><comments>http://www.cnitblog.com/shbwf/articles/90887.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shbwf/comments/commentRss/90887.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shbwf/services/trackbacks/90887.html</trackback:ping><description><![CDATA[<span style="font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 16px;">　　本文来源：</span><span style="font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 16px;">http://www.51testing.com/html/57/n-3724657.html</span><span style="font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 16px;">&#8203;</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;">　　</span><strong style="word-wrap: break-word; font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 16px;">前言</strong><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;">　　今天本是一个阳光明媚，鸟语花香的日子。于是我决定在逛街中感受春日的阳光~结果晚上七点的时候，蚂蚁金服后端大佬来了电话，要进行一轮的技术面试。我一脸黑人问号？？？现在的面试都流行突袭吗？</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;">　　于是我的第一次面试之旅，就此壮烈的展开。</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;">　　</span><strong style="word-wrap: break-word; font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 16px;">自我介绍</strong><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;">　　首先呢，大佬让我用两分钟自我介绍。我本以为自己能滔滔不绝，将对方视作相亲对象般全方位介绍自己。结果不到半分钟，我就介绍完了==。</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;">　　五秒钟的沉默后，大佬嗯了一声。</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;">　　感觉自己的脸上堆满了尴尬而不失礼貌的微笑。</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;">　　</span><strong style="word-wrap: break-word; font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 16px;">最近的项目经历</strong><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;">　　这时大佬问我最近从事了什么项目，研究生阶段都进行了什么样的工作。</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;">　　那必须吹一吹！从JAVA的起源到Spring的发展再到jenkin的使用顺便提一嘴dva+antd，结果半分钟一到，又说不下去了==</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;">　　大佬很有耐心的听我说了一堆语无伦次的话，开始进入正题。</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;">　　</span><strong style="word-wrap: break-word; font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 16px;">Spring</strong><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;">　　大佬：我看你用过这个Spring啊，你来聊聊为什么我们要使用Spring呢？</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;">　　我：（因为大家都说好啊）首先呢，spring是一个庞大的框架，它封装了很多成熟的功能能够让我们无需重复造轮子。其次呢，它使用IOC进行依赖管理，我们就不用自己初始化实例啦。</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;">　　大佬：（我就知道你会说IOC啦）那你解释一下IOC吧</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;">　　我：IOC就是依赖控制转化，利用JAVA的反射机制，将实例的初始化交给Spring。Spring可以通过配置文件管理实例。</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;">　　大佬：那我们可以直接使用工厂模式呀。工厂模式也可以管理实例的初始化呀，为什么一定要使用Spring呢？</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;">　　我：啊........因为.......方便？（仿佛看到大佬凝固的表情，为了不那么尴尬，我决定转移话题）。而且spring的IOC是单例模式呢。</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;">　　大佬：默认的是实现是单例模式吗？</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;">　　我：对的。</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;">　　这里查了一下为什么不用工厂模式而使用IOC。其实本质上还是因为IOC是通过反射机制来实现的。当我们的需求出现变动时，工厂模式会需要进行相应的变化。但是IOC的反射机制允许我们不重新编译代码，因为它的对象都是动态生成的。</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;">　</span><strong style="word-wrap: break-word; font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 16px;">　数据库</strong><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;">　　大佬：你使用过哪些数据库呀？</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;">　　我：mysql还有sqlight。（被遗忘的mongodb在角落里无声哭泣）</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;">　　大佬：那你使用的ORM框架除了hibernate还有哪些，比如IBatis？</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;">　　我：我用过MyBatis</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;">　　大佬：哦，那你能讲一下你对两个框架使用后的感受吗？</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;">　　我：当时使用Mybaits的时候，也有去社区了解了一下两个框架的口碑，发现大家的战队都坚定而对立。对Hibernate的不满通常是因为它在复杂关联中往往会带来严重的性能问题，也就是N+1的问题。但是它是面向对象支持的最好的框架了。而Mybatis则相对而言比较易于使用，只需要会SQL语句就行了。但是也意味着会破坏一些面向对象的规则。</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;">　　大佬：（似乎有点认可）那你了解数据库的事务吗？能讲一下数据库的事务级别吗？</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;">　　我：（忘得一干二净）emmm不好意思我记不太清楚了。</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;">　　大佬：那你还记得数据库的加锁吗？比如乐观锁，悲观锁？</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;">　　我：（求您别问了T T）</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;">　　大佬：（锲而不舍）那我现在假设有一张用户表，你也知道，正常的表只能存放大概一千万或是两千万左右的数据。但是阿里巴巴有上亿的用户？你会怎么存储呢？</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;">　　我：可以纵向分割与横向分割。</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;">　　大佬：那你觉得这里应该纵向还是横向呢？</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;">　　我：纵向（载入史册的嘴瓢）</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;">　　大佬：（很有耐心）可是这样我的数据库还是放不下啊</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;">　　我：（仿佛突然睡醒）应该是横向分割，把表拆分成多个表然后分布式存储</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;">　　大佬：那你觉得我们怎样分割比较合适呢？</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;">　　我：（还能再问？）可以根据地域，但是根据用户分布的情况来说，还是会有某些地域访问稠密而有些地域比较稀疏的问题。难道按照用户等级？</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;">　　大佬：不，用户等级会变动，不合适。你这个阶段暂时没有考虑这个问题</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;">　　我：（谢谢您的台阶啊！）</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;">　</span><strong style="word-wrap: break-word; font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 16px;">　Linux</strong><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;">　　大佬：你们服务器用的是什么操作系统啊？</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;">　　我：（呀，送命题）我们用的是阿里云上的centos系统</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;">　　大佬：那你对linux熟练吗？</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;">　　我：不是很熟悉，仅仅是入门，能够敲一点指令。</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;">　　大佬：好，那你知道库函数和内核调用吗？</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;">　　我：内核调用是指进入内核态然后执行指令然后再回到用户态吗？</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;">　　大佬：对</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;">　　我：我知道的大概就这么多了，只了解一些概念上的内容。（凉凉送给自己）</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;">　　大佬：那你知道如何查看进程吗？</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;">　　我：啊...记不得了，我一般都查一下指令</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;">　　（于是大佬果断放弃了其它linux问题）</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;">　　</span><strong style="word-wrap: break-word; font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 16px;">JVM</strong><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;">　　大佬：你了解JAVA虚拟机吗？能解释一下底层的模块吗？</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;">　　我：（如果你通知我明天面试，我就了解了&gt;&lt;）不好意思，这一块知识我不熟悉，但是我很愿意去了解（赶紧表忠心啊！）</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;">　　</span><strong style="word-wrap: break-word; font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 16px;">线程</strong><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;">　　大佬：你知道什么是线程安全吗？</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;">　　我：（乌鲁乌鲁说了一堆）就是比如如果同时有两个线程访问同一个变量，那么它们对变量造成的修改所带来的结果可能是不确定的。</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;">　　大佬：那你知道JAVA有什么方法来实现线程安全吗？</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;">　　我：（前几天还翻译了博客，但是一问起来忘得比啥都快）首先是synchronized修饰词，然后JAVA还自己实现了一些封装好的类比如LatchDown，Atomic系列(????????后来一查是CountDownLatch!还有大明湖畔的final关键字呢？还有小明湖畔的Lock呢？还有那些实现线程的collections比如ConcurrentHashMap呢？)</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;">　　（大佬果然开启了下一个问题）</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;">　　</span><strong style="word-wrap: break-word; font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 16px;">分布式</strong><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;">　　大佬：你有写过分布式的业务吗？</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;">　　我：我写过一个基于HDFS分布式存储的KVStore，上层使用Hadoop的API实现。</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;">　　大佬：那个是分布式存储，我想了解一下分布式业务？</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;">　　我：（赶紧纠正）那dubbo算吗？（于是介绍了一下自己了解的dubbo）</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;">　　大佬：ok。那你觉得分布式的话会遇到什么问题呢？</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;">　　我：那就是经典的CAP问题了。没有数据库能够同时满足这三个问题</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;">　　大佬：那你能具体解释一下CAP代表什么吗？</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;">　　我：（紧张到一片空白）Consistency？Atomic？P...Persistency？？？</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;">　　大佬：.......</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;">　　CAP: 是指Consistency一致性，Availability可用性，Partition Tolerance分区容忍性</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;">　　</span><strong style="word-wrap: break-word; font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 16px;">设计模式</strong><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;">　　大佬：你了解过设计模式吗？</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;">　　我：了解了解</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;">　　大佬：那你了解过哪些设计模式呢？</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;">　　我：blablabla</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;">　　大佬：那你解释一下指令模式吧</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;">　　我：这个有点像函数式编程的思想。指令模式就是指将各个操作封装为统一的接口，并且提供各个操作的实现类。这样我们只需要面向command接口编程，解除了调用类和指令之间的强耦合。</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;">　　</span><strong style="word-wrap: break-word; font-family: &quot;sans serif&quot;, tahoma, verdana, helvetica; font-size: 16px;">总结</strong><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;">　　最后当然和大佬话一话家常，进行最后的挣扎。总结来说，要想成功进行一次阿里巴巴的面试，你需要了解甚至掌握以下内容：</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;">　　&#183; JAVA语言，尤其是线程</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;">　　&#183; JVM原理</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;">　　&#183; 数据库（事务，加锁，ORM）</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;">　　&#183; Linux</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;">　　&#183; Spring（重点！）</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;">　　&#183; 分布式</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;">　　&#183; 设计模式</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;">　　可以说是涉及范围非常广了。不过其实要想成为一名优秀的后端开发，是需要这些知识面的，只能说自己还是太菜了。要继续深入学习！</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;">　</span><img src ="http://www.cnitblog.com/shbwf/aggbug/90887.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-02-27 11:15 <a href="http://www.cnitblog.com/shbwf/articles/90887.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>进行app性能和安全性测试的重要性</title><link>http://www.cnitblog.com/shbwf/articles/90856.html</link><dc:creator>51testing</dc:creator><author>51testing</author><pubDate>Wed, 17 Jan 2018 07:42:00 GMT</pubDate><guid>http://www.cnitblog.com/shbwf/articles/90856.html</guid><wfw:comment>http://www.cnitblog.com/shbwf/comments/90856.html</wfw:comment><comments>http://www.cnitblog.com/shbwf/articles/90856.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shbwf/comments/commentRss/90856.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shbwf/services/trackbacks/90856.html</trackback:ping><description><![CDATA[如何让用户感觉App运行速度更快呢，这需要对App进行性能测试。限制App性能的因素按照App的系统结构分为App自身和App需要用到的后台服务。<br />　　<strong>测试App连接网络的速度</strong><br />　　一般采用在模拟Mock环境下进行测试，测试方法更多使用的是在App的log中添加时间戳的方式计算时间，例如使用Apple公司提供的iPhone Configuration Utility中Devices的Console查看App的log。<br />　　<strong>测试App在不同网络速度下操作的流程程度</strong><br />　　测试可以使用在App的log中添加时间戳方法验证，也可以通过使用App的直观感受来验证App性能带给用户的体验。<br />　　<strong>测试App对于前台页面渲染的性能</strong><br />　　测试可以使用在App的log中添加时间戳方法验证，也可以通过使用App的直观感受来验证App性能带给用户的体验。特殊的是，当App中使用WebView，测试人员可以快速地刷新当前页面或者在使用WebView的页面间进行切换，来验证App是否有性能问题甚至发生崩溃。<br />　　<strong>测试App操作数据库的性能</strong><br />　　iOS操作系统在设备本地存储App数据时使用的是CoreData或者SQLite数据库;Android操作系统在设备本地存储App数据时使用SQLite数据库。如果操作的数据量很大，便有可能出现App的性能问题，此时App测试就很重要，对数据库操作的功能进行大数据量的测试。测试人员也可以和开发人员一起，遵照Web端数据库优化的一些原则，如数据库启用事务，使用索引，数据的批量操作等优化方法，提高数据库的性能。<br />　　<strong>测试App的会话session是否有过期设置</strong><br />　　对于App的会话session是否有过期设置的测试，可以在App运行中切换到别的App或者桌面一段时间，然后再次进入App，看App是否需要输入密码等验证信息。值得注意的是不同App的合理session过期时间不一样，测试人员需要和产品经理、开发人员等确认之后制定出合理的测试用例。<br />　　<strong>测试App请求中是否包含了明文的用户信息</strong><br />　　包含了明文的信息，如同App中标示用户应该使用UUID或GUID等转码后的信息，而不是直接的用户电话号码或账户信息，当然更不应该明文传送这些信息。测试人员可以使用Apple的iPhone Configuration Utility，Android SDK自带的DDMS，Charles和Fiddler这些工具来监控App发送的请求。<br />　　<strong>测试App的请求是否加密</strong><br />　　一般App请求可以使用HTTP，但是关系到用户敏感信息的请求，需要使用HTTPS等加密传输。<br />　　<strong>测试SQLite数据库的存储是否安全</strong><br />　　测试人员可以通过ADB连接到root的Android蛇别，并使用SQLite来查看具体的数据库保存的信息。显然，把用户实际的登录信息明文存储在数据库文件中是不安全的，最好不要存储，如果必须存储，最好对这些信息加密后再存储。<br />　　<strong>测试App使用WebView的安全性</strong><br />　　由于WebView的请求和在Web端请求数据是一样的，所以任何适用于Web端的攻击方式和漏洞对于WebView来说都是通用的。<br />&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; END<br />&nbsp; &nbsp; &nbsp; &nbsp; 更多关于软件测试方面的文章，请前往51Testing软件测试网。（<span style="background-color: #ffffff;">http://www.51testing.com）</span><img src ="http://www.cnitblog.com/shbwf/aggbug/90856.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-01-17 15:42 <a href="http://www.cnitblog.com/shbwf/articles/90856.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自动化测试框架Cucumber和RobotFramework的实战对比</title><link>http://www.cnitblog.com/shbwf/articles/90810.html</link><dc:creator>51testing</dc:creator><author>51testing</author><pubDate>Tue, 19 Dec 2017 07:40:00 GMT</pubDate><guid>http://www.cnitblog.com/shbwf/articles/90810.html</guid><wfw:comment>http://www.cnitblog.com/shbwf/comments/90810.html</wfw:comment><comments>http://www.cnitblog.com/shbwf/articles/90810.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shbwf/comments/commentRss/90810.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shbwf/services/trackbacks/90810.html</trackback:ping><description><![CDATA[<p style="box-sizing: border-box; margin-top: 40px; padding-top: 0px; padding-bottom: 0px; color: #333333; font-family: 宋体, sans-serif; font-size: 18px;">　　<strong style="box-sizing: border-box;">一、摘要</strong></p><p style="box-sizing: border-box; padding-top: 0px; padding-bottom: 0px; color: #333333; font-family: 宋体, sans-serif; font-size: 18px;">　　自动化测试可以快速自动完成大量测试用例，节约巨大的人工测试成本；同时它需要拥有专业开发技能的人才能完成开发，且需要大量时间进行维护（在需求经常变化的情况下），所以大部分具有很好开发技能的人员不是很愿意编写自动化用例。但由于软件规模的高速增长，人力资源的逐步稀缺，自动化测试已是势在必行。</p><p style="box-sizing: border-box; padding-top: 0px; padding-bottom: 0px; color: #333333; font-family: 宋体, sans-serif; font-size: 18px;">　　对于自动化测试首先需要保证其功能是对客户有价值的和正确可用的。而这一切的基础就是用例要能测试客户的需求，期望，最好能让客户参与到测试用例的开发过程中来或让客户评审测试用例，因此出现了ATDD、BDD等各种理论方法来支撑这一行为。现有很多自动化测试工具可支持ATDD、BDD等，比如Cucumber1、RobotFramework2、SpecFlow3、JBehave4、Fitness5、Concordion6等。其中Cucumber和RobotFramework是最流行的两个框架，但许多人在第一次选择测试框架时因缺乏实践经验而困惑，所以今天为大家分享这两款框架在几个项目上的经验及对比，方便大家在以后的项目上能正确地选择这两款测试框架。</p><p style="box-sizing: border-box; padding-top: 0px; padding-bottom: 0px; color: #333333; font-family: 宋体, sans-serif; font-size: 18px;">　　首先看一下这两款工具的简单对比。</p><p style="box-sizing: border-box; padding-top: 0px; padding-bottom: 0px; color: #333333; font-family: 宋体, sans-serif; font-size: 18px;">　　<img src="http://dingyue.nosdn.127.net/Gtvn99vtJ09ZRVp0TGPcO2nVKd=7iWzneWf5h=v0lOyPm1513575443837.jpeg" style="box-sizing: border-box; border: 0px; vertical-align: top; max-width: 100%; margin: 20px 0px;"  alt="" /></p><p style="box-sizing: border-box; padding-top: 0px; padding-bottom: 0px; color: #333333; font-family: 宋体, sans-serif; font-size: 18px;">　　<strong style="box-sizing: border-box;">二、案例</strong></p><p style="box-sizing: border-box; padding-top: 0px; padding-bottom: 0px; color: #333333; font-family: 宋体, sans-serif; font-size: 18px;">　　<strong style="box-sizing: border-box;">Cucumber案例1：某社交网络系统</strong></p><p style="box-sizing: border-box; padding-top: 0px; padding-bottom: 0px; color: #333333; font-family: 宋体, sans-serif; font-size: 18px;">　　项目时间：4年前</p><p style="box-sizing: border-box; padding-top: 0px; padding-bottom: 0px; color: #333333; font-family: 宋体, sans-serif; font-size: 18px;">　　项目背景：系统的主要功能是帮助用户能通过一个手机应用同时与Facebook，Twitter，Flickr等社交网络更新信息，并能一次性把自己更新的信息同步到这些社交网络。其中它有一个服务器端，用于和各个社交网络通信，一个Web应用和一个手机应用提供给最终客户使用。它的技术栈主要是JavaSpring，Android，iOS，MySQL等。</p><p style="box-sizing: border-box; padding-top: 0px; padding-bottom: 0px; color: #333333; font-family: 宋体, sans-serif; font-size: 18px;">　　被测系统构架图：</p><p style="box-sizing: border-box; padding-top: 0px; padding-bottom: 0px; color: #333333; font-family: 宋体, sans-serif; font-size: 18px;">　　<img src="http://dingyue.nosdn.127.net/SPGjpE39fTUGD2hU5AFWbb45jrOGM0GO=W5=MzDweU0Gi1513575466421.jpeg" style="box-sizing: border-box; border: 0px; vertical-align: top; max-width: 100%; margin: 20px 0px;"  alt="" /></p><p style="box-sizing: border-box; padding-top: 0px; padding-bottom: 0px; color: #333333; font-family: 宋体, sans-serif; font-size: 18px;">　　由于这个项目是中国团队和法国团队一起合作开发，当时法国团队的架构师提出选用Cucumber作为自动化测试框架来测试这个系统，项目需要支持多国语言，且需要同时做服务器和手机端的功能测试，甚至在一个测试场景中既包含服务器测试部分，又含手机端测试部分，而使用基于Cucumber的测试系统很好的满足了我们的需求，其中手机端的功能测试用的是Calabash8。Calabash是一个手机功能测试系统，它使用Cucumber将Android的测试框架Robotium9和iOS的测试框架Frank10封装了起来，使得Cucumber的Step可以调用Robotium和Frank进行测试。这样就可以实现一个测试场景里面既包含手机端测试，又包含服务器端测试，比如：</p><p style="box-sizing: border-box; padding-top: 0px; padding-bottom: 0px; color: #333333; font-family: 宋体, sans-serif; font-size: 18px;">　　I"submit"updateto"Facebook"with"Iamhappytoday"on"Android"</p><p style="box-sizing: border-box; padding-top: 0px; padding-bottom: 0px; color: #333333; font-family: 宋体, sans-serif; font-size: 18px;">　　I"get"updateon"Facebook&#8221;with"Iamhappytoday"on"Server"</p><p style="box-sizing: border-box; padding-top: 0px; padding-bottom: 0px; color: #333333; font-family: 宋体, sans-serif; font-size: 18px;">　　实现方式是在Calabash中使用Ruby实现一层胶水代码，和服务器测试功能测试代码连结起来，并根据不同的Step调用不同的测试驱动层代码从而实现同一个测试用例同时包含服务器端和手机端测试。虽然这样的测试用例不会很多，但它却有效的表达了端到端的系统集成测试，让测试集合更加丰满。</p><p style="box-sizing: border-box; padding-top: 0px; padding-bottom: 0px; color: #333333; font-family: 宋体, sans-serif; font-size: 18px;">　　如果重新选择测试工具，我还是会选择Cucumber和Calabash，主要原因是它们可以方便的统一做手机和服务器的功能测试。虽然RobotFramework配合Selenium也能实现类似的功能，但是需要使用RobotFramework对Selenium重新进行封装，没有Calabash方便易用。</p><p style="box-sizing: border-box; padding-top: 0px; padding-bottom: 0px; color: #333333; font-family: 宋体, sans-serif; font-size: 18px;">　　Cucumber案例2：某大型养老保险系统</p><p style="box-sizing: border-box; padding-top: 0px; padding-bottom: 0px; color: #333333; font-family: 宋体, sans-serif; font-size: 18px;">　　项目时间：2年前</p><p style="box-sizing: border-box; padding-top: 0px; padding-bottom: 0px; color: #333333; font-family: 宋体, sans-serif; font-size: 18px;">　　项目背景，主要功能是提供一个Web系统让用户可以购买养老保险，管理养老保险账户里面的资金等业务。主要的技术栈JavaSpring,JSP,AngularJS,OracleDB等。</p><p style="box-sizing: border-box; padding-top: 0px; padding-bottom: 0px; color: #333333; font-family: 宋体, sans-serif; font-size: 18px;">　　被测系统构架图：</p><p style="box-sizing: border-box; padding-top: 0px; padding-bottom: 0px; color: #333333; font-family: 宋体, sans-serif; font-size: 18px;">　　<img src="http://dingyue.nosdn.127.net/e1geNdR2NV=KMA0rDGCeW8btsTJy2rgIMfQj8ZDPkespG1513575489551.jpeg" style="box-sizing: border-box; border: 0px; vertical-align: top; max-width: 100%; margin: 20px 0px;"  alt="" /></p><p style="box-sizing: border-box; padding-top: 0px; padding-bottom: 0px; color: #333333; font-family: 宋体, sans-serif; font-size: 18px;">　　基于安全和开发成本原因，比如重用已有的服务器和容器环境，重用开发资源，所以公司绝大部分项目只用Java语言进行后台服务器端开发，导致公司大部分人员只熟悉Java语言，因此测试框架选择了CucumberJava版11。</p><p style="box-sizing: border-box; padding-top: 0px; padding-bottom: 0px; color: #333333; font-family: 宋体, sans-serif; font-size: 18px;">　　如果重新选择工具，由于技术栈和成本的原因，我仍然会选择CucumberJava版，不会考虑RobotFramework。因为对于这种JavaSpring商业应用项目，我不想引入一个Jython去加深项目的技术栈，只要能充分利用当前团队已有的技术栈就可以了，并且还更容易说服开发人员帮忙实现和维护自动化测试，从而促使整个团队都能对自动化测试负责。</p><p style="box-sizing: border-box; padding-top: 0px; padding-bottom: 0px; color: #333333; font-family: 宋体, sans-serif; font-size: 18px;">　　RobotFramework案例1：某AC项目</p><p style="box-sizing: border-box; padding-top: 0px; padding-bottom: 0px; color: #333333; font-family: 宋体, sans-serif; font-size: 18px;">　　项目时间：3年前</p><p style="box-sizing: border-box; padding-top: 0px; padding-bottom: 0px; color: #333333; font-family: 宋体, sans-serif; font-size: 18px;">　　项目背景：该项目是WIFI系统的AC（AccessController接入控制器）部分，包含WIFI接入的认证、计费等功能。它也提供了配置界面，包括Web和命令行两种。AP（AccessPoint接入点）是与该系统交互的外部系统。通常来说AP会有很多个，放置在不同的空间区域，提供WIFI接入服务，AP和AC之间使用有线链路连接。</p><p style="box-sizing: border-box; padding-top: 0px; padding-bottom: 0px; color: #333333; font-family: 宋体, sans-serif; font-size: 18px;">　　被测系统构架图：</p><p style="box-sizing: border-box; padding-top: 0px; padding-bottom: 0px; color: #333333; font-family: 宋体, sans-serif; font-size: 18px;">　　<img src="http://dingyue.nosdn.127.net/dBYXvOS0zTYlvKsOOutDLCjUxllHKnM5k2tUrextYAbPa1513575503983.jpeg" style="box-sizing: border-box; border: 0px; vertical-align: top; max-width: 100%; margin: 20px 0px;"  alt="" /></p><p style="box-sizing: border-box; padding-top: 0px; padding-bottom: 0px; color: #333333; font-family: 宋体, sans-serif; font-size: 18px;">　　该系统作为一个嵌入式设备，从用户的角度来看主要包括两部分功能。第一部分是操作管理员在命令行或者Web界面上进行功能配置，第二部分是AP与系统进行交互，完成网络接入等功能。</p><p style="box-sizing: border-box; padding-top: 0px; padding-bottom: 0px; color: #333333; font-family: 宋体, sans-serif; font-size: 18px;">　　明确了被测对象和场景后，就需要寻找相应的测试库来完成这些用户（即包括人，也包AP）与系统之间的交互。对于Web来说，有成熟的Selenium可以使用，Selenium提供了多种语言的API，从这个角度来看RobotFramework和Cucumber都可以选择。对于命令行操作而言，可以选用RoboFramework的SSH库来完成，当然在这一点上其他的语言也有相应的类库。要想完成上述这个系统的测试，还需要完成报文的收发及编解码工作，Python的类库Scapy12能够很好地完成这部分工作，只需要在此之上做少量定制化开发，并将其封装成为RobotFramework关键字即可。经过上面的分析可以看到，使用基于Python的RobotFramework能够很好地处理报文相关的逻辑，加上团队在Python上有比较好的技术储备，因此RobotFramework成了最终的选择。</p><p style="box-sizing: border-box; padding-top: 0px; padding-bottom: 0px; color: #333333; font-family: 宋体, sans-serif; font-size: 18px;">　　如果重新选择，我还是会选择RobotFramework，原因是其他平台上找不到类似Scapy这样好用的测试库。</p><p style="box-sizing: border-box; padding-top: 0px; padding-bottom: 0px; color: #333333; font-family: 宋体, sans-serif; font-size: 18px;">　　<strong style="box-sizing: border-box;">RobotFramework案例2：某移动广告管理平台</strong></p><p style="box-sizing: border-box; padding-top: 0px; padding-bottom: 0px; color: #333333; font-family: 宋体, sans-serif; font-size: 18px;">　　项目时间：1年前</p><p style="box-sizing: border-box; padding-top: 0px; padding-bottom: 0px; color: #333333; font-family: 宋体, sans-serif; font-size: 18px;">　　项目背景：该项目是一个Web系统，用于广告投放、查询、显示等功能。</p><p style="box-sizing: border-box; padding-top: 0px; padding-bottom: 0px; color: #333333; font-family: 宋体, sans-serif; font-size: 18px;">　　测试思路是做端到端的测试，覆盖从广告投放、广告查询及广告显示等一系列功能。其中涉及到的测试库主要是Selenium，这点上与案例1类似。不同之处在于这个项目中参与自动化用例编写的主要是从不编写代码的测试人员，而RobotFramework有一个专用的用例编写环境&#8212;RIDE，其中用例编辑窗口如下图：</p><p style="box-sizing: border-box; padding-top: 0px; padding-bottom: 0px; color: #333333; font-family: 宋体, sans-serif; font-size: 18px;">　　<img src="http://dingyue.nosdn.127.net/brYglk8S19AGF=FbjwkQRCM2dGCGW4tXfwCHg9AgnhzmQ1513575514696.jpeg" style="box-sizing: border-box; border: 0px; vertical-align: top; max-width: 100%; margin: 20px 0px;"  alt="" /></p><p style="box-sizing: border-box; padding-top: 0px; padding-bottom: 0px; color: #333333; font-family: 宋体, sans-serif; font-size: 18px;">　　虽然它只是简单地把使用TAB符号隔开的一系列纯文本变成了可视的表格，但对于这些测试人员来说，他们以前工作的平台就是Excel中，所以很容易切换过来。再加上它提供的一些高亮、抽取关键字等特性，使得测试人员可以比较专注于测试用例的设计、编写和优化，而不用关心格式等细节问题。</p><p style="box-sizing: border-box; padding-top: 0px; padding-bottom: 0px; color: #333333; font-family: 宋体, sans-serif; font-size: 18px;">　　在RIDE中导入相关测试库之后，可以通过F5快捷键查看所有关键字的文档，如下图所示：</p><p style="box-sizing: border-box; padding-top: 0px; padding-bottom: 0px; color: #333333; font-family: 宋体, sans-serif; font-size: 18px;">　　<img src="http://dingyue.nosdn.127.net/c6q1MgaM1HaK8PfL9opOm7=H3aHaTPYDPBaYY8oBzFdLx1513575525681.jpeg" style="box-sizing: border-box; border: 0px; vertical-align: top; max-width: 100%; margin: 20px 0px;"  alt="" /></p><p style="box-sizing: border-box; padding-top: 0px; padding-bottom: 0px; color: #333333; font-family: 宋体, sans-serif; font-size: 18px;">　　下载测试工具，欢迎前往51Testing软件测试网。（http://www.51testing.com）</p><img src ="http://www.cnitblog.com/shbwf/aggbug/90810.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> 2017-12-19 15:40 <a href="http://www.cnitblog.com/shbwf/articles/90810.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>LoadRunner提高篇——结果分析实践</title><link>http://www.cnitblog.com/shbwf/articles/90711.html</link><dc:creator>51testing</dc:creator><author>51testing</author><pubDate>Fri, 14 Jul 2017 08:45:00 GMT</pubDate><guid>http://www.cnitblog.com/shbwf/articles/90711.html</guid><wfw:comment>http://www.cnitblog.com/shbwf/comments/90711.html</wfw:comment><comments>http://www.cnitblog.com/shbwf/articles/90711.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shbwf/comments/commentRss/90711.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shbwf/services/trackbacks/90711.html</trackback:ping><description><![CDATA[<strong>　分析图合并&nbsp;&nbsp;</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br /><strong>　　一、分析图合并原理</strong><br />　　选择view-&gt;merge graphs，弹出如图1所示对话框<br /><div align="center"><a href="http://www.51testing.com/batch.download.php?aid=70877" target="_blank"><img src="http://www.51testing.com/attachments/2017/07/15201284_201707131121141xjQ6.png" border="0"  alt="" /></a></div><div align="center">　　图1（设置合并图）</div>　　1、选择要合并的图。选择一个要与当前活动图合并的图，注意这里只能选择X轴度量单位相同的图。<br />　　2、选择合并类型。<br />　　1）叠加：查看共用同一X轴的两个图的内容。合并图左侧的Y轴显示当前图的Y轴值，右边的Y轴显示合并进来的图的Y轴值，如图2所示<br /><a href="http://www.51testing.com/batch.download.php?aid=70878" target="_blank"><img src="http://www.51testing.com/attachments/2017/07/15201284_201707131121561jn6n.png" border="0"  alt="" /></a><br /><div align="center">　　图2（叠加合并分析图）</div>　　2）平铺：在平铺布局查看，共用同一个X轴，合并进来的图显示在当前图的上方，如图3所示<br /><a href="http://www.51testing.com/batch.download.php?aid=70879" target="_blank"><img src="http://www.51testing.com/attachments/2017/07/15201284_201707131122141qYTN.png" border="0"  alt="" /></a><br /><div align="center">　　图3（平铺合并分析图）</div>　　3）关联：合并后当前活动图的Y轴变为合并图的X轴，被合并图的Y轴作为合并图的Y轴，如图4所示<br /><a href="http://www.51testing.com/batch.download.php?aid=70880" target="_blank"><img src="http://www.51testing.com/attachments/2017/07/15201284_201707131122291MXcb.png" border="0"  alt="" /></a><br /><div align="center">　　图4（关联合并分析图）</div>　　3、合并图标题：设置视图合并后的标题。<br />　　<strong>二、实例讲解</strong><br />　　下面通过一个实例来分析如何对数据图进行合并分析，该图是将 running vusers,hits per second,throughput图，3个图进行叠加合并图分析，如图5所示<br /><a href="http://www.51testing.com/batch.download.php?aid=70881" target="_blank"><img src="http://www.51testing.com/attachments/2017/07/15201284_201707131122451UpSW.png" border="0"  alt="" /></a><br /><div align="center">　　图5（合并后的分析图）</div>　　　　可以发现running vusers和hits per second图几乎看不到。在实际<a target="_self"><u><strong>测试</strong></u></a>过程中可能经常遇到这样的情况，这是因为Y轴的粒度太小影响分析，有时X轴的粒度太小也会影响分析，这时就要调整X轴的粒度或Y轴的显示比例，这里只需调整Y轴的显示比例即可，将running vusers和hits per second图的Y轴放大10000倍，通过view-&gt;configure measuerments设置来更改，如图6所示，更改后，如图7所示<br /><div align="center"><a href="http://www.51testing.com/batch.download.php?aid=70882" target="_blank"><img src="http://www.51testing.com/attachments/2017/07/15201284_201707131123131MAa7.png" border="0"  alt="" /></a></div><div align="center">　　图6（调整Y轴显示比例）</div><a href="http://www.51testing.com/batch.download.php?aid=70883" target="_blank"><img src="http://www.51testing.com/attachments/2017/07/15201284_201707131123251ufqo.png" border="0"  alt="" /></a><br /><div align="center">　　图7（调理Y轴显示比例后的合并分析图）</div>　　　　有时可对分析图进行筛选设置，但在该实例中可不用进行这方面的设置。下面是分析合并图常用的3个步骤，合并完成后要对这个合并图及这3个图的趋势进行分析，主要是分析这3种图的趋势是否正确。<br />　　1）找到影响几个图变化趋势的决定因子。在这里先抽出running vusers图来分析，因为其他两个图的变化 是与vuser用户有关；<br />　　2）应该了解合并图中其他的图与该决定因子的关系。这里hits per second和throughput与running vusers图是成正比的关系，也就是说，随着vuser用户的增加，每秒点击数和吞吐量都增加；<br />　　3）分析决定因子图的变化趋势。running vusers图的变化趋势是先加载vuser用户，当全部加载完成后，所有的vuser用户会运行一段时间，再开始释放vuser用户；<br />　　　　最后，通过各图之间的关系来判断其他的这些图的变化的趋势是否正确。判断hits per second图和throughput图变化趋势，要判断这两个图变化趋势是否与running vusers图变化趋势一致。如果一致，则说明结果分析图是正确的；否则就说明结果是不正确的，如果发现有异常的现象可以再借助其他的分析方法来确定真实的原因。<br /><strong>　　分析图关联&nbsp;</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />　<strong>　一、分析图关联原理</strong><br />　　在当前的分析图中右击选择auto correlate弹出对话框，如图8所示<br /><div align="center"><a href="http://www.51testing.com/batch.download.php?aid=70884" target="_blank"><img src="http://www.51testing.com/attachments/2017/07/15201284_201707131126081NEb7.png" border="0"  alt="" /></a></div>　　图8（关联图时间范围，这里以running vusers图为例）<br />　　1、time range（时间范围）选项卡用来设置分析关联图度量的时间范围<br />　　suggest time rang by 有两种时间范围方式：<br />　　1）trend（趋势）：选择关联度量值变化趋势相对稳定的一段为时间范围<br />　　2）feature（功能）：在关联度量值变化相对稳定的时间内，选择一段大体与整个趋势相似的时间范围<br />　　3）best（最佳）：选择关联度量值发生明显变化趋势的一段时间范围<br />　　也可以手动调整时间范围，具体有两种方式，一种是手动填写 具体的开始和结束时间；另一种是拖动绿色和红色线来指定起止时间，其中绿色线表示起始时间，红色线表示终止时间<br />　　2、correlation optins（自动关联）选项卡可以设置要关联的图、数据间隔和输出选项<br />　　在select graphs for correlation 中选择需要关联的图。在data interval组合框中选择计算关联度量轮询之间的时间间隔，可以设置为自动，也可以自定义。在output组合框中选择显示输出的级别。如图9所示<br /><div align="center"><a href="http://www.51testing.com/batch.download.php?aid=70885" target="_blank"><img src="http://www.51testing.com/attachments/2017/07/15201284_201707131126271j5hM.png" border="0"  alt="" /></a></div><div align="center">　　图9（自动关联选项卡）</div><strong>　　二、实例讲解</strong><br />　　　　分析图关联是通过复杂的统计学方法，精确定位哪些因素对交易响应时间的影响最大，关联并不关注具体的数据，而是关注于参数样本在特定时间范围内的状态、趋势。只有拆线图可以使用auto correlation（除<a target="_self"><u><strong>web</strong></u></a> page diagnostic拆线图外）。<br />　　　　实例：分析&#8216;平均事务响应时间&#8217;与&#8216;正在运行的vuser&#8217;图关联的情况。<br />　　1）平均事务响应时间图为当前活动图，被关联图为&#8216;正在运行的vuser&#8217;图，如图10所示<br /><a href="http://www.51testing.com/batch.download.php?aid=70886" target="_blank"><img src="http://www.51testing.com/attachments/2017/07/15201284_2017071311272812lLN.png" border="0"  alt="" /></a><br /><div align="center">　　图10（初始关联图）</div>　　2）设置过滤条件。自动关联后，会发现很多并不需要的事务也被关联进来了，这时就需要对其进行过滤处理。set filter/group by，如图11所示，这里选择登录事务进行分析。<br /><div align="center"><a href="http://www.51testing.com/batch.download.php?aid=70887" target="_blank"><img src="http://www.51testing.com/attachments/2017/07/15201284_201707131127461IbRD.png" border="0"  alt="" /></a></div><div align="center">　　图11（设置过滤条件）</div>　　3）设置分析关联的时间范围。在过滤后的关联图中右击，选择auto correlation，如图12所示，可以手动设置关联分析的时间范围，但需要注意的是， 在这里要选择波折的地方进行分析，并且不能只选择只有一个波折的时间范围，至少要选择一段有两个以上波折的曲线。如果只选择一个波折，在自动关联后，会发现很多项的关联度都为100。这个分析就没有意义，因为只选择一个波折的时间范围太小。<br /><div align="center"><a href="http://www.51testing.com/batch.download.php?aid=70888" target="_blank"><img src="http://www.51testing.com/attachments/2017/07/15201284_2017071311280715CrP.png" border="0"  alt="" /></a></div><div align="center">　　图12（设置时间范围）</div>　　4）分析关联度。自动关联后会看到下面列出所有关联度的信息，选择关联度最高的来分析。如图13所示<br /><div align="center"><a href="http://www.51testing.com/batch.download.php?aid=70889" target="_blank"><img src="http://www.51testing.com/attachments/2017/07/15201284_201707131128301jGPT.png" border="0"  alt="" /></a></div><div align="center">　　图13（分析关联度）</div>　　到这里整个关联分析就结束了，可以看出auto correlation和merge存在一些共同点，但同时也存在一些区别，具体区别如下：<br />　　a.merge不能选择特定的时间进行切片，所以只有先用merge看整体趋势、分析全局。找到恰当的位置后，再使用auto correlation切片，进一步分析；<br />　　b.merge的输出没有correlation match这个值，即使使用merge的correlate选项也没有correlation match这个值，也就不能衡量两个参数之间的关系。<img src ="http://www.cnitblog.com/shbwf/aggbug/90711.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> 2017-07-14 16:45 <a href="http://www.cnitblog.com/shbwf/articles/90711.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>超实用！性能测试之压力工具</title><link>http://www.cnitblog.com/shbwf/articles/90710.html</link><dc:creator>51testing</dc:creator><author>51testing</author><pubDate>Thu, 13 Jul 2017 07:21:00 GMT</pubDate><guid>http://www.cnitblog.com/shbwf/articles/90710.html</guid><wfw:comment>http://www.cnitblog.com/shbwf/comments/90710.html</wfw:comment><comments>http://www.cnitblog.com/shbwf/articles/90710.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shbwf/comments/commentRss/90710.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shbwf/services/trackbacks/90710.html</trackback:ping><description><![CDATA[想要做<a target="_self"><u><strong>性能测试</strong></u></a>，那必须得先从工具入手，针对目前市场上几款主流的压力工具，介绍一下。<br />　<strong>　商业工具：</strong><br />　<strong>　HP <a target="_self"><u><strong>LoadRunner</strong></u></a>：</strong>这个工具放在第一个说，是因为早些年做性能测试的时候，基本市场上都是使用这个工具。LR工具功能齐全，对于复杂场景的处理能力和对结果数据的分析能力比较不错。但是呢，这个工具安装包就差不多1GB。光安装就要很久，在老的电脑上运行起来还不堪重负。因为是商业软件，是通过不同的协议的license 来购买，但除了一些银行，大型企业买，其余一些基本都是使用65536全协议的破解版本了。<br />　<strong>　开源工具：</strong><br />　　<strong><a target="_self"><u><strong>Jmeter</strong></u></a>：</strong>随着互联网+的飞速发展，这个开源工具是<a target="_self"><u><strong>互联网</strong></u></a>性能测试的最常用工具。基本上取代了loadrunner的地位，随着对JMeter使用的不断深入，我个人越来越倾向于在自己的<a target="_self"><u><strong>工作</strong></u></a>中使用JMeter工具，并且也会不遗余力的向我认识的测试工程师推荐它。<br />　　1、它是开源的，安装及其简单，只需要提前安装JDK，把jmeter文件包解压就可使用。<br />　　2、可以通过各种逻辑控制器的组合来实现比较复杂的测试场景，但这里面也很多测试工程师踩过坑的，因为就算是相同的逻辑控制器，你顺序不一样，产生的场景也是不一样的。<br />　　3、它的脚本修改，对于基本的场景需求主要是通过各个组件来控制，不依赖于编程。对于复杂或者一些特定的场景，可以通过自己编写代码实现其逻辑，这当然也得需要一点代码功底。如果能用的好，基本没有解决不了的场景。<br />　　4、由于它的开源性，目前很多大的公司都是直接拿它的源码进行二次开发，最后整成适合自己公司的测试工具，甚至是测试平台。<br />　<strong>　tcpcopy :</strong>它是一款具有复制在线<a target="_self"><u><strong>server</strong></u></a>流量的工具。这款工具颠覆了以往的测试方法，在互联网+测试中比较火，因为互联网+测试迭代更新快，对于线上真实环境一些较为复杂的场景，在线下的测试场景中很难快速发现问题，或者很难重现问题，这个工具可以复制在线server流量到测试系统中，这样就引入在线的复杂场景到测试系统，从而可以在测试系统中充分暴露在线的问题，帮助用户提前解决在线问题，降低上线失误率或者实现零失误。做的好的，读写接口的都可以直接在线上回放，这也当然得需要成本的，还得架构支持，一般公司都是针对它进行二次开发后，加入个性化元素再使用。<br />　　<strong>Gatling：</strong>开源免费，它是一款基于Scala 开发的高性能服务器<a target="_self"><u><strong>性能测试工具</strong></u></a>，它主要用于对服务器进行负载等测试，并分析和测量服务器的各种性能指标。Gatling主要用于测量基于HTTP的服务器，比如Web应用程序，RESTful服务等。Gatling适用的场景包括：测试需求经常改变，测试脚本需要经常维护；测试环境的客户机性能不强，但又希望发挥硬件的极限性能；能对测试脚本进行很好的版本管理，并通过CI进行持续的性能测试；希望测试结果轻量易读等；喜欢它的原因有好几个：<br />　　1、支持实时生成Html动态轻量报表，从而使报表更易阅读和进行数据分析，打开速度比较快。<br />　　2、 支持DSL脚本，从而使测试脚本更易开发与维护。<br />　　3、 支持Maven，Eclipse，IntelliJ等，以便于开发。<br />　　4、 支持Jenkins，以便于进行持续集成。<br /><p>End.</p><p>如果对软件测试感兴趣，想了解更多的软件测试知识，请大家关注&#8220;51Testing软件测试网&#8221;今日头条号。</p><img src ="http://www.cnitblog.com/shbwf/aggbug/90710.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> 2017-07-13 15:21 <a href="http://www.cnitblog.com/shbwf/articles/90710.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利器丨有了它我再也不用担心各种测试啦！</title><link>http://www.cnitblog.com/shbwf/articles/90707.html</link><dc:creator>51testing</dc:creator><author>51testing</author><pubDate>Wed, 12 Jul 2017 05:51:00 GMT</pubDate><guid>http://www.cnitblog.com/shbwf/articles/90707.html</guid><wfw:comment>http://www.cnitblog.com/shbwf/comments/90707.html</wfw:comment><comments>http://www.cnitblog.com/shbwf/articles/90707.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shbwf/comments/commentRss/90707.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shbwf/services/trackbacks/90707.html</trackback:ping><description><![CDATA[<div><p>是时候告别Junit了！</p><p><strong>一、 青出于蓝而胜于蓝</strong></p><p>TestNG是一款脱胎于JUnit和NUnit的测试框架，借鉴了后者的设计思想，在此基础上又引入了新的功能，比如分组测试、依赖测试、多线程测试等。</p><p>TestNG除了支持单元测试外，还可以用来做集成测试、功能测试、端到端测试等等，而junit只是用来单元测试。</p><p><strong>二、 TestNG优于JUnit的设计详解</strong></p><p><strong>1.分组测试</strong></p><p>分组测试可以很方便让你去指定你需要测试的某一批次的测试用例，我们可以使用@Test注解里的groups属性为某个测试方法指定一个或多个group，示例代码如下</p><p>public class TestExample {</p><p>@Test(groups = "group1")</p><p>public void test1(){</p><p>Assert.assertEquals(1+1,2);</p><p>}</p><p>@Test(groups = "group1")</p><p>public void test2(){</p><p>Assert.assertEquals(1+2,3);</p><p>}</p><p>@Test(groups = "group2")</p><p>public void test3(){</p><p>Assert.assertEquals(1+3,4);</p><p>}</p><p>}</p><p>另外我们还需要建立一个testng.xml文件，去指定要运行的分组测试。</p><p>&lt;!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd" &gt;</p><p>&lt;suite name="My test suite"&gt;</p><p>&lt;test name="testing"&gt;</p><p>&lt;groups&gt;</p><p>&lt;run&gt;</p><p>&lt;include name="group1"/&gt;</p><p>&lt;/run&gt;</p><p>&lt;/groups&gt;</p><p>&lt;classes&gt;</p><p>&lt;class name="com.example.Boot.test.TestExample" /&gt;</p><p>&lt;/classes&gt;</p><p>&lt;/test&gt;</p><p>&lt;/suite&gt;</p><p><strong>2.参数化测试</strong></p><p>所谓参数化测试就是为测试用例提供参数数据，示例如下：</p><p>@Test(dataProvider = "data")</p><p>public void hello(String name){</p><p>Assert.assertEquals(name,"world");</p><p>}</p><p>@DataProvider(name = "data")</p><p>public Object[][] data(){</p><p>return new Object[][]{{"world"}};</p><p>}</p><p><strong>3.依赖测试</strong></p><p>当两个测试用例之间存在依赖关系，TestNG支持你使用注解l指定依赖关系。</p><p>@Test</p><p>public void insert(){</p><p>System.out.println("insert data");</p><p>}</p><p>@Test(dependsOnMethods = "insert")</p><p>public void query(){</p><p>System.out.println("query data");</p><p>}</p><p>上面的代码，如果query方法依赖的insert方法执行失败了，则query方法则将被跳过。如果insert失败了，还想要执行query方法的话，则可以在@Test中添加</p><p>alwaysRun = true的属性</p><p>需要说明的是这个用法不能用于单元测试，单元测试要求用例之间是隔离的，这也是为什么JUnit没有提供这个功能的原因。在集成测试等场景中需要的话则可以使用。</p><p><strong>4.多线程测试</strong></p><p>并发测试一直是测试的难点，TestNG提供了一套多线程执行测试用例的的方案，给并发测试带来了很大的方便。</p><p>@Test(threadPoolSize = 5,invocationCount = 30,timeOut = 100)</p><p>public void multiThreadTest(){</p><p>Long id = Thread.currentThread().getId();</p><p>System.out.println("thread id: " + id);</p><p>}</p><p>threadPoolSize 指线程数量，invocationCount表示测试用例调用的次数，timeOut表示超时阀值</p><p><strong>5.按优先级顺序测试</strong></p><p>@Test 提供了一个很有用的priority属性来指定测试用例执行的优先级，数值越低，优先级越高。这个在测试流程的时候很有用！</p><p>public class PriorityTest {</p><p>@Test(priority = 1)</p><p>public void priority1(){</p><p>System.out.println("登录");</p><p>}</p><p>@Test(priority = 2)</p><p>public void priority2(){</p><p>System.out.println("首页");</p><p>}</p><p>@Test(priority = 0)</p><p>public void priority0(){</p><p>System.out.println("注册");</p><p>}</p><p>}</p><p><strong>6.更丰富的注解</strong></p><p><img alt="利器丨有了它我再也不用担心各种测试啦！" src="http://p1.pstatp.com/large/2c3a0000bc00c193b224" img_width="1240" img_height="1217" inline="0" /></p><p><strong>三、拥抱TestNG</strong></p><p>从上面的介绍可以看到，TestNG相比JUnit提供了更全面的功能，更适用于互联网环境下的各个测试场景。而JUnit的定位仅仅是单元测试！ 因此建议TestNG 作为 Java 项目的主要单元测试框架！<br />End.<br /></p><p>51Testing：人气最旺的软件测试技术门户，提供软件测试社区交流、软件测试博客、人才服务、测试沙龙、测试杂志、测试资料下载等全方位信息服务，是国内最专业的软件测试就业培训、企业服务供应商。<br /></p></div><strong></strong><img src ="http://www.cnitblog.com/shbwf/aggbug/90707.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> 2017-07-12 13:51 <a href="http://www.cnitblog.com/shbwf/articles/90707.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>2014软件测试现状调查活动开始啦！</title><link>http://www.cnitblog.com/shbwf/articles/89835.html</link><dc:creator>51testing</dc:creator><author>51testing</author><pubDate>Wed, 12 Nov 2014 14:20:00 GMT</pubDate><guid>http://www.cnitblog.com/shbwf/articles/89835.html</guid><wfw:comment>http://www.cnitblog.com/shbwf/comments/89835.html</wfw:comment><comments>http://www.cnitblog.com/shbwf/articles/89835.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shbwf/comments/commentRss/89835.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shbwf/services/trackbacks/89835.html</trackback:ping><description><![CDATA[<b>调查名称：2014软件测试现状调查活动<br></b>
<b>调查时间：即日起至2015年3月12日<br></b>
<b><span style="color: #e3ae6">参与调查问卷请点击>> </span><a href="http://vote.51testing.com/ "><span style="color: #">http://vote.51testing.com/</span></a></b><br><br>
51Testing作为目前国内人气最旺的软件测试门户网站,为了帮助软件测试从业人员自身和相关企业，更深入、全面的了解中国软件测试从业人员现状，在2007年开展了首届中国软件测试从业人员调查活动。活动一经推出，立即受到广大会员的关注和支持。<br>
在2007年至2013年期间，51Testing软件测试网共开展了八次行业调查活动，其中除了2008年是企业软件测试现状调查外，其余七次都进行了中国软件测试从业人员调查并公布了调查所得数据和调查分析报告，每份报告都被下载超过万次，反响强烈。<br>
2014软件测试现状调查活动正在火热进行中，本次调查将继续从软件测试从业人员的角度，对软件测试从业人员及业内现状进行调查；问卷的设计在2013年的基础上做了进一步的修改和完善，力求使本次调查活动更专业、严谨、客观、实用，力争打造出中国软件测试领域最具广泛性、权威性和实用性的产业调查。<br>
51Testing希望通过本次调查活动，帮助大家了解2014年的软件测试从业人员现状，帮助测试人员更好的认识和定位自我，规划职业发展。<br>
欢迎广大软件测试从业人员前来参与，与51Testing携手，共同为提升软件测试从业人员整体价值，提高软件测试领域发展水平尽一份力量。<br>
感谢每个填写问卷的用户，你们的信息我们会保密的，对于完成问卷的用户，在调查报告一出来时我们就会通知大家，方便大家在第一时间了解行业现状~<br>
<span style="color: Ea590b">PS:必须全部填完才能提交问卷，如果有用户还是不愿意填联系方式什么的，可以直接填&#8220;无&#8221;。 </span> <br>   <img src ="http://www.cnitblog.com/shbwf/aggbug/89835.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> 2014-11-12 22:20 <a href="http://www.cnitblog.com/shbwf/articles/89835.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Web应用程序完全测试指南</title><link>http://www.cnitblog.com/shbwf/articles/89167.html</link><dc:creator>51testing</dc:creator><author>51testing</author><pubDate>Mon, 06 Jan 2014 06:41:00 GMT</pubDate><guid>http://www.cnitblog.com/shbwf/articles/89167.html</guid><wfw:comment>http://www.cnitblog.com/shbwf/comments/89167.html</wfw:comment><comments>http://www.cnitblog.com/shbwf/articles/89167.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shbwf/comments/commentRss/89167.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shbwf/services/trackbacks/89167.html</trackback:ping><description><![CDATA[<p>随着Web技术和移动互联网的发展，越来越多的应用被迁移到了云端，这也使得用户可以随时随地使用它们。目前大量的优质应用，逐渐提升了用户的品味，也降低了用户的容忍度，如果你的Web应用无法使用户满意，那么很快就会有其他的应用来代替。<br />　　对于开发者来说，建立良好的客户口碑才是最有意义的事情。在完成了Web应用的设计和开发工作后，并不意味着你就可以直接发布了，你还需要从各方面来对其进行测试，以便让用户在使用过程中，不会出现各种各样的问题，比如性能、使用体验、安全问题等等。</p>
<p>　　那么对于Web应用来说，该测试哪些方面，该如何测试呢？来看看作者 Abhimanyu Ghoshal给出的这些建议。<br />　　一、首先应该测试什么？<br />　　当测试Web应用的时候，首先要明确你的应用要用来做什么，比如帮助用户编辑照片、发送票据、联系朋友或跟踪社交媒介等。你通常需要着眼于这四大领域：<br />　　1.&nbsp; 功能性测试<br />　　几乎所有的用户都期望自己所使用的Web应用功能准确、迅速、一致。这就意味着开发者必须精益求精，帮助用户实现某种形式上的结果。下面是一些需要全面测试的常见的功能元素：<br />　　表单：无论是反馈调查、创建任务计划，还是订阅新闻，都需要用到表单。你需要检查提交操作是否正常，是否能够提交连接并提交到你的数据中，所有字段是否能够接收输入的内容。<br />　　文件操作和计算：这其中涉及图像和文档的上传、编辑、计算功能和正确的输出值。首先，要确保你能想象得到会有多少用户会使用你的应用，并尽可能地针对他们进行调节。另外，要考虑一下如何使你的App更有效地计算并显示出结果，给用户提供一个更加流畅的用户体验。<br />　　搜索：如果你的应用允许用户搜索内容、文档或文件，那么就要保证你的搜索引擎能够索引这些信息，并定期更新，以便能够让用户实现快速查找，并根据查找条件快速显示相关结果。<br />　　媒体播放组件：测试音频、视频、动画和互动媒体播放组件（如游戏和图形工具）的时候，这些组件应该像预期的功能效果一样，在加载和运行的时候不能影响（暂停或减缓）其他应用的运行。<br />　　脚本和类库：确保你的脚本（比如图像显示或Ajax页面加载）在各种浏览器之间是相互兼容的，因为不同的用户可能会使用不同的浏览器访问你的应用，同时你可以测量不同浏览器的加载时间来进行性能优化。如果你的脚本只能和某些浏览器相互兼容，那么就要确保应用中的其他组件有更好的性能，这样所有的用户就能得到最好的应用体验。<br />　　最后，就是要全面检查其他组件的功能，包括提示系统、用户配置文件和管理仪表板等。</p>
<p>更多内容请关注51testing软件测试网...</p><img src ="http://www.cnitblog.com/shbwf/aggbug/89167.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> 2014-01-06 14:41 <a href="http://www.cnitblog.com/shbwf/articles/89167.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>测试功能总结得与失随谈</title><link>http://www.cnitblog.com/shbwf/articles/89157.html</link><dc:creator>51testing</dc:creator><author>51testing</author><pubDate>Thu, 02 Jan 2014 06:25:00 GMT</pubDate><guid>http://www.cnitblog.com/shbwf/articles/89157.html</guid><wfw:comment>http://www.cnitblog.com/shbwf/comments/89157.html</wfw:comment><comments>http://www.cnitblog.com/shbwf/articles/89157.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shbwf/comments/commentRss/89157.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shbwf/services/trackbacks/89157.html</trackback:ping><description><![CDATA[一直在做功能测试工作，负责公司网站和软件功能测试工作，却很少静下心来总结工作中的得失。<br />　　很多不了解测试的人，认为功能测试不过就是拿鼠标点来点去，没有什么技术含量，随便招个应届毕业生就能干的工作。我也曾经认为功能测试没什么前途，现在看来觉得自己太浮躁，想法太固执了。功能测试的门槛可能比较低，做测试工作的人大多都是从功能测试开始，但要做好功能测试却不容易，需要学习的知识还很多。<br />　　功能测试最重要的是理解业务和需求。知道系统要实现什么功能，业务流程是怎样的，然后就可以根据需求编写测试计划和测试用例了以及记录Bug异常。<br />　　要做好功能测试，还需要对整个系统的数据库结构比较清楚，每个功能点涉及哪些数据表，对数据的操作方式是怎样的。这样就不单从前台页面来进行测试，通过对数据库中数据的验证，可以发现隐藏的一些bug。比如库表没有进行关联删除，从前台页面是看不出来的，但实际可能导致程序出现问题。对一些比较复杂的组合查询或数据排序，也可以自己编写sql语句对结果进行验证，这样有利于更好的发现产品潜在的Bug。<br />　　除此之外，了解程序的框架结构和一些简单的开发知识也有助于更好地测试程序和定位错误。做完一个业务，可以通过系统日志来查看错误原因，结合数据库结构，如果发现产品错误，却不知道问题在哪，就要学会用谷歌freedebug这个工具，查找出程序存在的异常，该工具还能更加好的做样式测试，能及时发现问题，及时解决问题，可以更好帮助开发人员定位该错误，促进产品更好，更高效率的开发。<br />　　最后，对bug的分析和总结有助于积累测试经验，比如一个产品那种问题出现的类似错误次数最多，哪些模块功能点考虑不全面问题，哪中测试异常记录方法能更好的利于开发人员进行查看，利于自己后期维护和修改。通过测试经验的累积，可以更好地了解系统常出现的错误，提高测试和产品的效率。<br />更多内容请登录 51Testing软件测试网<br /><img src ="http://www.cnitblog.com/shbwf/aggbug/89157.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> 2014-01-02 14:25 <a href="http://www.cnitblog.com/shbwf/articles/89157.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>网络异常测试初探</title><link>http://www.cnitblog.com/shbwf/articles/89120.html</link><dc:creator>51testing</dc:creator><author>51testing</author><pubDate>Tue, 24 Dec 2013 09:07:00 GMT</pubDate><guid>http://www.cnitblog.com/shbwf/articles/89120.html</guid><wfw:comment>http://www.cnitblog.com/shbwf/comments/89120.html</wfw:comment><comments>http://www.cnitblog.com/shbwf/articles/89120.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shbwf/comments/commentRss/89120.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shbwf/services/trackbacks/89120.html</trackback:ping><description><![CDATA[<a href="http://www.cnitblog.com/">
<p>&nbsp;</p>
<p>开发或者测试互联网产品的过程中，同学们一定遇到过connection timed out和socket read timed out两种和网络相关的异常。今天我们并不分析引起这些异常的原因，也不谈发生异常以后的解决办法，我们来说说如何制造这类异常，从而模拟对应的异常场景。<br />　　了解tcp协议就知道connection即建立连接的过程，其实和socket read即传输数据的过程并没有太大的差别，两者都是请求应答模式，而只是前者的请求数据量很小而已。要使两者超时，我们可以采用相同的方法即限制网络传输的带宽来达到目的。<br />　　Tc即traffic control就是这样一款能够限制网络流量的工具。Tc中主要的概念包括类class和过滤器filter。<br />　　我们可以用class把网络设备的带宽划分成不同的区间<br />　　tc class add dev $DEV parent 1: classid 1:11 htb rate 90mbps ceil 100mbps<br />　　tc class add dev $DEV parent 1: classid 1:12 htb rate 90bps ceil 100bps<br />　　如上，11这个class对应的带宽为90到100mbps，12这个class对应的带宽只有90到100bps。划分好了class，我们就可以用filter把符合特定条件的数据包归入不同的class中<br />　　tc filter add dev $DEV protocol ip parent 1:0 prio 1 u32 match ip sport $PORT 0xffff match ip dst $IP flowid 1:12<br />　　如上就把源端口是$PORT，目的地址是$IP的数据包归入12这个class中了，这样就把符合该条件的数据流量限制到了90到100bps。在正在运行的系统中开启上述tc限制，即把特定数据流限制到一个极小值，我们就能模拟出connection timed out异常了。关于tc更详细的教程可以参考1、2。<br />　　那么socket read timed out异常又该如何模拟呢，我们怎么才能区分建立连接和数据传输这两个过程，tc工具还能满足我们的需求吗？在寻找问题答案的过程中，另一个linux内核组件iptables进入了我们的视野。<br />　　Iptables是linux系统中常用的防火墙组件，功能十分强大，网上有十分丰富的资料。由于其能够识别数据包中的syn、ack等标志位，故能把建立连接和后续的数据传输过程区分开来。<br />　　iptables -A INPUT -p tcp --src $IP --dport $PORT ! --syn -j DROP<br />　　如上，在目的机器上加入该条iptables规则，可以实现将未设置syn标志位的数据包丢弃的功能，这样连接能够建立完成但后续的数据传输将无响应。<br />　　另外，Iptables具有一种连接跟踪机制，即能够记录连接的状态。这些状态分别是NEW、ESTABLISHED、RELATED和INVALID。我们可以利用该特性实现相同的效果。<br />　　iptables -A INPUT -p tcp -m state --state ESTABLISHED -s $IP --dport $PORT -j DROP<br />　　如上，在目的机器上加入该条iptables规则，当匹配了ip和端口，并且数据包所对应的连接状态是ESTABLISHED时将其丢弃。<br />　　至此read timed out异常也能轻松模拟了。Tc和Iptables是linux网络模块中强有力的工具，除了能够利用它们开发功能，也能够在网络异常测试中发挥关键的作用。</p>
<p>51Testing软件测试论坛圣诞活动期待您的参与~ipadmini 惠普平板 京东购物卡等你来抢！</p>
<p>&nbsp;</p></a><img src ="http://www.cnitblog.com/shbwf/aggbug/89120.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> 2013-12-24 17:07 <a href="http://www.cnitblog.com/shbwf/articles/89120.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>测试与杀虫剂困境</title><link>http://www.cnitblog.com/shbwf/articles/89060.html</link><dc:creator>51testing</dc:creator><author>51testing</author><pubDate>Wed, 18 Dec 2013 08:42:00 GMT</pubDate><guid>http://www.cnitblog.com/shbwf/articles/89060.html</guid><wfw:comment>http://www.cnitblog.com/shbwf/comments/89060.html</wfw:comment><comments>http://www.cnitblog.com/shbwf/articles/89060.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shbwf/comments/commentRss/89060.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shbwf/services/trackbacks/89060.html</trackback:ping><description><![CDATA[<p>读微软的软件测试之道，其中有一个有趣的小故事。讲得是主人公自己有个菜园，菜园里的植物面临着各种动物和昆虫的威胁，所以必须要找到某种防护措施来阻止包括野兔，害虫的侵扰，否则肯定会颗粒无收。主人经过分析，发现野兔对菜园的破坏其实并不大，最令人深恶痛绝的害虫是蛞蝓。<br />　　主人发现蛞蝓对啤酒很是偏爱，所以在菜园的土垛栅栏外通过啤酒陷阱能拦下这些害虫，另外还发现在栅栏外面撒盐也是击溃蛞蝓入侵的有效方法，木屑和蛋壳也是对付这些小贼的另一种途径。可是不管在菜园外围布下怎么样的天罗地网来捕捉和阻挡蛞蝓，一些漏网之徒还是会成功突破。<br />　　和菜园主人的蛞蝓阻击战十分类似，我们在实施一个以揭示潜在缺陷为目的的软件测试时，会采取各种手段和方法的搭配。富有经验的测试工程师会告诉你，没有任何一种单一的测试方法能够有效地揭示出所有种类的缺陷或对软件的能力做出完整的评估，这种困境被称为杀虫剂困境。杀虫剂困境这个术语来自Beizer的第一定律：&#8220;任何用以防止和发现缺陷的方法都会留下一些残余的，更为微妙的缺陷，而对于这些缺陷而言，前面的方法会统统失效。&#8221;本质上，没有任何一种单一的技术或者手段对于软件测试百试百灵。所以，增加测试方法的多样性，以及考虑从更多的视角审视软件，我们就更有可能发现更多潜在问题的同时，提高测试工作的有效性。<br />　　园艺工作确实很费神，也会遭遇到一些特别的挑战。但是刚看到家人品尝到美美的果实，你会觉得一切都是值得的。同样，软件测试工作是辛劳的，并且面临着很多特有的困难，但经过由一系列手段达成了其当的结果时，对于整个产品组的回报也是令人鼓舞的。更多内容请关注51testing软件测试网...</p><img src ="http://www.cnitblog.com/shbwf/aggbug/89060.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> 2013-12-18 16:42 <a href="http://www.cnitblog.com/shbwf/articles/89060.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java开发中常见的危险信号</title><link>http://www.cnitblog.com/shbwf/articles/89049.html</link><dc:creator>51testing</dc:creator><author>51testing</author><pubDate>Tue, 17 Dec 2013 05:36:00 GMT</pubDate><guid>http://www.cnitblog.com/shbwf/articles/89049.html</guid><wfw:comment>http://www.cnitblog.com/shbwf/comments/89049.html</wfw:comment><comments>http://www.cnitblog.com/shbwf/articles/89049.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shbwf/comments/commentRss/89049.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shbwf/services/trackbacks/89049.html</trackback:ping><description><![CDATA[<p><br />Dustin Marx是一位专业软件开发者，从业已经有17年的时间，他拥有电子工程学士学位，还是一位MBA。Dustin维护着一个博客，专门介绍软件开发的各个主题。近日，他撰文谈到了Java开发中常见的危险信号，提出了在日常的Java开发中我们需要尽力避免的一些不正确的做法。 　　经过多年的开发、阅读、回顾并维护了数万行的Java代码后，我经常会看到Java代码中出现的某些&#8220;危险信号&#8221;，这些信号经常（但也许并不总是）暗示着代码出现了某些问题。我这里所要谈的并不是那些总是错误的实践，而是想要谈谈在某些场景下可能是恰当，但通常却会导致问题的一些实践。这些&#8220;危险信号&#8221;有时可能并没有问题，但却会造成问题的积累，并最终导致问题的产生。这里我总结出了一些&#8220;危险信号&#8221;，并且谈谈在哪些情况下他们是没有问题的，在哪些情况下则会导致问题。 　　这里将要谈及的很多&#8220;危险信号&#8221;通常都会收到来自于FindBugs等代码分析工具所发出的警告信息，流行的Java IDE也会将它们标记出来。不过，我发现有不少开发者会忽略掉这些来自于工具与IDE的警告信息，要么是因为他们关掉了提示信息，要么是出于自身的开发习惯或是不理解与这些警告信息所关联的风险，因此会忽略掉警告信息。 　　对引用使用==（而不是.equals） 　　很多Java开发者都知道使用==比较原生类型数据，使用.equals比较引用类型数据。这是一条很容易记住的简单原则，Java开发者这么用也没什么问题。有时使用==来比较标准的Java类型引用（String、Integer、Long等等）也没问题，不过这要取决于被缓存的值的大小，因此这么做并不是一个好的做法。有时，我们需要检查标识的相等性而不是内容的相等性，在这种情况下使用==来比较引用就很适合了。相对而言，我更喜欢Groovy的处理方式，==类似于.equals，而===则是更加严格地比较标识。同理，使用!=来比较两个引用也是一个&#8220;危险信号&#8221;，因为如果待比较的两个对象不共享相同的标识（内存地址），即便他们拥有相同的内容也总是会返回true。 　　对枚举使用.equals（而不是==） 　　坦率地说，对于枚举，Java开发者使用==还是.equals都没有太大关系。不过，我更倾向于对枚举使用==。这么做最重要的原因就是对枚举使用==可以防止不小心将枚举与不相关的对象进行比较（永远不会相等）。Object.equals(Object)方法可以接收任意对象，这意味着编译器并不会强制限定传进来的对象要与被比较的对象是相同的类型。一般来说，我更喜欢静态的编译期问题检测而非动态运行期的问题检测，对枚举使用==可以满足这个要求。同理，在比较枚举时，!=与!.equals也是一样的。 　　魔数与字符串字面值 　　我经常会在Java代码中看到有人使用&#8220;魔数&#8221;和字符串字面值。他们对于未来的维护来说是一种&#8220;危险信号&#8221;，让我十分怀疑应用的正确性。在单个位置处将其标识为常量（如果可能用枚举来表示更佳），这么做可以改善未来的维护，并且让我可以更加自信地相信使用这些值的所有代码都在使用着相同的值。除此之外，在一个地方定义好常量与枚举可以更方便地使用IDE的&#8220;查找使用&#8221;特性来找到所有使用这些常量的地方。 　　字符串常量 　　在看到有限的相关字符串常量时，我就在想使用枚举应该更加适合。对于高度内聚的字符串常量的情况来说更是如此，因为枚举可以更好地表达出这些字符串所表示的概念。相比于字符串常量来说，枚举提供了编译期的静态类型安全与潜在的性能优势。对于程序的正确性来说，编译期的安全是最吸引我的地方。 　　使用Java的&#8220;goto&#8221; 　　很少有人会使用标签代码，如果使用了那也说明用法不当。换句话说，如果使用了也是滥用而已。在大多数情况下，使用Java的&#8220;goto&#8221;会造成代码的可读性极差。 　　根据作用域来确定恰当的变量引用 　　我认为这种方式永远都是不恰当的，但它却能运行，甚至有时是被某些Java开发者有意而为之。比如说，Java开发者将传递进方法的变量在方法执行时指向了另一个引用。该变量（临时指向方法参数）指向了另一个引用，直到方法结束为止，这时它脱离了作用域。在这种情况下，在方法签名的参数定义前加上final关键字会导致编译器错误，这也是我喜欢在方法参数前加上final的原因之一。对于我来说，在方法中声明一个新的局部变量是更加清晰且可读的方式，因为它只能在方法中使用。更为重要的是，作为代码的读者，我不知道是开发者有意希望该参数名只是指向一个不同的值还是引入了Bug，因为将参数重新指向新的引用实际上会改变调用端的值。如果我看到有人这么写，那么我就会找代码的编写者或是通过单元测试来验证代码的意图。 　　equals(Object)与hashCode()方法的不匹配 　　虽然我认为每个Java类都应该重写toString()方法，但对于equals(Object)与hashCode()方法来说却并不这么认为。我觉得只有在需要这些方法的场合下才应该重写类中的这两个方法，因为他们的存在暗示着其设计与开发某种程度上的完全改变。特别地，equals与hashCode方法要能满足其意图与契约（位于Object类的API文档），并且需要保持一致。大多数IDE与分析工具都会在其中一个方法重写而另一个没有重写的情况下给出提示。然而，我要确保equals与hashCode使用的是相同的属性，并且在这两个方法中属性的顺序要保持一致.更多内容请关注51testing软件测试网<br /></p><img src ="http://www.cnitblog.com/shbwf/aggbug/89049.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> 2013-12-17 13:36 <a href="http://www.cnitblog.com/shbwf/articles/89049.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>性能测试流程各阶段的工作</title><link>http://www.cnitblog.com/shbwf/articles/88854.html</link><dc:creator>51testing</dc:creator><author>51testing</author><pubDate>Mon, 02 Dec 2013 02:53:00 GMT</pubDate><guid>http://www.cnitblog.com/shbwf/articles/88854.html</guid><wfw:comment>http://www.cnitblog.com/shbwf/comments/88854.html</wfw:comment><comments>http://www.cnitblog.com/shbwf/articles/88854.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shbwf/comments/commentRss/88854.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shbwf/services/trackbacks/88854.html</trackback:ping><description><![CDATA[<p><font color="#000000" size="3" face="Times New Roman">　　<br />1.1 性能测试计划阶段<br />　　测试计划阶段主要工作如下：<br />　　1、明确测试对象<br />　　2、定义测试目标<br />　　3、定义测试通过的标准<br />　　4、规划测试进度<br />　　5、规划测试参与人员（需求、开发、测试、运维和配置）<br />　　6、申请测试资源<br />　　7、风险控制<br />　　1.2 性能测试设计阶段<br />　　测试设计阶段主要工作如下：<br />　　1、测试用例设计<br />　　2、测试方法设计（单场景和混合场景）<br />　　3、定义监控指标，如测试性能指标以及性能计数器等<br />　　1.3 性能测试实施阶段<br />　　测试实施阶段工作如下：<br />　　1、测试环境搭建<br />　　2、测试过程文档定义以及配置<br />　　3、测试脚本开发、调试<br />　　4、测试数据准备<br />　　5、基准测试<br />　　1.4 性能测试执行阶段<br />　　测试执行阶段工作如下：<br />　　1、执行测试用例模型，包括执行脚本和场景<br />　　2、测试过程监控，包括测试结果、记录性能指标和性能计数器的值<br />　　1.5 性能测试结果分析和报告阶段<br />　　&lt;一&gt;测试结果分析阶段工作如下：<br />　　1、根据测试结果、记录性能指标和性能计数器的值进行测试分析<br />　　2、根据性能测试目标规划，分析出系统存在的性能瓶颈，并给出优化建议<br />　　&lt;二&gt;测试报告的内容包括如下：<br />　　1、测试范围<br />　　2、测试执行以及参与人员<br />　　3、基准测试数据<br />　　4、测试执行的详细步骤（场景设计）<br />　　5、测试数据记录、性能指标以及性能计数器的值（有效的）<br />　　6、测试结果对比以及总结性评价<br />&nbsp;&nbsp;&nbsp;&nbsp; 更多精彩文章请上51Testing软件测试网查看</font></p>
<p><font color="#000000" size="3" face="Times New Roman"><br /></font>&nbsp;</p><img src ="http://www.cnitblog.com/shbwf/aggbug/88854.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> 2013-12-02 10:53 <a href="http://www.cnitblog.com/shbwf/articles/88854.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>loadrunner常见问题解决</title><link>http://www.cnitblog.com/shbwf/articles/88850.html</link><dc:creator>51testing</dc:creator><author>51testing</author><pubDate>Fri, 29 Nov 2013 03:07:00 GMT</pubDate><guid>http://www.cnitblog.com/shbwf/articles/88850.html</guid><wfw:comment>http://www.cnitblog.com/shbwf/comments/88850.html</wfw:comment><comments>http://www.cnitblog.com/shbwf/articles/88850.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shbwf/comments/commentRss/88850.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shbwf/services/trackbacks/88850.html</trackback:ping><description><![CDATA[<p style="text-align: left; line-height: 12.65pt; margin: 0cm 0cm 0pt;background: white; mso-pagination: widow-orphan" class="MsoNormal" align="left"><strong><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 12pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">LR</span></strong><strong><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">工具</span></strong><strong><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-font-size: 11.0pt">学习</span></strong><strong><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">遗留问题：</span></strong><strong><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 8pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></strong></p>
<p style="text-align: left; line-height: 12.65pt; margin: 0cm 0cm 0pt;background: white; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">　</span><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><strong>　</strong></span><strong><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 12pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">1.</span></strong><strong><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">测试脚本组织上不太了解应用在实际项目中怎样的组织编写方式，</span></strong><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">如何定义</span><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 12pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">action</span><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">、事务，检查点一般使用在什么情况下，是用文字、图还是函数，是否有规范的要求。</span><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 8pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p>
<p style="text-align: left; line-height: 12.65pt; margin: 0cm 0cm 0pt;background: white; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">　　先简单解答一下什么是</span><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 12pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">Action </span><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">什么是事务：</span><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 8pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p>
<p style="text-align: left; line-height: 12.65pt; margin: 0cm 0cm 0pt;background: white; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">　　</span><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 12pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">Action :</span><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">是一组事务或是一个独立的事务，一个</span><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 12pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">Action</span><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">可能和服务器有多次交互，完成活动目的</span><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 8pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p>
<p style="text-align: left; line-height: 12.65pt; margin: 0cm 0cm 0pt;background: white; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">　　</span><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 12pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">Transaction:</span><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">在</span><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 12pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">Loadrunner </span><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">中定义是用来度量服务器相应</span><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 12pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">VU</span><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">的请求相应时间。</span><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 8pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p>
<p style="text-align: left; line-height: 12.65pt; margin: 0cm 0cm 0pt;background: white; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">　　检查点：在每次事务提交后，服务器端都会返回响应信息，要通过对相应信息的检查来确认每次事务请求处理结果是否正确。具体采用什么样的检查方法，根据实际情况来确定，返回的是文字就验证文字，返回图片验证图片，返回数字验证数字。</span><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 8pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p>
<p style="text-align: left; line-height: 12.65pt; margin: 0cm 0cm 0pt;background: white; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">　　</span><strong><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 12pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">2.</span></strong><strong><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">测试场景中哪些监控器是常用的监控器，</span></strong><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">监控器中的监控指标也不太清楚常用的监控指标有哪些。</span><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 8pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p>
<p style="text-align: left; line-height: 12.65pt; margin: 0cm 0cm 0pt;background: white; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">　　监控指标分为系统监控，应用监控，事务监控</span><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 8pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p>
<p style="text-align: left; line-height: 12.65pt; margin: 0cm 0cm 0pt;background: white; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">　　事务监控：必须要监控的是事务平均相应时间，每秒处理事务数，事务成功率，事务失败率等</span><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 8pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p>
<p style="text-align: left; line-height: 12.65pt; margin: 0cm 0cm 0pt;background: white; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">　　系统监控：分为</span><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 12pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">CPU</span><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">使用率，内存使用率，磁盘</span><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 12pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">IO</span><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">，网络</span><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 12pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">IO </span><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">等具体指标说明见</span><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 8pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p>
<p style="text-align: left; line-height: 12.65pt; margin: 0cm 0cm 0pt;background: white; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">　　应用监控：</span><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 12pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">JVM</span><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">，</span><strong><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 12pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 11.0pt" lang="EN-US">web</span></strong><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">服务器，</span><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 12pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">apache IIS</span><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">，</span><strong><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-font-size: 11.0pt">数据库</span></strong><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 8pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 11.0pt" lang="EN-US">&nbsp;</span><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 12pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">oracle </span><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">，</span><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 12pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">informix</span><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">，中间件</span><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 12pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">tuxedo weblogic</span><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">等等</span><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 8pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p>
<p style="text-align: left; line-height: 12.65pt; margin: 0cm 0cm 0pt;background: white; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">　　每种应用的架构不一样监控的指标也不一样，如</span><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 12pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">tuxedo </span><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">使用</span><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 12pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">MQ</span><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">技术那么监控要看其消息对列大小变化，队列越长说明处理能力下降。</span><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 8pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p>
<p style="text-align: left; line-height: 12.65pt; margin: 0cm 0cm 0pt;background: white; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">　　具体指标代表什么意思可以去网上查资料。上次发的文档里有一篇</span><strong><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-font-size: 11.0pt">文章</span></strong><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">《</span><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 12pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">Computer Performance Monitoring</span><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">》是专门介绍监控指标的可以参考。</span><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 8pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p>
<p style="text-align: left; line-height: 12.65pt; margin: 0cm 0cm 0pt;background: white; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">　</span><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><strong>　</strong></span><strong><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 12pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">3.</span></strong><strong><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">测试场景中如何使用</span></strong><strong><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 12pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">IP Spoofer</span></strong><strong><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">，</span></strong><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">什么情况下使用。</span><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 8pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p>
<p style="text-align: left; line-height: 12.65pt; margin: 0cm 0cm 0pt;background: white; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">　　在一些系统中为防止网络攻击，对请求</span><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 12pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">IP</span><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">地址进行限制，当多个并发时候会拒绝请求。在这种情况下通过</span><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 12pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">Loadrunner IP</span><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">欺骗技术，构造数据包时候修改来源</span><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 12pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">IP</span><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">地址欺骗服务端</span><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 12pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">IP</span><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">过滤功能。</span><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 8pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p>
<p style="text-align: left; line-height: 12.65pt; margin: 0cm 0cm 0pt;background: white; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">　　</span><strong><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 12pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">4.</span></strong><strong><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">测试场景在项目中一般是否定义服务水平协议</span></strong><strong><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 12pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">(SLA),</span></strong><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">在什么情况下需要使用</span><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 12pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">SLA</span><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">。与基于目标的场景有什么区别。</span><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 8pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p>
<p style="text-align: left; line-height: 12.65pt; margin: 0cm 0cm 0pt;background: white; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">　　</span><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 12pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">SLA</span><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">是针对事务级别做阀值设置，设置数据在结果分析时有效</span><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 8pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p>
<p style="text-align: left; line-height: 12.65pt; margin: 0cm 0cm 0pt;background: white; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">　　目标场景的设置是对控制台有效，影响</span><strong><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-font-size: 11.0pt">测试</span></strong><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">执行。</span><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 8pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p>
<p style="text-align: left; line-height: 12.65pt; margin: 0cm 0cm 0pt;background: white; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">　</span><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><strong>　</strong></span><strong><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 12pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">5.</span></strong><strong><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">测试分析中没有如何分析的思路</span></strong><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">，一般对哪些图表进行怎样的分析能够分析出问题。建议将</span><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 12pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">&#8216;Load Test(loadrunner).ppt&#8217;</span><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">中的</span><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 12pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">&#8216;</span><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">应用</span><strong><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 12pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 11.0pt" lang="EN-US">Loadrunner</span></strong><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">测试心得</span><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 12pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">&#8217;</span><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">进行培训。</span><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 8pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p>
<p style="text-align: left; line-height: 12.65pt; margin: 0cm 0cm 0pt;background: white; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">　　这个可以安排时间组织讨论。</span><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 8pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p>
<p style="text-align: left; line-height: 12.65pt; margin: 0cm 0cm 0pt;background: white; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">　　</span><strong><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 12pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">6.LR11</span></strong><strong><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">中在录制脚本过程中没有录制下</span></strong><strong><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 12pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">thinktime</span></strong><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">，而且没有找到在哪里设置录制时记录</span><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 12pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">thinktime</span><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">的地方。</span><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 8pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p>
<p style="text-align: left; line-height: 12.65pt; margin: 0cm 0cm 0pt;background: white; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">　　</span><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 12pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">11</span><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">没找到设置位置，这个问题保留吧。如实在需要直接手工插入</span><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 12pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">think</span><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">时间。</span><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 8pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p>
<p style="text-align: left; line-height: 12.65pt; margin: 0cm 0cm 0pt;background: white; mso-pagination: widow-orphan" class="MsoNormal" align="left"><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">　　</span><strong><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 12pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">7.</span></strong><strong><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">在使用</span></strong><strong><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 12pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">ip </span></strong><strong><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">欺骗时候如何判断</span></strong><strong><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 12pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">vu</span></strong><strong><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">用户使用的虚拟</span></strong><strong><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 12pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">ip &nbsp;</span></strong><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 8pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p>
<p style="text-align: left; line-height: 12.65pt; margin: 0cm 0cm 0pt;background: white; mso-pagination: widow-orphan" class="MsoNormal" align="left"><strong><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 8pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span></strong><strong><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 8pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 11.0pt" lang="EN-US">&nbsp;</span></strong><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">更多精彩文章请上</span><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 12pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US">51Testing</span><span style="font-family: 宋体; color: black; font-size: 12pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">软件测试网查看</span><span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 8pt; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal"><span lang="EN-US"><o:p><font face="Calibri">&nbsp;</font></o:p></span></p><img src ="http://www.cnitblog.com/shbwf/aggbug/88850.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> 2013-11-29 11:07 <a href="http://www.cnitblog.com/shbwf/articles/88850.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>LoadRunner的场景设置</title><link>http://www.cnitblog.com/shbwf/articles/88844.html</link><dc:creator>51testing</dc:creator><author>51testing</author><pubDate>Wed, 27 Nov 2013 02:35:00 GMT</pubDate><guid>http://www.cnitblog.com/shbwf/articles/88844.html</guid><wfw:comment>http://www.cnitblog.com/shbwf/comments/88844.html</wfw:comment><comments>http://www.cnitblog.com/shbwf/articles/88844.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shbwf/comments/commentRss/88844.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shbwf/services/trackbacks/88844.html</trackback:ping><description><![CDATA[<p><br />loadrunner场景设置的方法：<br />　　1.逐步增加用户数，分多次去运行场景。比如：第一次运行50并发，第二次运行100并发&#8230;&#8230;<br />　　2.针对同一个脚本设置多个组，使用组策略(点击Edit Schedule按钮，选择Schedule by Group)，第一个组为初始用户数，如100，第二个组以50或100递增。每个用户场景都持续稳定地运行一段时间，这样可以把几种用户场景下的测试在一次场景的运行过程中就一次性执行完毕，而且还有一个好处是可以把多个用户场景下的性能结果都整合到同一个结果中，也方便对比、分析。<br />　　按组计划一般可用于比较复杂的业务流程中。比如，我们要实现用户注册系统，然后发贴，而论坛管理员认为这些帖子是非法的，需要将这些帖子删除。此时，我们就需要用到按组计划了。<br />　　按组计划的优点是可以设置在同一场景中不同脚本执行的先后顺序，可以组合处复杂的业务逻辑。<br />　　在Schedule by Group中方式，比按场景计划多了&#8221;Start Time&#8221;选项卡，Start Time中脚本有三种执行方式：<br />　　第一个：在场景开始时启动；<br />　　第二个：场景开始运行一段时间后开始，这种方式需要指定具体的开始时间；<br />　　第三个：在某些特定虚拟用户组运行完成后开始，这种方式适用于具有耦合关系的虚拟用户组。<br />　　通过后两种方式可以体现处不同组之间执行的先后关系。<br />　　至于Ramp Up, Duration, Ramp Down的功能与 Schedule by scenario一样。<br />　　按用户组计划的方式更加灵活，能够创建实际应用中那些有约束的场景。如果一组用户执行后产生的数据记录是另外一组用户的输入，那么就学要按照&#8221;用户组&#8221;的方式配置场景。<br />　　可以通过选右边Graph中的不同场景的线来选择对象，也可只显示一个线条，再对各个场景关系进行设置！<br />　　注：Schedule by scenario是所有用户遵从场景的整体安排。<br /></p><img src ="http://www.cnitblog.com/shbwf/aggbug/88844.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> 2013-11-27 10:35 <a href="http://www.cnitblog.com/shbwf/articles/88844.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>致那些徘徊在测试界的屌丝</title><link>http://www.cnitblog.com/shbwf/articles/88842.html</link><dc:creator>51testing</dc:creator><author>51testing</author><pubDate>Tue, 26 Nov 2013 02:40:00 GMT</pubDate><guid>http://www.cnitblog.com/shbwf/articles/88842.html</guid><wfw:comment>http://www.cnitblog.com/shbwf/comments/88842.html</wfw:comment><comments>http://www.cnitblog.com/shbwf/articles/88842.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shbwf/comments/commentRss/88842.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shbwf/services/trackbacks/88842.html</trackback:ping><description><![CDATA[前言<br />　　最近给学员培训感概良多，想写一篇文章发泄下，但小弟文采实在太烂，纠结了n久才出来这个没有一点含量的题目，还请大家多多包涵。这次我们谈论的完全是小弟自己的想法，也许有不符合大众胃口，不必掐架，重在交流学习，叩谢。<br />　　1、对测试工作的误解<br />　　很多人包括本人自己以前都对测试充满了偏见，认为测试真的只是指指点点，其实现在有不少测试人员也是这样想的，他们也抱怨为什么会看不起测试，有本事你开发出来个0bug的系统啊！！！但回过头来想想，现在很多测试人员，包括我现在的学员基本都是停留在发现bug，稍微好点的可能会分析下bug定位下bug，但99%的都不会这么做。小弟这里说难听点，如果只是发现bug，那么任何没有基础的人只要了解下业务就可以干这个活！<br />　　So，当有问题的时候小弟觉得还是先从自身找找问题，然后在看别的。所以这里给屌丝的建议就是从现在改变你的观点，测试不仅要找出bug，还要大致的定位bug，更要分析bug。<br />　　这里可能有人问了，分析bug干什么？很简单，我们需要分析出bug的分布、粒度、频率等等指标，如果某个模块的bug多，那么我们就需要强化case加深测试等等，好处显而易见，而这是大部分测试人员乃至测试部门都忽略的事情。<br />　　2、对测试知识范围的误解<br />　　不论是作为一个合格的测试人员还是优秀的测试人员，知识的广度都是必须的。我接触的学员中发现一个现象，几乎99%的童鞋都痴迷与自动化、性能、写代码，都觉得好高级好牛逼，这是一个不好的现象，后面我会讲到。<br />　　举个实际的例子，小弟之前做过一个系列关于oa系统的测试实战，本以为这样的简单东西大家应该看完视频后就可以很好的动手完成，但事实却给了我狠狠的一巴掌。那就是几乎所有童鞋都问我oa系统怎么配置，链接不上数据库，登录不成功。唉，我除了无语真心的觉得可惜。因为我们缺少了最重要的分析能力。我不可否认在分析上也许测试人员真的不如开发人员，但是这些基本的、常见的分析能力还是必须要有的，根据错误的提示一步步去查找问题去定位问题是一个优秀测试人员必须的能力。这也是我对学员要求最严苛的。<br />　　这里我再举个例子，就是我写这篇文章的前几天，一个童鞋在wamp下安装bugfree，结果出现了500的报错，我想凡是有基础的、凡是认真学习过的、凡是重视基础的童鞋都知道第一时间去看apache的log啊，可就这么简单的东西几经指导都无果，我真心有种想撞墙的冲动。<br />　　So，小弟在这里还是建议，不要盲目的跟风，不要怕别人说你好低级，如果没有良好的根基在TMD辉煌的大楼都能倒塌！<br />　　3、测试学习的方法<br />　　这里小弟不想废话，就送大家一句话，多学，多练，多思考。看到"多思考"这个字样了吗？是不是和别的字不一样？是不是大了？是不是粗了？那就说明这个很重要。<br />　　很多童鞋一直都处在一个想的阶段，比如他觉得在公司学不到东西，他觉得工作干完后不知道干什么了，他觉得做完这个项目感觉没学到东西。OMG，学习是主动的，不是被动的，自己多勤快点去多找点资料学习就这么难？<br />　　So，如果你想做白日梦而发财，那我劝你赶紧找个高富帅或者白富美吧，这样更省事哦。<img src ="http://www.cnitblog.com/shbwf/aggbug/88842.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> 2013-11-26 10:40 <a href="http://www.cnitblog.com/shbwf/articles/88842.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>QTP读取Excel数据的方法</title><link>http://www.cnitblog.com/shbwf/articles/43940.html</link><dc:creator>51testing</dc:creator><author>51testing</author><pubDate>Tue, 20 May 2008 01:45:00 GMT</pubDate><guid>http://www.cnitblog.com/shbwf/articles/43940.html</guid><wfw:comment>http://www.cnitblog.com/shbwf/comments/43940.html</wfw:comment><comments>http://www.cnitblog.com/shbwf/articles/43940.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shbwf/comments/commentRss/43940.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shbwf/services/trackbacks/43940.html</trackback:ping><description><![CDATA[<p>在构建自己的<a onclick="javascript:tagshow(event, '%B2%E2%CA%D4');" href="javascript:;" target=_self><u><strong><font color=#800080>测试</font></strong></u></a>框架时，或者是从Excel读入外部数据进行检查时都要用到Excel的COM对象编程方法，下面脚本中的ReadFile函数就实现了这样的功能，首先创建Excel应用程序对象，然后打开Excel文件，把Excel数据读取到一个数组中。<br>&nbsp;<br>arrRange = ReadFile("D:\QTP\MyWork\ReadExcelFileTest1\ObjectTree.xls","Tree") <br>'Msgbox UBound (arrRange,1)<br>'Msgbox UBound (arrRange,2)<br>' 读取其中一个单元格的数据</p>
<p><br><a href="http://www.51testing.com/?action_viewnews_itemid_82407.html"><strong><font color=#ff0000><u>阅读全文</u></font></strong></a></p>
<img src ="http://www.cnitblog.com/shbwf/aggbug/43940.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> 2008-05-20 09:45 <a href="http://www.cnitblog.com/shbwf/articles/43940.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Loadrunner使用经验交流</title><link>http://www.cnitblog.com/shbwf/articles/43799.html</link><dc:creator>51testing</dc:creator><author>51testing</author><pubDate>Fri, 16 May 2008 01:34:00 GMT</pubDate><guid>http://www.cnitblog.com/shbwf/articles/43799.html</guid><wfw:comment>http://www.cnitblog.com/shbwf/comments/43799.html</wfw:comment><comments>http://www.cnitblog.com/shbwf/articles/43799.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shbwf/comments/commentRss/43799.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shbwf/services/trackbacks/43799.html</trackback:ping><description><![CDATA[&nbsp;&nbsp; <a onclick="javascript:tagshow(event, 'LoadRunner');" href="javascript:;" target=_self><u><strong><font color=#800080>LoadRunner</font></strong></u></a>的基本原理这边不详细介绍了，估计大家都很清楚了。这里强调一点：LoadRunner不关心服务器内部的处理，所以有时在<a onclick="javascript:tagshow(event, '%B2%E2%CA%D4');" href="javascript:;" target=_self><u><strong><font color=#800080>测试</font></strong></u></a>时可能会发现，我们对系统施加了很大压力时，所有虚拟用户都测试通过了，但请求响应时间不正常的短，那一般来说，系统测试有问题，这就是因为LoadRunner没有去验证是否服务器真的处理了请求。
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面介绍一下我使用Loadrunner测试时的一些心得、经验与教训。</p>
<p>一、<a onclick="javascript:tagshow(event, '%D0%D4%C4%DC%B2%E2%CA%D4');" href="javascript:;" target=_self><u><strong><font color=#800080>性能测试</font></strong></u></a>步骤<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用LoadRunner进行性能测试的步骤：测试计划-》设计测试用例-》录制测试脚本-》执行测试-》分析测试结果，这个测试步骤和常规的测试过程很类似。</p>
<p>测试计划</p>
<p>&#8226;分析应用系统</p>
<p>&#8226;定义性能测试目标（确定需求对应的度量指标）</p>
<p>&#8226;计划LoadRunner执行过程</p>
<p><a href="http://www.51testing.com/?action_viewnews_itemid_82214.html"><strong><font color=#ff0000><u>阅读全文</u></font></strong></a></p>
<img src ="http://www.cnitblog.com/shbwf/aggbug/43799.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> 2008-05-16 09:34 <a href="http://www.cnitblog.com/shbwf/articles/43799.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>测试工具培训的一些建议</title><link>http://www.cnitblog.com/shbwf/articles/42715.html</link><dc:creator>51testing</dc:creator><author>51testing</author><pubDate>Fri, 25 Apr 2008 01:57:00 GMT</pubDate><guid>http://www.cnitblog.com/shbwf/articles/42715.html</guid><wfw:comment>http://www.cnitblog.com/shbwf/comments/42715.html</wfw:comment><comments>http://www.cnitblog.com/shbwf/articles/42715.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shbwf/comments/commentRss/42715.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shbwf/services/trackbacks/42715.html</trackback:ping><description><![CDATA[现在越来越多的公司都购买或开始使用<a onclick="javascript:tagshow(event, '%D7%D4%B6%AF%BB%AF%B2%E2%CA%D4');" href="javascript:;" target=_self><u><strong><font color=#800080>自动化测试</font></strong></u></a>工具以期来提高测试<a onclick="javascript:tagshow(event, '%B9%A4%D7%F7');" href="javascript:;" target=_self><u><strong><font color=#800080>工作</font></strong></u></a>的效率。然而尽管购买到了适合自己公司或产品的<a onclick="javascript:tagshow(event, '%B2%E2%CA%D4%B9%A4%BE%DF');" href="javascript:;" target=_self><u><strong><font color=#800080>测试工具</font></strong></u></a>，却并没有收到预期的效果。这是为什么呢？着其中有很多的原因，本文主要针对在培训中出现的问题提出一些自己的建议，部分内容参考Jose Fajardo的《A Detailed Look at the Idiosyncrasies of Test Tool Training》。
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在购买工具，工具可用之后，可能由于测试人员对新工具或工具的替换，甚至对自动化测试的不了解，测试工具的升级，工具对公司产品需要大规模定制等原因，测试经理往往应该考虑如何通过培训可以让大家最快的熟悉并能掌握使用工具。</p>
<p><a href="http://www.51testing.com/?action_viewnews_itemid_80282.html"><strong><font color=#ff0000><u>阅读全文</u></font></strong></a></p>
<img src ="http://www.cnitblog.com/shbwf/aggbug/42715.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> 2008-04-25 09:57 <a href="http://www.cnitblog.com/shbwf/articles/42715.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用QTP管理wap页面对象心得小结</title><link>http://www.cnitblog.com/shbwf/articles/42233.html</link><dc:creator>51testing</dc:creator><author>51testing</author><pubDate>Fri, 11 Apr 2008 02:07:00 GMT</pubDate><guid>http://www.cnitblog.com/shbwf/articles/42233.html</guid><wfw:comment>http://www.cnitblog.com/shbwf/comments/42233.html</wfw:comment><comments>http://www.cnitblog.com/shbwf/articles/42233.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/shbwf/comments/commentRss/42233.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/shbwf/services/trackbacks/42233.html</trackback:ping><description><![CDATA[由于wap网站并不同于我们普通意义上的web网站，以前也曾写过一篇在Firefox中安装XHTML插件来实现使用浏览器（当然opera也能实现对wap站点的访问，但opera对于过长的地址支持的不是很好）对wap网站进行<a onclick="javascript:tagshow(event, '%B2%E2%CA%D4');" href="javascript:;" target=_self><u><strong><font color=#800080>测试</font></strong></u></a>的文章，然而即便是使用浏览器较之模拟器测试wap网站快捷了许多，但是跟用工具<a onclick="javascript:tagshow(event, '%B2%E2%CA%D4%B9%A4%BE%DF');" href="javascript:;" target=_self><u><strong><font color=#800080>测试工具</font></strong></u></a>相比，还是有些距离。
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 于是这些日子抽空学着用<a onclick="javascript:tagshow(event, 'QTP');" href="javascript:;" target=_self><u><strong><font color=#800080>QTP</font></strong></u></a>来建立wap网站的自动化脚本，可惜由于自己对QTP本身就不熟悉，所以一路磕磕碰碰，好在同事们都给予了大力的帮助，尤其是天彤，总算我也让QTP小小的run了一把。为了不让大家在同样的地方&#8220;摔跤&#8221;，也为了将天彤的&#8220;秘诀&#8221;发扬光大，整理心得如下：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.目前QTP支持在firefox运行脚本，但是录制仍然需要借助IE。而IE并不支持对wap的浏览，因此无法直接使用QTP创建对象库。并且尝试使用Opera进行录制时发现同样获取不到对象。接触过QTP的人应该都知道，对象是脚本的基础，所以这个时候需要我们做一次有意义的转换。首先我们在Opera中打开需要录制对象的页面，然后将页面保存为.htm后缀的文件，再使用IE打开这个保存的文件，最后就可以使用QTP的管理对象工具获取到这个页面上的任意一个你想关注的对象。</p>
<p><a href="http://www.51testing.com/?action_viewnews_itemid_79018.html"><font color=#ff0000><strong><u>阅读全文</u></strong></font></a></p>
<br>
<script src="http://blog.yesky.com/Blog/groupshtml/ding.js" charset=gb2312></script>
<img src ="http://www.cnitblog.com/shbwf/aggbug/42233.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> 2008-04-11 10:07 <a href="http://www.cnitblog.com/shbwf/articles/42233.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>