1、软件质量保证与测试课内实验指导书白盒测试黑盒测试docx软件质量保证与测试课内实验指导书第一章白盒测试1.1白盒测试背景知识结构性测试是知道产品内部工作过程,检测产品内部动作是否按照规格说明书的规定正 常进行。结构性测试允许测试人员利用程序内部的逻辑结构及有关信息,设计或选择测试用 例,对程序所有逻辑路径进行测试。通过在不同点检查程序的状态,确定实际的状态是否与 预期的状态一致。1.1.2逻辑覆盖结构性测试力求提高测试覆盖率。逻辑覆盖是一系列测试过程的总称,它是在使用口盒 测试法时,选用测试用例执行程序逻辑路径的方法。逻辑覆盖按覆盖程度由低到高大致分为以下儿类:1.语句覆盖:设计若干测试用例,
2、使程序中每一可执行语句至少执行一次;2.判断覆盖:设计用例,使程序中的每个逻辑判断的取真取假分支至少经历一次;3.条件覆盖:设计用例,使判断屮的每个条件的可能取值至少满足一次;4.判断/条件覆盖:设计用例,使得判断中的每个条件的所有可能结果至少出现一次,而且判断木身所有可能结果也至少出现一次;5.条件组合覆盖:设计用例,使得每个判断表达式中条件的各种对能组合都至少出现一次;显然,满足的测试用例也一定是满足、的测试用例。6.路径覆盖。设计足够的测试用例,使程序的每条町能路径都至少执行一次。如果把路径覆盖和条件组介覆盖结介起来,可以设计出检错能力更强的测试数据川例。1.1.2基本路径测试如果把覆盖
3、的路径数压缩到一定限度内,例如,程序中的循环体只执行零次和一次,就 成为基本路径测试。它是在程序控制流图的基础上,通过分析控制构造的环路复杂性,导出 基本对执行路径集合,从而设计测试用例的方法。设计出的测试用例要保证在测试中,程序 的每一个可执行语句至少要执行一次。1程序的控制流图控制流图是描述程序控制流的一种图示方法。符号O称为控制流图的一个结点,一组顺 序处理框可以映射为一个单一的结点。控制流图屮的箭头称为边,它表示了控制流的方向, 在选择或多分支结构中分支的汇聚处,即使没有执行语句也应该有一个汇聚结点。边和结点 圈定的区域叫做区域,当对区域计数时,图形外的区域也应记为一个区域。2计算程序
4、坏路复杂性进行程序的棊本路径测试时,程序的环路复杂性给出了程序基本路径集合中的独立路径 条数,这是确保程序中每个可执行语句至少执行-次所必需的测试用例数目的上界。所谓独立路径,是指包括一组以前没冇处理的语句或条件的一条路径。只要设计出的测 试用例能够确保这些基本路径的执行,就可以使得程序中的每个可执行语句至少执行一次, 每个条件的取真分支和取假分支也能得到测试。基本路径集不是唯一的,対于给定的控制流图,可以得到不同的基本路径集。通常环路复杂性可用以下三种方法求得。*将环路复杂性定义为控制流图屮的区域数。*设左为控制流图的边数,N为图的结点数,则立义环路复朵性为V(G) = EN + 2。*若设
5、P为控制流图中的简单判定结点数,则冇V(G) = P+lo3导出测试用例利用逻辑覆盖方法牛成测试用例,确保基本路径集中每条路径的执行1.2测试题目1.2.1三角形问题1.2.1.1三角形问题的描述三角新问题接受三个整数a,b和c作为输入,用作三角形的边。程序的输入是由这三条 边确定的三角形类型:等边三和形、等腰三和形、不等边三和形或非三和形。1.2.1.2三角形问题描述的细化三角形问题接受三个整数a,b和c作为输入,用作三角形的边。整数a,b,c必须满足以下 条件:/ cl. lWaW200“ c2.1WbW200/ c3. 1WcW200/ c4.ab+c丁 c5.bva+c丁 c6. ca
6、+b程序的输出是有着三条边确定的三角形类型:等边三角形、等腰三角形、不等边三角形或非三角形。如果输入值没有满足这些条件中的任何一个,则程序会通过输出消息来进行通知。如果a,b和c的取值满足cl,c2和c3,则给出以下四种相互排斥输出中的一个:如果三条边相等,则程序的输出是等边三和形;如果恰好有两条边相等,则程序的输出是等腰三角形;如果没冇两条边想相等,则程序输出的是不等边三角形。如果c4,c5和c6中有一个条件不满足,则程序输出的是非三角形。1.2.1.3主要代码见附件中Project1.2.1.4 要求1.根据以上的C+代码画出该程序的流程图;2.根据流程图,用口盒测试的用例设计方法设计测试
7、用例实现:语句覆盖、判定覆盖、 条件覆盖、条件判定覆盖以及条件组介覆盖;3.根据代码画出程序的流图,根据流图计算图的复杂度,计算出基本路径的条数,并给 出基本路径;4.根据基本路径覆盖法设计测试用例,覆盖3中得到的基本路径;1.2.2NextDate 问题1.2.2.1 NextDate问题的描述 NextDate是一个有三个变量(月份、日期和年)的函数。函数返冋输入日期厉而的那个 日期。变量月份、日期和年都具有整型值,则满足一下条件:/ cl. 1 月份 12/ c2. 1 Fl 期 31/ c3.1812 年 2012可以使规格说明更具体,包括对FI期、月份和年的无效输入值的响应定义。还可
8、以对 无效逻辑组介定义1.2.2.2NextDate问题的主要代码见附件中的project1.2.2.3要求1.根据以上的C+代码画出该程序的流程图;2.根据流程图,用白盒测试的用例设计方法设计测试用例实现:语句覆盖、判定覆盖、条 件覆盖、条件判定覆盖以及条件组合覆盖;3.根据代码画出程序的流图,根据流图计算图的复杂度,计算出基本路径的条数,并给出 基本路径;4.根据基木路径覆盖法设计测试用例,覆盖3屮得到的基木路径;第二章黑盒测试黑盒测试也称功能测试,它是通过测试来检测每个功能是否都能正常使用。在测试中, 把程序看作一个不能打开的黑盒子,在完全不考虑程序内部结构和内部特性的情况下,在程 序接
9、口进行测试,它只检杳程序功能是否按照需求规格说明书的规定正常使用,程序是否能 适当地接收输入数据而产牛正确的输出信息。黑盒测试着眼于程序外部结构,不考虑内部逻 辑结构,主要针对软件界而和软件功能进行测试。2.1.1等价类划分法筹价类划分的办法是把程序的输入域划分成若干部分(子集),然后从每个部分中选取 少数代表性数据作为测试用例。每一类的代表性数据在测试中的作用等价于这一类中的其他 值。该方法是一种重要的,常用的黑盒测试用例设计方法。2.1.1.1划分等价类划分等价类:等价类是指某个输入域的子集合。在该子集合中,各个输入数据对于揭 露程序屮的错误都是等效的,并合理地假定:测试某等价类的代表值就
10、等于对这一类其它值 的测试.因此,可以把全部输入数据合理划分为若干等价类,在每一个等价类中取一个数据 作为测试的输入条件,就可以用少量代表性的测试数据.取得较好的测试结果。等价类划分 可有两种不同的情况:有效等价类和无效等价类。冇效等价类:是指对于程序的规格说明来说是合理的,冇意义的输入数据构成的集合. 利用有效等价类可检验程序是否实现了规格说明中所规定的功能和性能。无效等价类:与有效等价类的定义恰巧和反。设计测试用例时,要同时考虑这两种等价类.因为,软件不仅要能接收介理的数据,也 要能经受意外的考验。这样的测试才能确保软件具有更高的町靠性。2.1.1.2划分等价类准则划分等价类的方法:下而给
11、出六条确定等价类的原则.1在输入条件规定了取值范围或值的个数的情况下,则可以确立一个有效等价类和两个无效等价类.2在输入条件规定了输入值的集合或者规定了“必须如何”的条件的情况下,nJ确立一 个有效等价类和一个无效等价类.3在输入条件是一个布尔量的情况下,可确定一个有效等价类和一个无效等价类.4在规定了输入数据的一组值(假定n个),并且程序要对每一个输入值分别处理的 情况下,可确立n个有效等价类和一个无效等价类.5在规定了输入数据必须遵守的规则的情况下,可确立一个有效等价类(符介规则) 和若干个无效等价类(从不同角度违反规则).6在确知已划分的等价类中各元素在程序处理中的方式不同的情况下,则应
12、再将该等 价类进一步的划分为更小的等价类.2.1.1.3设计测试用例的步骤在确立了等价类后,可建立等价类表,列出所有划分出的等价类:输入条件划分冇效等价类与无效等价类。然后从划分出的等价类中按以下三个原则设计 测试用例:1为每一个等价类规定一个唯的编号;2设计一个新的测试用例,使其尽可能多地覆盖尚未被覆盖地冇效等价类,重复这一 步。直到所有的有效等价类都被覆盖为止;3设计一个新的测试用例,使其仅覆盖一个尚未被覆盖的无效等价类,重复这一步, 直到所冇的无效等价类都被覆盖为止。2.1.2边界值分析法边界值分析是通过选择等价类边界的测试用例。边界值分析法不仅重视输入条件边界, 而且也必须考虑输出域边
13、界。它是对等价类划分方法的补充。2.1.2.1边界值分析方法的考虑:长期的测试工作经验告诉我们,大量的错误是发生在输入或输出范围的边界上,而 不是发生在输入输出范围的内部.因此针对各种边界情况设计测试用例,可以杳出更多的错使用边界值分析方法设计测试用例,首先应确立边界情况.通常输入和输出等价类 的边界,就是应着重测试的边界情况.应当选取正好等于,刚刚大于或刚刚小于边界的值作 为测试数据,而不是选取等价类中的典型值或任意值作为测试数据.2.1.2.2基于边界值分析方法选择测试用例的原则:1.如果输入条件规沁了值的范闌,则应取刚达到这个范闌的边界的值,以及刚刚超越这个范I书I边界的值作为测试输入数
14、据;2如果输入条件规赵了值的个数,则用最大个数,最小个数,比最小个数少一,比最大个数多一的数作为测试数据;3根据规格说明的每个输出条件,使用前面的原则;4.根据规格说明的每个输出条件,应用前面的原则;5.如果程序的规格说明给出的输入域或输出域是有序集合,则应选取集合的第一个元素和最后一个元素作为测试用例;.如果程序中使用了一个内部数据结构,则应当选择这个内部数据结构的边界上的值作为 测试用例;7.分析规格说明,找出其它町能的边界条件。2.1.2.3边界值分析中的两种假设边界值分析中基于两种假设:1.根据缺陷的数暈边界值分析分为两类:单缺陷假设和多缺陷假设;2.根据健壮性的考虑边界值分析分为两类
15、:非健壮性分析和健壮性分析。2.2测试题目2.2.1三角形问题问题的描述如上一章中1.2.1节的描述2.2.2NextDate 问题问题的描述如上一章中122节的描述2.2.3黑盒测试要求1.根据题目中给出的三角形问题和NextDate问题的需求说明书,按照等价类划分法,设 计测试用例,覆盖所有的等价类;2.根据题目小给出的三角形问题和NextDate问题的需求说明书,按照边界值分析法,设 计测试用例,进行功能性测试。边界值分析法需要包含:小缺陷假设非健壮性假设;多缺陷假设非健壮性假设;单缺陷假设假装性假设;最坏情况测试。第三章自动测试工具Nimit的使用NUnit是一个单元测试框架,专门针对
16、于.NET来写的。其实在前面冇JUnit(Java), CPPUnit(C+),他们都是xUnit的一员。最初,它是从JUnit而來。现在的版本是2.5.2。接 下来我所用的都是基于这个版本。NUnit 最初是由 James W. Newkirk, Alexei A. Vorontsov 和 Philip A. Craig,后来开发 团队逐渐庞人起来。在开发过程中,Kent Beck和ErichGamma2位牛人也提供了许多帮助。 看來对于NUM还真是下了一番力气了NUnit是xUnit家族种的笫4个主打产品,完全由C#语言來编写,并且编写时充分利用 了许多。NET的特性,比如反射,客户属性等
17、等。最重要的一点是它适介于所有.NET语言。3.1 NUnit 介绍图3.1 NUnit运行效果从中我们町以非常容易发现,右边是个状态条,图1是红色的,图2是绿色的.为什么会这样 呢?因为如果所有测试案例运行成功,就为绿色,反之如果有一个不成功,则为红色,但也有黄色 的.左面的工作域内则是我们写的每一个单元测试.通过上面的图片,我想你对NUnit冇个总的了解了.接下來还是分为2个部分,一是NUnit的布局,另外一部分就是它的核心概念.首先熟悉一下NUnit GUI的布局.让我们更进一步看一下测试运行器窗口的布局。在右边面板的中间,可以看到测试进度 条。进度条的颜色反映了测试执行的状态:绿色描述
18、目前所执行的测试都通过黄色意味某些测试忽略,但是这里没有失败红色表示有失败底部的状态条表示下而的状态:状态说明了现在运行测试的状态。当所冇测试完成时,状态变为Completed. 测试中,状态是Running: (是正在运行的测试名称)。Test Cases说明加载的程序集中测试案例的总个数。这也是测试树里叶子节点的个数。Tests Run已经完成的测试个数。Failures到目前为止,所有测试中失败的个数.Time显示运行测试时间(以秒计)File主菜单有以下内容:New Project允许你创建一个新工程。工程是一个测试程序集的集合。这种机制让 你组织多个测试程序集,并把他们作为一个组对待
19、。Open加载一个新的测试程序集,或一个以前保存的NUnit I程文件。Close关闭现在加载的测试程序集或现在加载的NUnit工程。Save保存现在的Nunit I程到一个文件。如果正工作单个程序集,本菜单项允许 你创建一个新的NUnit工程,并把它保存在文件里。Save As允许你将现有NUnit工程作为一个文件保存。Reload强制重载现有测试程序集或NUnit _E程。NUnit-Gui 口动监测现加载的测 试程序集的变化。当程序集变化时,测试运行器重新加载测试程序集。(当测试正运行时,现在加载的测 试程序集不会重新加载。在测试运行Z间测试程序集仅可以重新加载。一个忠告:如果测 试程序
20、集依赖另外一个程序集,测试运行器不会观察任何依赖的程序集。对测试运行器来说, 强制一个重载使全部依赖的程序集变化可见。Recent Files说明5个最近在NUnit中加载的测试程序集或NUnit T程(这个列表 在Windows注册表,由每个用户维护,因此如果你共享你的PC,你仅看到你的测试)。 最近程序集的数最可以使用Options菜单项修改,可以访问Tool主菜单。Exit 退 lBView菜单有以卜内容:Expand 一层层扩展现在树中所选节点Collapse折叠现在树中选择的节点Expand All递归扩展树中所选节点后的所有节点Collapse All递归折叠树中所选节点后的所有节
21、点Expand Fixtures扩展树中所有代表测试fixture的节点Collapse Fixtures折叠树中所有代衣测试fixture的节点Properties显示树中现所选节点的属性Tools菜单由这些项:Save Results as XML作为一 XML文件保存运行测试的结杲Options让你定制NUnit的行为现在看看右边,你己经熟悉Rim按钮和进度条。这里还有一个紧跟Run按钮的Stop按 钮:点击这个按钮会终止执行正运行的测试。进度条下面是一个文本窗口,在它上方,由以 下4个标签:Errors and Failures窗口显示失败的测试。在我们的例了里,这个窗口定空。Test
22、s Not Run窗口显示没有得到执行的测试。Console.Error窗口显示运行测试产牛的错误消息。这些此消息是应用程序代码使 用Console.Error输出流可以输出的。Console.Out窗口显示运行测试打印到Console.Error输出流的文本消息。3.2 些常见属性接下来,我将讲述这个框架如何使用同时也涉及到一些非常重要的概念,我想其客户属性是 非常重要的。在NUnit里,有以下几种属性:Test FixtureTest下而对每种属性 讲解。TestFixtureAttribute本属性标记一个类包存测试,当然setup和teardown方法可有可无。(关于setup和tea
23、rdown 方法在后面介绍)做为一个测试的类,这个类还有一些限制:必须是Public,否则NUnil看不到它的存在。它必须有一个缺省的构造函数,否则是NUnit不会构造它。构造函数应该没有任何副作用,因为NUnit在运行吋经常会构造这个类多次,如果要是 构造函数要什么副作用的话,那不是乱了。using System;using NUnit.Framework; namespace MyTest.TestsTestFixturepublic class PriceFixtureTestAttributeTest属性用來标记一个类(已经标记为TestFixture)的某个方法是可以测试的。为了 和
24、先前的版木向后兼容,头4个字符(“test)忽略人小写。(参看hg/nunit.org/test.html)这个测试方法可以定义为:public void MethodName()从上面可以看出,这个方法没有任何参数,其实测试方法必须没有参数。如果我们定义 方法不对的话,这个方法不会出现在测试方法列表中。也就是说在NUnit的界面左边的工作 域内,看不到这个方法。还有一点就是这个方法不返回任何参数,并口必须为Public。例如:using System;using NUnit Franeviork;namespace MyTest.TestsTestFixture public class S
25、uccessTestsTestpublic uoid Test1()/一般来说,有了上而两个属性,你可以做基本的事情了。再对如何进行比较做一个描述。 在NUnit中,用Assert (断言)进行比较,Assert是一个类,它包括以下方法:AreEqual, AreSame, Equals, Fail, Ignore, IsFalse, IsNotNull,具体请参看 NUnit 的文档。3.3在NET环境下应用NUnit3.3.1为测试代码创建一个Visual Studio工程在Microsoft Visual Studio .NET屮,让我们开始创建一个新的工程。选择Visual C#工程作
26、为 工程类型,Class Library作为模板。将丄程命名为NUnitQuickStart.图4-1是一个描述本步骤 的 Visual Studio .NET。3.3.2增加一个NUnit框架引用在Microsoft Visual Studio .NET里创建这个例子时,你需要增加一个NUnit.framework.dll引 用,如下: 在Solution Explorer右击引用,然后选择增加引用NUnit.framework 组件,在 Add Reference 对话框中按 Select 和 OK 按钮。713.3.3为工程增加一个类1using System;2using NUnit.
27、Framework;3namespace NUnitQuickStartTestFixt urepublic class NumersFixtureNUnit2.2打开NUnitgui,加载本本工程编译的程序集.为了在Visual Studio .NET中白动运行NUnitGui,你需要建立NUnitGui作为你的启动 程序:在 Solution Explorer 里右击你的 NunitQuickStart 工程。在弹出菜单中选择属性。在显示的对话框的左面,点击Configuration Properties夹选择出现在 Configuration Properties 夹卜的 Debuggi
28、ngo在属性框右边的Start Action部分,选择下拉框的Program作为Debug Mode值。按Apply按钮设置NUnit-gui.exe作为Start Application0,你既可以键入nunit-gui.exe的全路径,也可使用浏览按钮来指向它。下图中描述了如何将NUniJGui作为工程的测试运行器NIJnitQuicktaH Property PageGorriguration Manager.2dConfiguration: Active(Debug)Debtg MedeProgramD:softwareSmall 5oftwareNUnit y.jStart Appi
29、catio n5tart URLStart PageStart OptionsCcmnand Line ArrjLmenkWorking DirectoryAlwo/s Uco ntoma ExpioiorTruoFmhA Hah iminn_ Pair aStart ApplicationIndicates the pugroin U al shucld be stalled when the prcjcxl is Jcbuyocd. For cxanple you rriylit run o pre-bult client that consunies your Class 确定|取消I应
30、用a) |帮肋13.3.5编译运行测试.现在编译solutiono成功编译后,开始应用程序。NUnit-Gui测试运行器出现。当你笫 一次开始NUnit-Gui,它打开时没有测试加载。从File菜单选择Opm,浏览NUnitQuickStart.dll 的路径。当你加载了测试的程序集,测试运行器为加载的程序集的测试产生一个可见的表现。 在例子屮,测试程序集仅有一个测试,测试程序集的结构如卜图所示:按Run按钮。树的节点变为绿色,而且测试运行器窗口上的进度条变绿,绿色代农成功通 过。3.4其它一些核心概念上面的例子介绍了基本的NUnit特性和功能。TestFixture, Test,和Assert是3个 最基本的特征,我们可以用这些特性进行程序员测试了。但是有的时候,你觉得这3个远远 不够,比如有的时候打开一个数据库连接多次,有没有只让它打开-次的方法呢?如果我想 把测试分类,应该怎样实现呢?如果我想忽略某些测试,又应该如何去完成呢?不用担心, NUnit己经有这样的功能了。3.4.1 SetUp/TearDown 属性在早期给的test fixture定义里,test fixture的测试是一组常规运行时资源.在测试完
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1