软件测试第七章软件测试自动化_第1页
软件测试第七章软件测试自动化_第2页
软件测试第七章软件测试自动化_第3页
软件测试第七章软件测试自动化_第4页
软件测试第七章软件测试自动化_第5页
已阅读5页,还剩74页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

软件测试技术,东北大学软件学院吴辰铌,第七章软件测试自动化,主要内容7.1软件测试自动化基础7.2何时进行自动化测试7.3如何进行测试自动化开发7.4对测试自动化的不正确期望7.5JUnit的使用7.6Winrunner的使用,7.1软件测试自动化基础,什么是软件测试自动化?只需购置一种流行的测试执行工具,记录手工测试过程,然后在需要时回放录制的过程。,没这么简单,7.1软件测试自动化基础,软件测试自动化的定义:各种测试活动的管理与实施,包括测试脚本的开发与执行,以便使用一种或多种自动化测试工具来验证需求。,7.1软件测试自动化基础,为什么要进行自动化测试?手工测试的局限性通过手工测试无法做到覆盖所有代码路径。许多与时序、死锁、资源冲突、多线程等有关的错误通过手工测试很难捕捉到。在系统负载、性能测试时,需要模拟大量数据、或大量并发用户等各种应用场合时,也很难通过手工测试来进行。在进行系统可靠性测试时,需要模拟系统运行十年、几十年,以验证系统能否稳定运行,也是手工测试无法模拟的。如果有大量(几千)的测试用例,需要在短时间内完成,手工测试又怎么办呢?测试可以发现错误,并不能表明程序的正确性。,7.1软件测试自动化基础,为什么要进行自动化测试?机器代替人可以更频繁的测试每一次做同样的测试做更多的测试减少了烦闷的、重复性的工作。可用时间来检查结果。更多的时间用来做手工测试和寻找Bugs。,7.1软件测试自动化基础,为什么要进行自动化测试?自动化可进行一些高难度的测试性能,压力,配置一致性性能测试,回归测试可重复使用稳定性增进测试人员与开发人员之间的合作伙伴关系,7.1软件测试自动化基础,什么情况下适合使用自动化测试工具?需要反复进行的工作。负载压力测试。大量的测试人员和开发人员合作完成一个产品。需要进行测试系统后台或者内部的性能特性,进而进行故障定位和性能调优。,7.1软件测试自动化基础,自动化测试的局限性:定制型项目。周期很短的项目。业务规则复杂的对象。人体感观与易用性测试。不稳定的软件。涉及物理交互。,7.1软件测试自动化基础,假如一个功能测试用例,手工运行需要10分钟,而为此测试用例开发脚本需要4个小时,即240分钟,那么意味着这个测试脚本要被运行24次收回成本,如果再加上测试脚本的维护工作量(10),需要重复运行4050次,才收回成本。如果在产品的一个版本中要进行23轮测试(一般是需要的),这个产品需要发布1520个版本才收回成本。所以业界常说,产品发布7个版本才收回成本。,7.1软件测试自动化基础,测试自动化成本/收益分析,7.1软件测试自动化基础,手工测试与自动化测试的特点对比:在系统功能逻辑测试、验收测试、适用性测试、涉及物理交互性测试时,多采用黑盒测试的手工测试方法;单元测试、集成测试、系统负载或性能、稳定性、可靠性测试等比较适合采用TA;对那种不稳定软件的测试、开发周期很短的软件、一次性的软件等不适合测试自动化工具本身并没有想象力和灵活性,根据经验报道,自动测试只能发现15%的缺陷,而手工测试可以发现85%的缺陷;TA工具在进行功能测试时,其准确的含义是回归测试工具,因为工具不能发现更多的新问题,但可以保证对已经测试过部分进行测试的准确性和客观性,7.1软件测试自动化基础,什么测试类型能够自动化:单元测试集成测试系统测试性能测试压力测试安全测试回归测试稳定性测试,7.1软件测试自动化基础,测试自动化的基本结构,7.1软件测试自动化基础,自动化测试的原理和方法代码分析:类似于高级编译系统,在工具中定义类/对象/函数/变量等定义规则、语法规则等,在分析时对代码进行语法扫描,找出不符合编码规范的地方。代码分析是一种白盒测试的自动化方法。捕获和回放:捕获和回放则是一种黑盒测试的自动化方法。,7.1软件测试自动化基础,自动化测试的原理和方法脚本技术:线性脚本,是录制手工执行的测试用例得到的脚本,这种脚本包含所有的击键、移动、输入数据等,所有录制的测试用例都可以得到完整的回放。结构化脚本,类似于结构化程序设计,具有各种逻辑结构、函数调用功能。结构化脚本易于维护。共享脚本,是指某个脚本可以被多个测试用例使用。数据驱动脚本,将测试输入存储在独立的(数据)文件中,而不是存储在脚本中。关键字驱动脚本,是数据驱动脚本的逻辑扩张,7.1软件测试自动化基础,自动化测试的原理和方法自动比较:静态比较和动态比较简单比较和复杂比较敏感性测试比较和健壮性测试比较比较过滤器测试管理,7.1软件测试自动化基础,自动化测试工具的分类:单元测试工具:PanaramaJunitC+Testing负载和性能测试工具:LoadRunnerWASQALoad,7.1软件测试自动化基础,自动化测试工具的分类:功能测试工具:WinRunnerQuickTestRationalFunctionalTester测试管理工具:TestDirectorTestManagerTrackRecord,7.1软件测试自动化基础,测试工具的选择,7.2何时进行自动化测试,自动化测试投资阶段:早投资在设计时考虑,Planning(M0),MajorMilestonePhaseM1,2,ReleasePhase,Time,TestingInvestment,TestingPhase,7.3如何进行测试自动化开发,测试自动化的开发流程:自动测试决定测试工具获取自动测试引入过程测试计划、设计与开发测试执行与管理测试评审和评估,7.3如何进行测试自动化开发,自动化测试生存周期方法学,1.自动化测试决定,2.测试工具获取,3.自动化测试引入过程,4.测试计划、设计与开发,5.测试执行管理,6.测试评审与评估,A.系统生存周期过程评估与改进,F.生成维护阶段,C.小型工具先导/原型,D.系统设计与开发阶段,B.业务分析与需求阶段,E.组装与测试阶段,7.3如何进行测试自动化开发,测试自动化的开发过程中需要考虑的问题:测试需求:除用户需求外,应明确概述能够在大限度发现错误所需要的测试条件。遵循一定的测试框架。最大限度的发挥重用。,7.4对自动化测试的不正确期望,我们在时间上是紧迫的,项目已经落后了,让我们使用自动化测试吧!我们要100%的实现测试自动化。我们不需要进行培训。,7.4对测试自动化的不正确期望,正确认识测试自动化不现实的期望注定测试自动化的失败测试自动化能:显著降低重复手工测试的时间建立可靠、重复的测试,减少认为错误增强测试质量和覆盖率测试自动化不能:完全替代手工测试和手工测试工程师保证100%的测试覆盖率弥补测试实践的不足,7.5JUnit的使用,7.5.1JUnit简介7.5.2JUnit的设计方法7.5.2JUnit的使用步骤7.5.3测试惯例,7.5.1JUnit简介,在JUnit中编写的测试帮助你以一种极大(extreme)的步伐编写程序及快速的找出缺点。JUnit非常简单JUnit测试检验其结果并提供立即的回报。JUnit可以把测试组织成测试系列JUnit测试是开发者测试。JUnit测试是以Java写成的,形成一个介于测试及程序代码间的无缝(seamless)边界JUnit是免费的JUnit是以两个关键设计样式来设计的:指令样式(Commandpattern)及合成样式(Compositepattern)。TestCase是一个指令对象。任何包含测试方法的类别都是TestCase的子类别。TestCase可以定义任意数量的testXXX()方法。当你要检查期望与实际的测试结果,你激活assert()方法的各种类型(variaton)。,7.5.2JUnit的设计,TestCase子类别包含多个testXXX()方法;可以使用setUp()及tesrDown()方法初始化及释放测试下的任何一般的对象,这个子类别形同测试的基础设备(fixture)。每一个测试在其本身基础设备的背景下执行,在每一个测试方法之前呼叫setUp()及之后呼叫tearDown()以确保没有副作用影响测试的执行。,7.5.2JUnit的设计,TestCase实例对象可以合成为TestSuite层级架构;在这个TestSuite层级架构中可以自动激活定义在TestCase实例对象中的所有testXXX()方法。一个TestSuite是其它多个测试的一个合成对象(composite),其中包括TestCase实例对象及其它的TestSuite实例对象。这个由TestSuite代表的合成对象行为允许你组合测试的测试系列的测试系列到任意深度,并且自动一致性(uniformly)的执行所有测试以产出个别的通过或失败的状态。,7.5.3JUnit的使用步骤,第一步编写一个测试案例第二步编写一个测试系列第三步执行测试第四步组织测试,7.5.3JUnit的使用步骤,第一步:编写一个测试案例(1)定义一个TestCase的子类别。(2)覆写setUp()方法以初始化测试中的一个或多个对象。(3)覆写tearDown()方法以释放测试中的一个或多个对象。(4)定义一个或多个公开的testXXX()方法;这些方法检验这些测试中的对象并且评估期望的结果。,7.5.3JUnit的使用步骤范例代码1,下列是一个测试案例的范例:测试案例的范例(ExampleTestCase)importjunit.framework.Test;importjunit.framework.TestCase;importjunit.framework.TestSuite;publicclassShoppingCartTestextendsTestCaseprivateShoppingCart_bookCart;privateProduct_defaultBook;/*以特定名称建构一个ShoppingCartTest。建构函数是以测试案例的名称当作参数*/publicShoppingCartTest(Stringname)super(name);,7.5.3JUnit的使用步骤范例代码2,/*设定测试设备在测试案例方法之前呼叫*/protectedvoidsetUp()_bookCart=newShoppingCart();_defaultBook=newProduct(ExtremeProgramming,23.95);_bookCart.addItem(_defaultBook);/*释放测试设备在测试案例方法之后呼叫*/protectedvoidtearDown()_bookCart=null;,7.5.3JUnit的使用步骤范例代码3,/*测试在cart中增加一个产品*/publicvoidtestProductAdd()ProductnewBook=newProduct(Refactoring,53.95);_bookCart.addItem(newBook);doubleexpectedBalance=_defaultBook.getPrice()+newBook.getPrice();assertEquals(expectedBalance,_bookCart.getBalance(),0.0);assertEquals(2,_bookCart.getItemCount();/*测试清空cart*/publicvoidtestEmpty()_bookCart.empty();assertTrue(_bookCart.isEmpty();,7.5.3JUnit的使用步骤范例代码4,/*测试从cart中移除产品如果此产品不在cart中丢出一个ProductNotFoundException的例外*/publicvoidtestProductRemove()throwsProductNotFoundException_bookCart.removeItem(_defaultBook);assertEquals(0,_bookCart.getItemCount();assertEquals(0.0,_bookCart.getBalance(),0.0);/*测试从cart中移除一个未知的产品如果ProductNotFoundException例外产生表示测试成功*/publicvoidtestProductNotFound()tryProductbook=newProduct(EndersGame,4.95);_bookCart.removeItem(book);fail(ShouldraiseaProductNotFoundException);catch(ProductNotFoundExceptionsuccess)/测试成功,7.5.3JUnit的使用步骤范例代码5,/*组合并传回一个这个测试案例所有测试方法的测试系列传回一个非空值(non-null)的测试系列*/publicstaticTestsuite()/这里使用的想法是加入所有的testXXX()方法到测试系列中。/TestSuitesuite=newTestSuite(ShoppingCartTest.class);/下面是另一种作法,但增加愈多的测试案例方法愈有可能发生错误/TestSuitesuite=newTestSuite();/suite.addTest(newShoppingCartTest(testEmpty);/suite.addTest(newShoppingCartTest(testProductAdd);/suite.addTest(newShoppingCartTest(testProductRemove);/suite.addTest(newShoppingCartTest(testProductNotFound);/returnsuite;,7.5.3JUnit的使用步骤范例代码6,/*执行此测试案例(Runsthetestcase)*/publicstaticvoidmain(Stringargs)junit.textui.TestRunner.run(suite();/范例代码结束,7.5.3JUnit的使用步骤,第二步:编写一个测试系列编写一个测试系列其中包含许多测试案例。此测试系列将允许我们从头到尾执行其所有的测试案例。编写测试系列请依循下列的步骤:(1)定义一个TestCase的子类别。(2)定义一个静态的suite()工厂方法;这个方法构建一个TestSuite以包含所有的测试。(3)随意定义一个main()方法以批次方式执行这个TestSuite。,7.5.3JUnit的使用步骤代码范例1,下列是测试系列的范例:测试系列范例(ExampleTestSuite)importjunit.framework.Test;importjunit.framework.TestCase;importjunit.framework.TestSuite;publicclassEcommerceTestSuiteextendsTestCase/*以特定名称建构一个EcommerceTestSuite建构函数是以测试案例的名称当作参数*/publicEcommerceTestSuite(Stringname)super(name);,7.5.3JUnit的使用步骤代码范例2,/*组合并传回一个测试系列包含所有已知的测试。新的测试应该在此加入传回一个非空值(non-null)的测试系列*/publicstaticTestsuite()TestSuitesuite=newTestSuite();/我们在前面构建的ShoppingCartTestsuite.addTest(ShoppingCartTest.suite();/另一个测试系列的范例,在测试系列中加入其它的测试系列suite.addTest(CreditCardTestSuite.suite();returnsuite;/*执行此测试系列*/publicstaticvoidmain(Stringargs)junit.textui.TestRunner.run(suite();,7.5.3JUnit的使用步骤,第三步执行测试我们可以执行这个测试系列或者其中任何个别的测试案例。执行TestSuite将自动执行所有的TestCase及TestSuite实例对象。执行一个TestCase将自动激活其所有公开的testXXX()方法。JUnit提供文字及图形使用者界面。两种使用者接口都可以指出多少个测试被执行、任何错误或失败、及一个简单的完成状态。简化使用者接口是快速执行测试的关键。你应该简单了解就能够执行你的测试并知道测试的状态,就像你在编译上所做的一样。文字使用者接口(junit.textui.TestRunner)如果通过所有测试则显示OK而如果失败则显示失败讯息。图形使用者界面(junit.swingui.TestRunner)显示浮动窗口;如果所有测试皆通过则其中有一个进度杆显示为绿色,否则进度杆显示为红色。一般而言,TestSuite及TestCase类别应定义一个main()方法;main()利用适当的使用者接口。我们写的测试到目前为止皆定义一个main()方法来使用文字使用者接口。由main()定义的使用文字使用者接口执行我们的测试案例时,使用:javaShoppingCartTest另一种方式,使用文字使用者接口执行测试,使用:javajunit.textui.TestRunnerShoppingCartTest或这使用图形使用者接口时,使用:javajunit.swingui.TestRunnerShoppingCartTestEcommerceTestSuite可以以类似的方法执行。,7.5.3JUnit的使用步骤,第四步:组织测试把测试案例建立在与我们要测试的程序代码相同的包裹(package)中。在你的原始码资料夹中避免结合应用程序与测试程序代码,建立一个镜像(mirrored)的资料夹结构对应于此包裹结构;并在镜像资料夹中存放你的测试码。为你的应用程序中的Java包裹定义一个TestSuite类别;在这个TestSuite类别中包含所有测试这个包裹内之程序的测试。定义类似的TestSuite类别;此TestSuite类别在此应用程序中的其它包裹(及子包裹)中构建高层及低层测试系列。确认你的建构程序包含所有测试的编辑物(compilation)。这样做有助于确认你的测试可以保持与最后的程序代码同步以维持测试是最新的。经由在每一个Java包裹中建立一个TestSuite,在各种包裹层次中,你可以在每一个抽象层中执行一个TestSuite。例如,你可以定义一个com.mydotcom.AllTests执行系统中所有的测试,及定义一个com.mydotcom.ecommerce.EcommerceTestSuite只有执行电子交易组件的测试。测试层级架构可以扩充到任意的深度。其深度与你开发系统的抽象层次有关,你可以执行一个相称的测试。只要选择你的系统层次并测试它即可。,7.5.3JUnit的使用步骤,测试层级架构范例(ExampleTestingHierarchy)AllTests(Top-levelTestSuite)SmokeTestSuite(StructuralIntegrityTests)EcommerceTestSuiteShoppingCartTestCaseCreditCardTestSuiteAuthorizationTestCaseCaptureTestCaseVoidTestCaseUtilityTestSuiteMoneyTestCaseDatabaseTestSuiteConnectionTestCaseTransactionTestCaseLoadTestSuite(PerformanceandScalabilityTests)DatabaseTestSuiteConnectionPoolTestCaseThreadPoolTestCase,7.5.4测试习惯,当你测试时请谨记下面的事项:(1)软件运作良好的事物都是经过测试检验的(2)测试一点点,程序代码写一点点,测试一点点,程序代码写一点点.(3)请确认所有测试都能100通过(4)每天至少执行系统中所有的测试一次(5)要测试的程序代码是最可能错误的区域。(6)编写最可能回报测试投资的测试。(7)如果你使用System.out.println()除虫,写一个测试自动检查其结果。(8)如果发现臭虫,写一个测试揭露这个臭虫。(9)如果下次有人要求你帮他除虫,帮他写一个测试。(10)编写程序代码之前先写单元测试;而且只有当一个测试失败才写新的程序代码。,7.6WinRunner的使用,WinRunner简介企业级软件功能测试工具录制回放功能适用于不同的开发工具使用方便,脚本易于维护,7.6WinRunner的使用,两种记录(Recording)模式,7.6WinRunner的使用,WinRunnerAdd-In管理WinRunner在ContextSensitive记录模式下是通过先识别GUI对象、然后根据用户操作来产生相应的Function加到Script中对于不同开发语言(环境),GUI对象的识别需要不同的Add-In即使有对应的Add-In,WinRunner仍然不能很好地识别自己开发的GUI对象(如DelphiVCL),后面将专门讲如何解决,7.6WinRunner的使用,记录Script1、先将光标移动到要插入Script的地方2、启动要录制的Application3、按红色按钮开始录制4、停止录制,7.6WinRunner的使用,三种运行模式UpdateUpdate模式用于更新Verfiy方式允许用到的各种Checkpoint比较的基准(Baseline)Checkpoint将在后面提到VerifyVerify模式指正式运行DebugDebug模式用于调试。,结果都会保存在Script保存的目录下,7.6WinRunner的使用,SynchronizationPoint三种同步方式:GUI对象属性、GUI对于位图、屏幕位图(Bitmap)使用同步点主要用于测试Script的下一步必须等待某一特定条件满足后才可以运行同步最长等待时间为obj_wait_info制定的时间加上GeneralOption-Run-DelayforwindowSynchronization指定的时间在某种意义上Synchronization可以用CheckPoint来代替,7.6WinRunner的使用,Checkpoint三类CheckPoint:GUI对象、Bitmap、数据库CheckPoint最长等待时间在GeneralOption-Run-TimeoutforCheckpointandCSstatements,7.6WinRunner的使用,数据库CheckPoint三种数据库CheckPoint:Default、Custom、RuntimeDefault和Custom用于纯粹的数据库检查(不和前台GUI内容比较),Runtime将把数据中的内容和前台界面中的GUI对象的某一属性值进行比较Default和Custom的不同在于Custom在最后将调出CheckList编辑窗口,7.6WinRunner的使用,使用数据库CheckPoint注意使用数据库CheckPoint应该注意输入SQL的合法性,保证在CheckList编辑窗口中的属性都是可以比较的。,7.6WinRunner的使用,使用RuntimeCheckPointRuntimeCheckpoint用于在运行时刻比较数据库中的内容和Application中某些GUI的特定属性是否相符注意,RuntimeCheckpoint只能直接比较,对于某些经过转换,若TRUE则某个Checkbox被选中这类是无法比较的,如果要进行这类比较,可以考虑先使用GUICheckpoint,然后使用一般的数据库Checkpoint,7.6WinRunner的使用,动态更新SQL数据库Checkpoint使用的SQL语句保存在Script目录下的Chklist目录下在实际使用中,特别是使用数据驱动(数据驱动将在后面提到)时候对数据库的效验往往要修改SQL中的某一参数,对于这中情况,可以通过I/OFunctions或者一段Script在进行数据库Check前修改数据库Checkpoint使用的sql语句,7.6WinRunner的使用,不使用Update方式修改BaseLineCheckPoint可以通过菜单Insert下的EditXXXCheckList来修改对于一般的数据库CheckPoint,如果由于某种特殊原因修改返回内容的baseline,可以通过菜单Tools-TestResult打开任何一个测试结果双击数据库Checkpoint点打开数据库CheckResult结果窗口来修改,7.6WinRunner的使用,修改BaseLine(ExpectedValue),7.6WinRunner的使用,数据驱动(DataDrived)数据驱动的来源可以有EXCEL或者TXT文件,建议不使用TXT文件数据驱动的主要函数可以看TSL帮助Data-DrivenTestFunctions注意EXCEL可以采用写方式打开,这样可以把结果写回到EXCEL中,7.6WinRunner的使用,使用DataDriverWizard注意:使用Wizard前要先选择要包括的语句,7.6WinRunner的使用,选择数据表(EXCEL)保存位置,7.6WinRunner的使用,为数据选择列名称,7.6WinRunner的使用,直接在Excel中修改数据,7.6WinRunner的使用,修改DataDriver产生的语句table=default.xls;rc=ddt_open(table,DDT_MODE_READ);if(rc!=E_OK,注意:DDT_OPEN可以采用写方式打开,7.6WinRunner的使用,使用GUIconfig使用GuiConfig的主要目的是修改WinRunner学习中的错误让WinRunner学习一些非开发环境标准控间的GUI对象,7.6WinRunner的使用,使用GUIConfig增加新的GUI类,7.6WinRunner的使用,GUI类的三类属性对于一个GUI类,WinRunner将其的属性分为三类:Available、Obligatory、OptionalObligatory值必须记录的属性,WinRunner一般通过Obligatory类别中的属性来区别同一窗口(或GUI容器)下同类的GUI对象Optional指可选项,当WinRunnber无法通过Obligatory中的属性来识别同一类GUI对象时候,将使用Optional中的属性,7.6WinRunner的使用,修改GUI类的识别方式Step1,7.6WinRunner的使用,修改GUI类的识别方式Step2对于一个新增加的GUI对象,如果可以的话,尽量从MappedtoClass中选择一个相似的类如果无法从MappedtoClass中选择一个相似的,而且在scirpt运行时发现WinRunner无法识别该对象,就要考虑修改Obligatory或Optional列表中内容(建议修改Obligatory),7.6WinRunner的使用,使用GUIMapEditor主要目的是用来修改WinRunner识别后的GUI对象的属性值,主要是使用通配符(wildcard)来替代某些属性保存和导入GUIMap文件注意:当你录制完某一Script必须保存GUIMap否则一但退出WinRunner由于GUIMap不存在,以后将很可能无法运行已前录制好的Script。建议:将GUIMap文件和Script保存在同一目录,将Script第一行使用GUI_load装入Script使用到的GuiMap文件,7.6WinRunner的使用,使用通配符来识别GUI对象,7.6WinRunner的使用,通配符列表,7.6WinRunner的使用,使用自定义函数in、out、inout类型参数使用TSL函数要特别注意TSL并不检查你调用某一函数时候参数格式和类型是否匹配参数可以是GUI对象,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论