qileilove

blog已经转移至github,大家请访问 http://qaseven.github.io/

Android代码覆盖的黑盒测试

 目前还是有很多人在做android的黑盒或者灰盒测试,就我两年的经验实在捉襟见肘,不过还是想share一些东西出来给大家,共勉共勉。测试,功能测试很少人知道怎么才算是测试覆盖面全了呢?全功能覆盖?非也,代码全覆盖?非也。测试本身是无尽的,平时做的话还是自己要把握住优先级。所谓的全覆盖只是在理想世界存在的东西。这里要说的是某些公司或者leader真的需要黑盒测试给出代码覆盖率的话,也是有办法的。如下。

  1、首先前提是你需要有被测产品的源码。(我表示这个必须)

  需要环境android SDK,ant1.8.2,jdk1.6,eclipse android环境  Android SDK安装完毕

  设置系统变量Path:sdk tools路径

  Ant1.8.2安装完毕之后设置系统变量  Ant:ant下面bin文件夹的路径  Java1.6安装好之后  JAVA_HOME: C:\Program Files\Java\……\

  2、使用eclipse check out最新的版本source出来。并且建立一个针对于软件主版本的测试工程出来。如何在eclipse里面建立测试工程,自行google。  建立好测试工程之后,粘贴如下代码:

public class (函数名)extends ActivityInstrumentationTestCase2<Activity class name>
  {        private <Activity class name>  mActivity;       
            private Instrumentation mInstrumentation;      
      构造函数 {                super("test package name", Activity class name);        }    
      protected void setUp() throws Exception {            
       super.setUp();            
       mInstrumentation = getInstrumentation();            
       mActivity = this.getActivity();        }     
       protected void tearDown() throws Exception {         
        super.tearDown();        }     
     public void testdemo1() throws InterruptedException {          
       Thread.sleep(30000);//程序执行的时间 单位毫秒        }}

  注:如果被测对象是service的话,android也提供了测试service的类,extends相关的类即可。之后代码可能有少量改变,具体参照SDK Doc。

  3、接下来我们进行最主要的一步

  A)创建我们程序的build.xmlcd <main project folder>android update project --path <目录>成功之后可以看到在主程序目录下面生成了一个build.xml。

  B)为我们的测试程序创建build.xmlandroid update test-project -m <full path to main project> -p <path to test project>C.启动CoverageCd <path to test project>Ant coverage如果这步成功,我们可以在测试程序下面看到一个coverage的文件夹。里面就是一个非常强大的report了。

  注:

  1)如果发现编译的过程当中出现@override error。那么要注意jdk版本是不是1.6,另外环境变量路径是否设置正确。

  2)如果编译过程当中出现not found symbols,那么需要添加主程序使用的额外的lib,将lib放入被测试程序下面的libs目录下面即可

  3)如果没有emma.jar,那么可以升级你的sdk。或者去下载http://developer.android.com/sdk/installing.html#sdkContents。

  4)关于report代码中会有三种颜色标识. 其中,绿色的行表示该行代码被完整的执行,红色部分表示该行代码根本没有被执行,而黄色的行表明该行代码部分被执行。黄色的行通常出现在单行代码包含分支的情况,例如上图中的 16 行就显示为黄色。

posted @ 2012-09-13 10:20 顺其自然EVO 阅读(536) | 评论 (0)编辑 收藏

Java中十个常见的违规编码

摘要:作者Veera Sundar在清理代码工作时发现一些常见的违规编码,因此,Veera Sundar把针对常见的一些违规编码总结成一份列表,以便帮助Java爱好者提高代码的质量和可维护性。

  最近,我给Java项目做了一次代码清理工作。经过清理后,我发现一组常见的违规代码(指不规范的代码并不表示代码错误)重复出现在代码中。因此,我把常见的这些违规编码总结成一份列表,分享给大家以帮助Java爱好者提高代码的质量和可维护性。

  这份列表没有依据任何规则或顺序,所有的这些都是通过代码质量工具包括CheckStyle,FindBugs和PMD检查出。一起来看下:

  一、Eclipse编译器提供源代码格式输入

  Eclipse提供自动源码格式选项,并且组织输入(删除未使用的代码)。你可以使用下面的这些快捷键进行操作。

  Ctrl + Shift + F——源代码格式

  Ctrl + Shift + O——组织输入并删除未使用的代码

  代替手动调用这两个函数,只需根据Eclipse自动格式和自动组织选项,可以随时保存文件。

  操作步骤,在Eclipse中进入Window -> Preferences -> Java -> Editor -> Save Actions,然后以选定的方式保存,最后检查Format source code + Organize imports。

  二、避免多个返回(退出点)

  依照你的方法,确保只有一个退出点。不要在同一个地方或多个地方使用返回。比如,下面的代码,NOT RECOMMENDED(不建议),这是因为有多个退出点(返回语句)。

  1. private boolean isEligible(int age){  
  2.   if(age > 18){  
  3.     return true;  
  4.   }else{  
  5.     return false;  
  6.   }  
  7. }

  下面的代码有所提升,这是更高版本的。

  1. private boolean isEligible(int age){  
  2.   boolean result;  
  3.   if(age > 18){  
  4.     result = true;  
  5.   }else{  
  6.     result = false;  
  7.   }  
  8.   return result;  
  9. }

  三、简化if-else

  我写了几个实用的方法作为参考,检查语句条件并且基于该条件返回值。比如,考虑到isEligible方法,正如你之前所看到的:

  1. private boolean isEligible(int age){  
  2.   boolean result;  
  3.   if(age > 18){  
  4.     result = true;  
  5.   }else{  
  6.     result = false;  
  7.   }  
  8.   return result;  
  9. }

  整个方法以一个单一的return语句重新编写:

  1. private boolean isEligible(int age){  
  2. return age > 18;  
  3. }

  四、不要给Boolean, Integer或者String创建新的实例

  避免给Boolean,Integer,String创建新的实例。比如,使用new Boolean(true),Boolean,valueOf(true)。修改后的语句与之前的效果基本相同,除了在性能上有所提升。

  五、使用大括号模块语句

  永远别忘了使用大括号模块语句比如if、for、while。这样做的好处是当你在修改模块级语句时减少了模糊代码并且避免引进bug的机会。

  不建议:

  1. if(age > 18)  
  2.   result = true;  
  3. else  
  4.   result = false;

  建议:

  1. if(age > 18){  
  2.   result = true;  
  3. }else{  
  4.   result = false;  
  5. }

 六、以final类型标记方法参数,任何时候都适用

  请记住,以final类型标记方法参数,任何时候都适用。这样做的好处在于当你不小心修改参数值时,编译器会给你警告,同时它还能以更好的方式优化编译器代码字节。

  建议:

private boolean isEligible(final int age){ ... }

  七、在UPPERCASE中命名public static final字段

  在UPPERCASE中命名public static final字段(通常也被称之为常量)。这个可以让你轻松区分常量字段和局部变量之间的不同。

  不建议:

public static final String testAccountNo = "12345678";

  建议:

public static final String TEST_ACCOUNT_NO = "12345678";,

  八、组合成单一的if语句

  在尽可能多的情况下,把多个if语句组合成单一的if语句,比如下面的代码:

  1. if(age > 18){  
  2.   if( voted == false){  
  3.     // eligible to vote.  
  4.   }  
  5. }

  合并成单一的if语句:

  1. if(age > 18 && !voted){  
  2.   // eligible to vote  
  3. }

  九、Switch应该有default

  始终给Switch语句添加default。

  十、使用常量来避免重复定义相同的字符串值

  如果你在多个地方必须使用字符串,那么使用常量来避免重复定义拥有相同值的字符串。

  比如,看下面的代码:

  1. private void someMethod(){  
  2.   logger.log("My Application" + e);  
  3.   ....  
  4.   ....  
  5.   logger.log("My Application" + f);  
  6. }

  string literal“我的应用”可以作为常量并且能在代码中使用。

  1. public static final String MY_APP = "My Application";  
  2.  
  3. private void someMethod(){  
  4.   logger.log(MY_APP + e);  
  5.   ....  
  6.   ....  
  7.   logger.log(MY_APP + f);  
  8. }

posted @ 2012-09-13 10:08 顺其自然EVO 阅读(167) | 评论 (0)编辑 收藏

到底何时才使用自动化测试

什么情况下使用自动化测试?是不是采取自动化测试就会提高效率?当有一天你的老板或者经理问你这问题时,你可以把下面的文字转述给他,相信老板会满意你的答案...:)

  1、执行频率

   如果测试会在应用程序的每一个新版本下运行,则该测试非常适合自动化。这包括在整个应用程序中检查基本功能的那些测试。每当应用程序有了新版本,在进行 深度测试前,应当运行这些测试来检查新版本的稳定性。数据驱动测试(测试中对同样的操作使用了多重的数据值)也是非常适合自动化的测试类型。每次对不同的 输入数据集通过手工方式运行测试既单调乏味也效率低下。通过创建一个自动化的数据驱动测试,能够在一个测试中使用多重的数据集。

  2、压力/负载 测试

  同样推荐将压力测试和负载测试进行自动化。举例来说,假设一个测试必须重复1000次,手工运行测试将会非常不切实际。使用WinRunner,则能够创建一个循环来运行测试1000个来回。

  何时不要使用自动化测试?

  下面描述了不应当被自动化的测试用例

  1)可用性测试-提供可用的模块来检查应用程序的易用性的测试

  2)只运行一次的测试

  3)需要立即运行的测试

  4)基于用户对于应用程序的直觉和知识的测试

  5)没有可预测结果的测试

  自动测试的优点是能够很快、很广泛地查找Bug,缺点是它们只能检查一些最主要的问题,如崩溃、死机,但是却无法发现一些一般的日常错误,这些错误通过人眼很容易找到,但机器却往往找不到。另外,在自动测试中编写测试工作量也很大,因此在实际测试中通常是手工测试和自动测试相结合,而且手工测试往往是主要的,占了1/2-2/3,而自动测试只占1/3-1/2。在不同的开发队伍中,这个比例会有所不同,但总体趋势是这样的。

版权声明:本文出自 coolors 的51Testing软件测试博客:http://www.51testing.com/?130939

原创作品,转载时请务必以超链接形式标明本文原始出处、作者信息和本声明,否则将追究法律责任。

posted @ 2012-09-12 10:36 顺其自然EVO 阅读(260) | 评论 (0)编辑 收藏

QTP使用中的陷阱

不要使用Reuable Action

  用Function,不要用Reusable Action。没有一种通用的语言里有Reusable Action这个概念。而且通过Function等一些标准的程序设计语言的元素,你能够实现任何Reusable Action可以实现的功能,而且更好,更快,更易于维护。

  以前我还不能肯定这一点。现在我能肯定的告诉你,因为有好几个QTP项目,上千个Testcases在支持我的观点。

  不要用Smart Identification

   有一天,我发现一个奇怪的现象,一个testcase里某一个点击logout button的步骤运行非常慢,大概要20秒,但是最终它还能成功点击。不巧的是每一个testcase几乎都会点击这个button,所有我还必须把这 个问题找出来。最后发现这是因为button的name有了变化,但是因为Smart Identification是被enable,所以QTP会试图去适应这个变化,但是这个“适应”的效果非常不理想。

  我认为测试开发者应该完全控制对象的识别。把选择权交给对被测程序业务一无所知的工具是毫无道理的。我想不到任何使用SmartIdentification的原因。所以,从那之后,任何Testcase的Smart Identification我都禁止了。

  不要在base目录里添加两个或以上目录

  Base目录是用来只能识别相对路径的目录。其配置在Menu: Tools->Options->Folders。我的建议是这里只放项目根目录。其他目录都不要放进去。

  曾经,我接手了一个QTP项目。开始的时候我根本就不能把哪怕一个testcase成功跑起来。于是我去问起开发者,他告诉我需要把某一个特定的Reusable Action添加到"folders"里面。这种坑是在是让人哭笑不得。

  QTP作为一种工具,或许需要提供这种灵活性。但我们除非有必要,不要去用它。如果必须要用,也要很好的document这点。

  不要用keyword view,而是提供业务逻辑封装层

  如果你要让你的testcase简单,直接,那么你应该通过合理的抽象提供完善的业务逻辑封装层,它会使得你的testcase script读起来像testcase descript一样。这个时候,你根本不需要keyword view。

  不用Reporter.ReportEvent而用Assert

   当执行一个Testcase时候,如果遇到错误,QTP支持两种操作。"stop run"和"proceed to next step"。(注意,其实还有另外两个选项。"pop up message box"是针对开发时使用。"proceed to next action iteration"不常用。所以不讨论。)

  基本上,QTP鼓励"proceed to next step"这种方式:如果出现了错误,那么记录错误,但testcase仍旧会执行下去。

  对于QTP检查到的错误是这样,对于测试脚本自己检查到的错误也是如此。QTP提供了一个错误报告机制。

  Reporter.ReportEvent micFail, stepName, errorMsg

  这种处理方式违背了一个程序设计的基本原理:如果出现不能处理的错误,那么就抛出错误。通常来说如果出现了错误,执行下去是没有意义的。我猜想 QTP之所以会支持这种方式是因为,如果出现错误马上退出,那么testcase里的负责cleanup的代码就无法执行。想想看JUnit里的 Setup和Teardown机制,在VBS里是无法实现的。

  即使考虑到这点,这样做还有一个问题,导致我不采用它的原因。那就是不能在batch run的结果报告里显示错误。如果采用"stop run"的方式,那么batch run脚本能够获得导致testcase退出的错误信息。然后在产生report的时候,能够呈现出来。再结合错误时刻的screenshot,实践表 明,大多数错误都能在阅读report的时候确定原因。下面是一个Report里一个失败Testcase的呈现情况。

  如果使用Reporter.ReportEvent的方式,那么在Report里你看不到任何错误消息,只能在 Result View里面打开result xml。这是一个耗时的操作,因为Result View很慢。大多数时候,你是在等待Result View把测试结果渲染出来。

  为了更好的支持checkpoint,我在framwork里定义了一套Assert函数,可以对大多数情况下的断 言语义提供直接的支持,比如“相等”,“不等”,“包含”,“匹配”,等。在Assert函数里面,会抛出一个Error。下面是一个从popup窗口读 取信息,然后验证信息是否正确的例子。

AssertMatch GUI_MsgBox_Msg("Information"),_

    ".*is invalid or you don't have the permission.", _

    "Error message not displayed or correct"

  如果该Checkpoint失败,那么在HTML report里看到的信息像下面的样子。

AssertMatch: Error message not displayed or correct. Expected<,".*is invalid or you don't have the permission.>, Actual<>

  总结一下。在错误处理上,采用"stop run"的方式,这也是所有程序设计里采用的方式。在写checkpoint的时候,用Assert而不要用Reporter.ReportEvent,因为前者会帮助你更快的分析错误。

版权声明:本文出自 lifr 的51Testing软件测试博客:http://www.51testing.com/?764

原创作品,转载时请务必以超链接形式标明本文原始出处、作者信息和本声明,否则将追究法律责任。

posted @ 2012-09-12 10:33 顺其自然EVO 阅读(636) | 评论 (0)编辑 收藏

测试团队的建设

  【团队建设Team Building】——“这件事情,你想过你多做一点什么事情就可以避免吗?”

  关于责任与全民测试

   核心点是团队中任何人都需要对自己的输出负责。策划对自己案子的实施跟进,在程序制作完成的第一时间验证程序的制作和自己的设计有无偏差;程序对于自己 提交给测试的内容需要进过自测;美术对于自己的制作在游戏中的表现效果的验证;测试从策划案三方会谈到最后的release回归测试阶段的全面跟进。

  出了问题,谁的责任?

  这边的情况,出了问题,几乎没有谁会指责测试,但是我会经常问相关的测试人员一句:“这件事情,你想过你多做一点什么事情就可以避免吗?” 几次下来,效果都很明显:

  “如果我当时再和程序确认一下这个地方的实现就好了”;“如果当时我多问一下策划就好了”;“如果当时程序告诉我服务器做了检查,我发包验证一下就好了”

   -----“这件事情,你想过你多做一点什么事情就可以避免吗?”  这是我推崇的一种做事的态度,不推诿,敢承担,一切以改进为思考出发点!当他自己发现其实多向前一步就可以改进这个问题,why not?很多问题的出现其实涉及到各个职位,策划、程序、测试无论谁多向前一步就可以解决这个问题。在忍者猫,我对测试员的要求是自己做那个向前一步的主 动者。因为我相信,一个团队,氛围很重要,而且氛围是可以被感染和传播的。

  关于团队凝聚力:

   团队成功的因素一定离不开人的因素!在团队具有超强的凝聚力情况下,战斗力也将是超强的。但是遗憾的是能做到这样的团队毕竟不多,人心实在是难以捉摸的 东西,很多人不过是抱着打一份工的心态,所以这个情况下流程就有了必要性。既然很难要求到团队中的大家都有足够的内驱力和拼劲,那么用流程来规范行为,按 照这个流程来,先达到80分,而后慢慢的灌输团队的价值观,筛选和团队价值观相同的队员,建设团队,最后一定是可以再简化流程甚至抛弃流程。于初期而言, 固化和僵化是必须的。这类似于德治和法治的关系,需要老大们根据自己团队的情况来判断和选择。

  关于思想:

  1、我们是一个团队。

  不要只关注自己手头的任务。小到测试组,大到整个项目,不拘泥于职位,想想自己能为团队做什么?但却要注意沟通的方式方法,特别是给其他职位提建议的时候,沟通技巧很重要。

  这种氛围形成后的直接好处是:主管不需要为任务分配的均衡问题和犯愁。团队中基本看不到有人很闲有人很忙的状态。当然,前提条件是团队成员的筛选上需要非常重视责任感和团队意识。

  2、一个自学习、自提高的团队。

  对于新人来说,什么能引起共鸣?“自我提升”。招聘的时候,会很重视组员的自我提升意识。而工作中需要传递一个这样的信息——如何提升得更快?

  工作年限并不等于工作阅历,相同的工作,不同的人经验值的获取也是不同的。而“用心程度和思考”是影响经验成长系数的重要参数,所以把项目当做是自己的项目,把自己当成是项目的核心成员吧!

posted @ 2012-09-12 10:31 顺其自然EVO 阅读(236) | 评论 (0)编辑 收藏

透过游戏研发项目特点看项目需求管理

游戏作为一种特殊的软件产品,比普通的软件开发更为复杂,因此,游戏项目的管理较之一般软件项目也更具挑战性。在软件工程中,需求管理是关乎项目生死存亡的首要环节。本文将透过游戏研发管理的视角,重点探讨如何通过有效的需求管理保证项目成功。

  游戏研发项目特点

  1、项目整体复杂性强

  游戏是一种特殊的软件,尤其是大型网游,通常比一般的软件开发规模大、人数多、周期长、复杂程度高。首先,正规的游戏开发会包括策划、美术(含2D和3D)、编程和测试等多个团队,如何使这些具备不同工作技能的团队成员协同工作,如何使各个工作环节衔接顺畅,是一个颇为复杂的问题。其次,网络游戏项目的开发周期较长,虽说一般在1年半到2年之间。另外,游戏项目的成败很大程度上依赖于市场对游戏的反响和接受意愿,频繁的需求变更再次增添了游戏研发的复杂性。

  2、需求管理难度大

   游戏的需求管理贯穿整个开发过程,是影响游戏开发质量的关键。游戏项目最初的需求是从策划部门提交的游戏创意、玩法、美术风格、大致背景、特色系统、与 同类游戏区别等等一系列繁杂的内容中,通过各部门讨论和评估而总结出来的。虽然通过需求分析会得到《游戏功能描述书》这一结果性文档,但是,如果不进一步 结构化分解,项目成员要进行任务分配和编程仍然很难。

  除了最初的需求分析,需求变更管理也是一个难点。游戏项目计划经常改动,往往也是 由需求变更引起的。一方面,为了使游戏发布后更具有竞争力,需求变更不可避免,如果不对变更进行评估取舍,项目的整体目标可能很难达到;另一方面,为了弥 补需求变更对项目进程带来的影响,开发人员常常快速的进行功能修改和增加,而没有遵循统一的流程控制,从而使游戏整体的有序性被破坏,人为地增加了工作 量,最后导致跳票。

  3、项目规划与执行要求高

  项目规划准确性。游戏作为大众娱乐 的商业产品,通常都会选择在重要档期推出,如圣诞、新年和暑假等。准确的项目规划能使企业在第一时间收回成本并盈利,游戏跳票就意味着被竞争对手抢占先 机;若为了在档期按时发布而忽略了游戏的品质,将给企业带来更为严重的后果,导致游戏只能降价出售,甚至召回。

  项目执行过程规范程度。 游戏作为创意产业,很多从业人员都充满智慧、自信、极具创造力,同时也有些不容易受到流程和规则的约束。例如,一些开发人员喜欢增加不必要的“玩家欣 赏”,这些功能并不在需求规格说明书中,也不是玩家所期望的,开发这些功能必然会影响项目整体进程。因此,游戏的创意虽要无拘无束,但项目管理必须要流程化、规范化,才能使项目往预期的方向发展,直至游戏成功发布。

   美术资源管理。游戏设计中会有大量图片、视频等大文件资源,尤其是在3D游戏中,包含模型、贴图和骨骼等内容。目前的版本控制工具很多都不适合大文件的 管理,或者会浪费过多的存储空间。另外,在游戏发布时,都会对资源文件打包,网游的客户端文件中有很大部分都为美术资源,只有将这些文件按规则存储到相对 应的路径并规范命名,才能有序管理这些资源,提高效率。

  测试管理。目前国内网游团队的测试能力相对较弱,大部分都没有高效、全面的缺陷管理系统,甚至有一些测试工作与客户支持任务都由同一团队来负责。相反,测试在欧美游戏公司中起了非常重要的作用,这也是欧美游戏品质上乘的重要原因之一。

  有效的需求管理方法

  从游戏研发项目特点不难发现,目前存在于游戏开发管理中的很多问题都源于需求管理环节。

  量化需求管理

  如前所述,游戏项目通常规模巨大,涉及部门众多。很多欧美视频游戏的开发投入都在千万美元以上,通常需要200人以上的专业团队开发2到3年时间。游戏项目的需求涉及到很多内容,包括游戏类型、界面类型、引擎、游戏性等。

  游戏项目的需求文档最初来源于策划案,内容包括剧情创意、玩法、美术风格等。结合游戏硬件和软件环境等因素,被分解生成《游戏功能描述书》,包 含众多内容,若用整篇的文档来指导开发和测试工作,很容易引起任务分配的混乱;当发生需求变更时,也很难追溯历史版本。TechExcel从实践中提炼出 一个行之有效的解决方法-用规范点(Specification,以下简称Spec)量化需求,正规表达每一个功能单元。只需打开《游戏功能描述书》的 WORD文档,就可以利用插件,将其中的功能单元逐条地复制出来,在需求管理系统DevSpec中直接生成Spec。相对于需求,Spec是更面向技术人 员的语言。

  有序管理需求变更

  在实际项目中,实现需求变更的成本随着开发进度呈指数级增长。需求变更的流程化管理能保障正常的开发进度,将变更及时反应到开发测试部门。

  以下描述的是一个典型过程(如图1)。一项变更请求在需求管理系统中被提交后,与之关联的各个部门,如市场、程序、美术、测试等,都会有相关人 员接到系统通知而介入。他们将组成评估团队,根据实施难度、周期、费用、对其他机制的影响等指标,对该变更进行全面考察和评估。在理想的游戏研发管理平台 中,需求管理与所有规划、开发、测试管理过程相集成。因此,需求的正规表达Spec,以及围绕Spec正在或将要进行的开发任务和测试任务,都能被纳入综 合考虑的范畴,便于评估团队估算该变更造成的“牵一发而动全身”的潜在影响。有时,还要结合商业需求进行考量,为了赶上最佳发布时机,有些变更将被拒绝。 这个过程由独立的工作流控制,通常包括请求、复查、讨论、调整、批准和拒绝等状态,只有具备权限的项目成员才能改变状态。按照预设的流程,各方审批全部通 过后,该变更才能被接受。

  变更请求被批准后,与之相关联的开发、测试任务都会在系统中被一一标记出来,以提醒程序和测试部门的相关负责人,引发这些任务的需求已经变更, 请他们做出相应的调整处理。在系统中跟踪这些任务的进展,可以实时掌握该变更的落实情况。变更完成后,也可以核算它对开发周期和费用的实际影响,与评估时 的预测相对比,找出差异原因,为将来更准确地评估提供参考。

  需求指导项目规划与执行

  纵使项目最初都有比较全面的计划,延期仍然会时常发生,即便是在管理机制比较成熟的欧美游戏公司,跳票也不可避免。通常情况下,导致跳票主要有 以下几点原因:功能设计规划过多,很多又无法删除,如不增加开发时间,游戏几乎不能完成;缺乏有经验的管理或开发人员,不能准确估计工作量;任务执行缺乏 规范,开发人员随意更改功能设计,影响整体进度;过高的人员流动率,导致知识的流失,任务不能及时跟进。针对以上问题,只要从量化需求入手,有序管理需求 变更,用正规表达、可量化的Spec来指导项目规划、编程和测试,就能把风险降到最低。

  基于结构化的Spec集合,可以将项目分解为多个子项目,将Spec直接分配到各自对应的子项目中,以此来规划和估算子项目的工作量。项目管理 人员为每个子项目分配资源,安排优先顺序,确定项目里程碑。在游戏项目中,不同部门协作异常紧密,因此子项目间的优先顺序显得尤为重要。例如,游戏音效制 作与程序开发之间的相关度看似并不非常紧密,但若音效人员不实际感受游戏,很难体会玩家心情,也就难以创作出应景的音效。

  在项目执行时,可以为每一个Spec产生出一系列开发任务。自定义的工作流机制确保每一个任务从提交到最终解决的生命周期都严格符合业务流程, 保证任何时刻都有唯一的负责人、状态和截止日期。这样,不仅能规范游戏制作的过程,还能降低人员流动带来的风险。任务的流转及相关知识文档,如源代码、美 术资源等,都得到系统完整的记录,还能与任务关联,便于追溯。一旦有人离开项目,接替的人员能够查看任务和文档信息,迅速弥补人员空缺。

  以上所述的需求管理经验,虽然是从游戏行业的实践中总结得出,却不囿于游戏行业,项目复杂度较低的一般软件企业也可以借鉴。

posted @ 2012-09-12 10:29 顺其自然EVO 阅读(156) | 评论 (0)编辑 收藏

探索式测试的问与答(2)

 接探索式测试的问与答(1)

  既然学习非常重要,那么如何才能高效地学习呢?软件专家Andrew Hunt指出:“一种高效的学习环境应该允许你安全地做三件事情:探索、创造和应用。”Andrew的解释如下:

   探索就是在陌生的环境中玩(Play)。你需要自由地探索才能学习。我们不仅仅接受信息,而是亲自探索和构建思维模型。玩引入了一种新奇的感觉,也就是 乐趣。用一种好玩的方式学习新资料或者解决问题,可以让这个过程变得更让人享受,也让学习变得更容易。为了更好地学习,请更好地玩。

  你需要自由地创造--不介意自己的创造没有成功。通过构造来学习,而不是通过学习来构造。这是“原型”、“曳光弹” 、持续集成等方法获得成功的原因之一。

  你需要在日常实践中应用到你学到的东西。你持续使用和实践的技能会在脑皮层竞争中占据统治地位,大脑会为它们提供更多方便。

  这种探索应该相对没有风险,因为你肯定不想因担心害怕而止住探索的脚步。安全有助于更好地利用反馈,让失败也变得有意义。

  虽然Andrew讨论的是广义的学习与探索,但是他的话解释了探索式测试的成功之道:探索式测试在本质上鼓励测试人员去自由地探索、创造和应用。

  探索是带着使命在某个空间中有目的的漫游,但没有预先确定的路线。探索包括不断学习和实践。

  探索式测试者持续应用他所学到的知识。所谓“学而时习之,不亦说乎”,探索式测试将学习与应用作为相互支持的活动逐步展开,为测试者的知识提升提供了平滑的学习曲线。

  探索式测试有助于测试人员在合适的时间学习合适的内容,并立即应用,以获得真实反馈。这提高了学习效率和效果,并降低了浪费测试资源的风险。

  在探索式测试中,测试者创造出一切有助于学习和实践的数据和工具。它们包括测试输入数据、结果检查脚本、数据分析报告和业务流程图表等。

  探索式测试是一项富有智力挑战的活动,充满了乐趣。

  问:“学习”有助于独立测试人员更好地工作与发展。从测试团队和开发组织的角度看,探索式测试能够提供什么帮助?

  答:探索式测试有助于“机动性”,该特性在现在比以往任何时候都更重要。

  随着互联网与Web应用席卷全球,软件竞争比以往更加激烈。开发组织不仅要减少缺陷,还要跟踪不断变化的用户需求和市场需求,在紧迫的时间约束下交付赢得用户的产品。这要求软件企业在业务、研发、营销等方面均保持高机动性。其中,探索式测试可以在以下方面为产品研发提供帮助。

   首先,探索式测试将许多测试决策置于更合理的时机,从而避免了浪费。在Web应用等高竞争性领域中,开发组织面临模糊且持续变更的用户需求。更重要的 是,他们必须在一切明朗之前着手行动,因为交付的时机将在很大程度上决定市场的反应,此外真实的用户反馈将有助于下一次更准确地交付。面对高变动性的开发 过程,测试人员需要将测试设计合理地分配到整个开发周期,根据当前的开发进度和真实的测试反馈,做出恰当的测试决策。这有助于避免在信息不充分的情况下做 出错误的决定,从而导致严重的浪费和返工。

  其次,探索式测试不停地根据实际情况,调整测试计划,优化测试策略,因此能够更有针对性地测 试,从而更快速地稳定(Stabilize)产品。探索式测试和语境驱动测试建议,测试人员总是自问:“我现在可以测试什么?应该如何测试?”这有助于测 试人员更动态地审视被测试产品和测试策略,并运用多样化的手段去探索产品。随着对业务领域的认识不断深入,随着逐渐了解产品的设计和弱点,随着对测试技术 和工具的更加熟悉,测试人员会不断调整测试策略,使得在整个产品开发过程中,重要错误的发现率都保持在比较高的水平[Kaner01]。而及时地发现重要 错误能够帮助开发组织降低风险、快速推进。

  测试需要探索,而探索要要大量的思考。积极思考的探索式测试是具有挑战性的智力过程,常常需要以不确定的顺序反复实施钻研、尝试、迂回、调整、评估等活动。好的探索式测试不会使测试更简单,但是它会使测试更有效,从而在测试速度和缺陷发现上获得更多的回报。

  问:探索式测试是否只适用于功能性测试?

  答:作为一种测试风格,探索式测试可应用于各种类型的测试。

  以安全测试为 例,请想象一下黑客是如何攻破软件产品的。他们的基本方法是“错误猜测”:通过分析已知的安全缺陷,抽象出可利用的缺陷模型,然后开发出相应的缺陷挖掘工 具。这些工具可以是黑盒工具,通过持续地输入攻击数据来发现缺陷;也可以是白盒工具,通过扫描(开源)源代码来识别漏洞。他们运行工具,分析输出中的蛛丝 马迹,一旦发现疑似缺陷,便深入探索。整个攻击过程常常需要广泛扫描、深入挖掘、迂回前进、反复尝试。从安全测试的角度看,黑客都是探索式测试的绝顶高 手。

  相比安全测试只需“断其一指”,性能测试需 要建立被测试产品的性能模型,并考察它在不同负载下的性能指标,因此需要更多的预先设计。然而性能测试的关键内容:用户的行为模式、充足的高质量测试数据 和完整的性能监测指标(特别是面向业务的性能指标),是难以仅通过一次测试设计便可以获得的。性能测试工程师需要与开发团队紧密协作,通过阅读、研究、实 验等手段来探索性能测试模型和技术,并逐步挖掘用户行为、制造测试数据及建立性能指标。

问:在功能实现之前,探索式测试是不是无用武之地?

  答:对于探索式测试有一个误解,那就是探索式测试只通过运行测试以获得知识。实际上,探索式测试者能够也必须通过其他手段探索被测试软件。

  语境驱动测试认为:产品是一种解决方案,它必须解决现实世界中的问题。因此,探索式测试者必须从项目关系人(包括软件用户、项目投资人和开发团 队等)的视角考察整个产品,研究显式规格说明和隐式规格说明,从而发现软件在概念、需求、设计、实现等层面上的缺陷。值得强调的是,测试人员应该主动探究 隐式规格说明,从而拓宽探索的范围。以下是一些常见的隐式规格说明。

  竞争产品。竞争产品不一定是软件,例如笔记软件的竞争者就包括纸质笔记本和铅笔。

  相关产品。软件套装(如Microsoft Office)中的软件往往相互补充、相互约束。

  同一软件的已发布版本。向前兼容可能是非常重要的约束。

  口头讨论、采访、闲聊。

  电子邮件、会议记录、采访记录。

  用户反馈:电话支持记录、论坛讨论、Beta测试反馈。

  技术反馈:软件提交的崩溃信息、错误消息。

  第三方评论:杂志文章、博客文章、社交网络反馈。

  技术标准。所有软件都建立在一系列技术标准之上,某些标准会对测试产生重要影响。

  法律法规。法律可能对软件有强制性约束。

  领域专著。测试财会软件需要学习相关著作,以掌握财会知识。

  测试人员经验。

  Cem Kaner拥有法律学位,对语言文字非常敏感。他认为积极阅读(Active Reading)是探索式测试者需要具备的技能。积极阅读是一个内涵丰富的主题,广受好评的经典书籍包括《如何阅读一本书》 、《探索需求》 和《你的灯亮着吗?》 。

  此外,在功能实现之前,可以通过小组讨论、头脑风暴等方式发掘测试策略和测试思路。针对一个开发中的功能,测试人员可以邀请几个同事,组织一个 测试研讨会。在会议上,大家自由发言,提出自己的测试策略,通过脑力震荡相互启发,从而获得一批观点各异、视角不同的测试策略。会后,测试负责人对这些相 对粗糙的测试思路进行整理,将完善后的结果写入测试计划。

  问:如何评估探索式测试的测试效果?

  答:评估探索式测试结果的前提是测试记录。

  探索式测试者常常在一个固定的时间窗口内(60~120分钟),根据预设的测试目标,对软件进行Z探索式测试。这样的测试活动被称为测程(Session)。

  测程类似于科学实验。一次科学实验大致可以分为以下三个阶段。

  (1)实验设计:确定实验目标。科学实验的常见目的是假设检验,那么此次的假设是什么?

  (2)实验记录:执行实验步骤,并记录实验所发现的点点滴滴。

  (3)实验分析:分析实验数据,总结实验结果,为下一次实验提供目标和假设。

相应地,一次测程包含如下三个阶段。

  (1)测试计划:明确测试目标。测试是获得信息的过程,那么此次测试要获得什么信息?

  (2)测试执行:设计并执行测试用例,记录测试所发现的点点滴滴。

  (3)测试分析:分析并总结测试所发现的信息,为下一次测试提供目标。

  详细的实验记录是科学实验的基本要求之一。同理,详略适当的测试记录也是测试执行的自然结果,是测试评估的基本要求。通常,测试记录可以包含如下内容。

  测试目标:本次测试要提供什么信息?

  测试范围:本次测试覆盖了哪些功能、模块、用户情景?

  测试策略:本次测试使用了何种测试方法?

  缺陷列表。

  在测试过程中发现的疑问,它们值得进一步探索。

  可以复用的测试资源:被测试软件配置、测试数据和测试脚本等。

  测程的耗时。

  测程的时间分配:在测试设计与执行、缺陷调查与报告、测程的启动与结束和非测试活动上各花费了多少时间。

  测试记录可以转化为测试备忘录,供今后的测程参考。测试记录也可以提炼为测试报告,反映当前项目的进展。更重要的是,测试记录是测试评审的素 材。基于测试记录,测试团队可以开发出符合项目语境的评估方法,对测程进行专家评审和定量度量。这有助于度量探索式测试结果,并提出改进方案。

  问:探索式测试只适合测试专家,不适合测试新手?

  答:“探索式测试不适合测试新手”是一种似是而非的说法。第一,所有高效的测试都依赖于测试人员的测试技能 和行业知识。测试专家能够准确地选择测试策略、有效地运用测试方法,因此测试效果更佳。第二,测试新手采用任何测试方法,都需要指导和帮助。这有助于他们 充分利用方法的优点,并避免方法的潜在陷阱。可见,更有意义的问题是:如何帮助测试新手尽快地掌握测试方法,尽快地成长为测试专家?

  从个人发展的角度看,探索式测试有助于测试新手快速学习。探索式测试将学习与应用作为相互支持的活动逐步展开,为测试人员的技能提升提供了平滑 的学习曲线。此外,并行地进行测试学习、测试设计、测试执行和测试评估为测试人员的成长提供了持续、及时、有效的反馈,这有助于他主动学习和快速调整。

  从企业发展的角度看,测试团队应该积极帮助测试新手成长。可以采用的方法包括:为他安排工作导师、评审其测试文档、评审其测试记录、在测程中安 排测试专家与他结对测试、定期进行一对一的会谈等。这些活动会消耗测试团队的人力资源,但是它们是帮助新员工成长最快速、最有效、最廉价的方法。

  Peter Drucker指出:知识工人的创造性(Productivity)要求他们被视为企业的资产(Asset)而不是开销(Cost)。培养高水平测试人员是测试团队和测试领导不可回避的职责。

  问:有什么工具可以支持探索式测试?

  答:本书第5章将讨论探索式测试的工具。这里强调两个基本观点。

  第一,作为一种测试风格,探索式测试可以使用任何开发和测试工具。探索式测试者应该根据语境选择合适的工具,去完成自己的使命。

  第二,软件测试存在大量的创新空间,测试人员应该勇于开发自己的探索式测试工具。

  测试专家James A. Whittaker提出过一种测试工具构建方法,值得测试人员参考。

  (1)寻找缺陷:发现或收集软件的缺陷。

  (2)提炼模式:分析出缺陷的根本原因,编写一个模式,用它捕获相似的缺陷。一个模式是一个结构化的攻击手段,它包含如下内容。

  何时实施该攻击?

  该攻击会捕获何种错误(Fault)?

  利用该攻击如何识别软件失败(Failures)?

  如何实施攻击?

  样例和分析。

  (3)开发自动化工具:识别出攻击过程中机械的部分,编写一个工具去自动化模式的应用。此处的测试自动化不是自动地执行测试用例,而是提供计算机辅助功能,其目的是让计算机完成高负荷运算,让人专注于富有智力挑战的任务。

  按照James的方法实施软件测试,测试团队可以积累一批有益的模式和测试辅助工具。这可以帮助团队更有效地测试现在和未来的项目。

  问:探索式测试能用于测试自动化吗?

  答:本书第6章将讨论探索式测试与测试自动化。这里简单陈述一下笔者的观点。

  测试自动化可以大致分为测试用例自动执行(Automated Test Execution)和计算机辅助测试(Computer-Assisted Testing)。

  对于测试用例自动执行,探索式测试可以提供一批适合自动执行的测试用例。

  对于计算机辅助测试,探索式测试要求人尽其才(自由发挥测试者的智能)和物尽其用(充分利用计算机的性能),利用计算机强大的计算能力去帮助测试人员完成测试使命。

  许多复杂的测试自动化应该以探索式的风格来构造。对于困难的测试,应该先构建简单的测试代码,将其投入测试,利用测试反馈来改进测试代码。然 后,将改进后的测试代码投入测试实践,分析测试反馈,再优化测试代码。所谓探索式测试自动化,就是将学习、设计、实现、评估纳入迭代开发,以逐步提高测试 自动化和产品的质量。

  问:探索式测试与敏捷测试有何关系?

  答:探索式测试在本质上是敏捷的,且可以很好地应用于敏捷项目。

  2001年,17位软件专家在美国犹他州雪鸟(Snowbird)城集会,缔结敏捷联盟,并发表敏捷宣言。与会者之一Brian Marick具有深厚的测试背景,因此软件测试社区对敏捷宣言亦有贡献。

  敏捷软件开发宣言

  我们一直在实践中探寻更好的软件开发方法,身体力行,同时也帮助他人。由此我们建立了如下价值观:

  个体和互动高于流程和工具

  工作的软件高于详尽的文档

  客户合作高于合同谈判

  响应变化高于遵循计划

  也就是说,尽管右项有其价值,我们更重视左项的价值。

  语境驱动测试的基本原则“任何实践的价值都取决于其语境”和“人,在一起工作的人,是项目语境中最重要的部分”,与敏捷宣言的首条价值观“个体 和互动高于流程和工具”不谋而合。高效的探索式测试不但需要优秀的测试人员,也要求测试人员、开发人员、客户和项目关系人紧密协作、频繁互动。

  在思想层面,探索式测试要求测试人员不断地研究产品,通过应对、激励、拥抱变化来驱动对问题空间的积极探索。这不但符合敏捷价值观,也可以应用 于其他类型的测试项目。敏捷测试专家Lisa Crispin和Janet Gregory指出:“敏捷测试可以发生在敏捷项目之外。例如探索式测试,无论它是否应用于敏捷项目,其本质是敏捷的。通过测试逐渐学习产品,并让所学信 息指导测试实践,这无疑符合敏捷价值观:工作的软件和响应变化。”

  在实践层面,探索式测试是评价产品的面向业务测试的主要手段。在用户故事和测试策略的指导下,测试人员会模拟真实用户去测试系统。当一部分代码 被签入,一部分用户故事被实现后,测试人员就会探索新的区域,并逐步完善测试模型和测试策略。随着测试人员对产品的了解,探索式测试不但可以弥补自动化测 试的不足,还可以揭示出更有效的自动化测试区域,为自动化测试设计添砖加瓦。此外,探索式测试能够发掘新情景(Scenario),而这些情景往往会演变 成新的用户故事,从而在需求层面提高产品质量。

  从术语的历史看,“探索式测试”(Exploratory Testing,Cem Kaner提出于1983年)的历史比“敏捷软件开发”(Agile Software Development,敏捷宣言缔结于2001年)更悠久。它们都是在描述已经长期存在但是没有得到合适命名的思想及实践:Cem Kaner用“探索式测试”来描述一种已经长期存在的测试思维,敏捷宣言的缔造者们用“敏捷”来描述他们对软件开发的共识。虽然这些思想来自不同的头脑、 实践和社区,但是它们拥有相似的核心,并可以相互借鉴与补充。


posted @ 2012-09-12 10:27 顺其自然EVO 阅读(158) | 评论 (0)编辑 收藏

软件测试管理之责任

  一个我的大学同学开始做测试管理工作了,开始带徒弟了,在管理上出现了一些问题,想知道我是怎么处理的,我觉的很有必要记录和大家分享,因此就写了。

  我思考整理了一下我这个同学遇见的问题:

  1、多次沟通,开发人员不承认BUG

  2、开发组不会修改BUG

  3、测试人员发现BUG非常少,工作效率低

  我是这样回答她的:

  问题一:多次沟通,开发人员不承认BUG

  对策:在测试环境再现BUG,把问题统计、记录成文档,直接书面提交领导,面对面的和领导以及开发负责人沟通,解决还是不解决,要解决,什么时候解决,说清楚,不解决,发布了,不要说是测试的不负责任,没有报告,不要到了后面不认账。

  问题二:开发组不会修改BUG

  对策1:帮助开发人员分析查找BUG出现的根本原因,找到后,共同协商想办法解决;这一方法只对开发和测试人员能有效沟通,测试人员能力和开发人员能力相当的情况才适用。

  对策2:通过网络资源寻找解决办法;再不行就把问题反馈给上一级领导或其它同事,共同寻求解决办法。

  问题三:测试人员发现BUG非常少,工作效率低

  对策:测 试负责人应分析测试人员发现BUG少,工作效率低的原因,而不是指责测试人员,造成沟通上的不愉快;更不是测试负责人把测试任务一分,测试文档模板给了、 测试文档编写例子给了、所测试的软件业务也讲解了就行了;这样就去埋怨测试新人发现这么少BUG;更不是期望测试新人按照参考给的例子照葫芦画瓢就行。

  在这第三个问题里,让我思考很多:

  面对测试管理上出现的问题,测试负责人第一时间应该更多的是问问自己:我哪个地方做错了呢?为什么会出现这样的现象呢?而不是第一时间去指责当事人和向她们发火,这是不协调的管理行为。

  每个人都是从公司的新人走向老员工,都是从一个应届毕业生走向一个社会。测试新人,她们需要正确的指导。

  ● 在分配任务之前,作为师傅,首先应该了解自己带的徒弟能做什么、适合做什么、有哪些测试特长;做到恰当的分配工作。

  ● 在工作分配时,还要让徒弟能明白你让她做什么,要的东西是什么,她是否能真正明白;做到有效的沟通。

  ● 在工作过程中,多提醒徒弟,碰到问题,先思考,想出自己的方法或想不出方法都要积极的问师傅,师傅再回答问题的过程中,要引导徒弟的思维方式,培养她独立思考、解决问题的方法和思路。

  ● 在工作过程中,要时常检查、关心徒弟工作的情况,发现问题,及时进行指正,这样可以避免能否顺利完成工作的风险。

  ● 刚毕业的学生思维单纯、要教会她们为人处事,要教会她们怎么去学习,没有了师傅,自己怎么能更好的生存。

   我做测试新人的时候,在领导面前,被指责得哭过一回,我至今仍然记得;我很辛苦、很认真的工作、但由于没有和领导有效的沟通,以至文档写的不好,影响产 品评审。也就是在没有好师傅指导的环境里工作了两年,经历了很多事情,让我明白了好师傅应该怎么做,做一个好师傅有多么的困难。

  我也知道,作为新人,面对恶劣的社会竞争,要学会生存,工作上不但要认真、要努力、而且还要积极的发问;环境很重要,人本身的心态和责任心更重要。

  关于这篇文章我可能用到的:

  1、开发不承认bug,记录文档邮件抄送领导。

  找相关人沟通;解不解决(记录);解决时间;不解决(发布不是测试问题,记录留着记录给以后做)

  2、发现的bug开发解决不了要想怎么解决。

  3、测试人员发现bug少,工作效率低不管是个人还是管理都要想为什么会这样,我哪些地方做错了,怎么改进。不是埋怨,不是指责,失误尽量不要设计地下的tester。

  了解你的兵用武之地,才能率领好这个队!

  分配完任务,要让她知道你要的结果是什么,她要做什么,有效沟通。

  师傅、徒弟都逐步遇到问题--思考--问--解决--以后怎么做

  长关心工作情况,及时更正问题

  教会他们为人处世,没有了师傅,怎么才能更好地生存。

版权声明:本文出自 我的乖 的51Testing软件测试博客,欢迎转载......

posted @ 2012-09-12 10:06 顺其自然EVO 阅读(207) | 评论 (0)编辑 收藏

Java中的静态变量、静态方法与静态代码块

 我们知道类的生命周期分为装载、连接、初始化、使用和卸载的五个过程。

  其中静态代码在类的初始化阶段被初始化。而非静态代码则在类的使用阶段(也就是实例化一个类的时候)才会被初始化。

  静态变量

  可以将静态变量理解为类变量(与对象无关),而实例变量则属于一个特定的对象。

  静态变量有两种情况:

  ● 静态变量是基本数据类型,这种情况下在类的外部不必创建该类的实例就可以直接使用

  ● 静态变量是一个引用。这种情况比较特殊,主要问题是由于静态变量是一个对象的引用,那么必须初始化这个对象之后才能将引用指向它。因此如果要把一个引用定义成static的,就必须在定义的时候就对其对象进行初始化。

public class TestForStaticObject{
static testObject o = new testObject (); //定义一个静态变量并实例化
public static void main(String args[]){
//在main中直接以“类名.静态变量名.方法名”的形式使用testObject的方法
}
}

  静态方法

  与类变量不同,方法(静态方法与实例方法)在内存中只有一份,无论该类有多少个实例,都共用一个方法。

  静态方法与实例方法的不同主要有:

  ● 静态方法可以直接使用,而实例方法必须在类实例化之后通过对象来调用。

  ● 在外部调用静态方法时,可以使用“类名.方法名”或者“对象名.方法名”的形式。实例方法只能使用后面这种方式。

  ● 静态方法只允许访问静态成员。而实例方法中可以访问静态成员和实例成员。

  ● 静态方法中不能使用this(因为this是与实例相关的)。

  静态代码块

  在java类中,可以将某一块代码声明为静态的。

static {
//静态代码块中的语句
}

  静态代码块主要用于类的初始化。它只执行一次,并在main函数之前执行。

  静态代码块的特点主要有:

  ● 静态代码块会在类被加载时自动执行。

  ● 静态代码块只能定义在类里面,不能定义在方法里面。

  ● 静态代码块里的变量都是局部变量,只在块内有效。

  ● 一个类中可以定义多个静态代码块,按顺序执行。

  ● 静态代码块只能访问类的静态成员,而不允许访问实例成员。

posted @ 2012-09-11 10:21 顺其自然EVO 阅读(645) | 评论 (0)编辑 收藏

自动化测试基础

 1、什么是自动化测试

  以程序测试程序,以代码代替思维,以脚本的运行代替手工测试。自动化的测试涵盖了:功能(黑盒)自动化测试,功能(白盒)自动化测试,性能测试,压力测试,GUI(Graphical User Interface)测试,安全性测试等。

  2、自动化测试的优势

  回归测试更方便可靠 ;可运行更多,更繁琐的测试,且快速高效;可执行一些手工测试执行相当困难或者做不到的测试,如大量的用户并发;更好的利用资源,具有一致性和可重复性的特点,自动化测试脚本完全可复用;提升了软件的可信度;多环境下测试等。

  3、自动化测试无法做到的事以及劣势

  永远不可能完全替代手工测试,自动化测试无法做到手工测试的覆盖率,不是每个测试用例都适合做成自动化,如建议一个页面的布局是否正确。

  手工测试发现的缺陷远比自动化多。自动化测试是几乎无法发现新缺陷的,最大的用途是用来回归,确保曾经的bug没有在新的版本上重新出现。

  自动化测试工具是死的,它不具备任何想象力。自动化测试的好坏,完全取决于测试工程师。

  成本投入高,风险大。对测试人员的技术要求高,对测试工具同样有要求。

  4、合适引入自动化

  项目周期长,系统版本不断,并且需求不会频繁变更,此时是适合引入自动化测试的。

  系统的测试对象基本可以正常识别,以及对无法识别的控件能否提供一个解决方案。

  系统中不存在大量的第三方控件。

  需要反复测试,如可靠性测试需要进行上千次的系统测试

  5、不适合自动化

  项目周期短,需求频繁变更。即使是周期长的项目,如果经常需求变更,也不适合做自动化。

  软件版本还没有稳定的情况下,主功能或大量功能有被重新更改的可能话,也不适合做自动化。

  没有明确的项目测试自动化计划,措施和管理。

  多数对象无法识别,以及脚本维护频繁与艰难,二者有其一,自动化必定失败。

  6、自动化测试的流程




合理的自动化切入点:通常,项目只有经历了完整的系统测试之后才算具备了基本的引入测试自动化的条件。

  测试自动化分析:

  (1)可行性分析

  (2)抽样demo分析,demo一般选取冒烟测试用例,检查脚本是否能够成功运行通过,已设计的测试点是否全部执行

  (3)测试需求分析,分析哪些功能点准备进行自动化

  测试计划定制:自动化测试计划越全面,后期越能循规蹈矩的去实施,自动化测试的成功率越高

  自动化测试设计阶段:主要分为自动化测试框架和自动化测试用例。

  (1)自动化测试框架的设计,开发与搭建:应能保证测试的分布执行,脚本模块化,数据驱动,日志分析,错误截图,报表回收,共享对象库,公共函数库,环境配置,统一设计模式,异常处理,场景恢复的一个无人值守的,针对每个独立项目的测试框架

  (2)自动化测试用例设计三部曲:手工测试用例是从无到有,然后自动化测试用例是根据手工测试用例来写的。首先,筛选手工测试用例。然后转换手工测试用例,最后新增&补充自动化测试用例。

  为什么不能用手工测试用例完全替代自动化测试用例?

  自动化测试用例的范围往往是核心业务流程或者重复执行率高的,自动化测试的覆盖率不能达到手工测试的覆盖率。自动化测试的用例选择一般以正向为主,而反向的情况却有很多,但是并不是所有反向情况自动化测试都会涵盖,而是有筛选的选取一部分。也并不是所有的手工测试用例都可以用来做自动化的,如页面布局的检查。手工测试可以不需要回原点,但是自动化测试往往是必须的。自动化测试用例与手工测试用例不同,不需要每个步骤都写预期结果。

  测试脚本设计与开发:

  测试脚本大致可划分为五种,

  (1)线性脚本:通过录制直接产生的线性可执行的脚本

  (2)结构化脚本:具有顺序,循环,分支等结构的脚本

  (3)可共享脚本:可以被多个测试用例使用,被其他脚本调用的脚本

  (4)数据驱动脚本:测试数据跟业务流程控制分离的脚本,通过读入数据文件来驱动流程进行的脚本

  (5)关键字驱动脚本:脚本,数据,业务分离,数据和关键字在不同的数据表中,通过关键字来驱动测试业务逻辑。关键字驱动的特点是,它更像是描述一个测试用例在做什么,而不是如何做。

  自动化测试执行:

  (1)无人值守的测试:环境搭建,部署与配置;自动化测试用例与测试脚本相互绑定;自动化测试用例执行顺序排列与组合

  (2)异常处理与场景恢复

  提交自动化测试产物:大致需要提交执行情况,测试结果,分析报表,测试报告,质量情况等。

  测试脚本维护:严格来讲,每个阶段都在做测试脚本维护。一个不值得维护的自动化测试项目是不值得立项的。

posted @ 2012-09-11 10:12 顺其自然EVO 阅读(279) | 评论 (0)编辑 收藏

仅列出标题
共394页: First 上一页 290 291 292 293 294 295 296 297 298 下一页 Last 
<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

导航

统计

常用链接

留言簿(55)

随笔分类

随笔档案

文章分类

文章档案

搜索

最新评论

阅读排行榜

评论排行榜