单元测试方法介绍
第一章单元测试实施要点
单元测试主要从模块的以下5个特征着手进行检查。
1. 模块接口
模块的接口保证了测试模块的数据流可以正确地流人、流出。在测试中应检查以下要点:
1) 测试模块的输入参数和形式参数在个数、属性、单位上是否一致。
2) 调用其他模块时所给出的实际参数和被调用模块的形式参数在个数、属性、单位上
是否一致。
3) 调用标准函数时所用的参数在属性、数目和顺序上是否正确。
4) 全局变量在各模块中的定义和用法是否一致。
5) 输入是否仅改变了形式参数。
6) 开/关的语句是否正确。
7) 规定的I/O格式是否与输入输出语句一致。
8) 在使用文件之前是否已经打开文件或是使用文件之后是否已经关闭文件。
2. 局部数据结构。
在单元测试中,局部数据结构出错是比较常见的错误,在测试刚应重点考虑以下因素:
1) 变量的说明是否合适。
2) 是否使用了尚未赋值或尚未初始化的变量。
3) 变量的初始值或默认值是否正确。
4) 变量名是否有错(例如拼写错)。
3. 重要的执行路径。
在单元测试中,对路径的测试是最基本的任务。由于不能进行穷举测试,需要精心设计测试用例来发现是否有计算、比较或控制流等方面的错误。
1) 计算方面的错误:算术运算的优先次序不正确或理解错误;精度不够;运算对象的
类型不匹配;算法错;表达式的符号表示不正确等。
2) 比较和控制流的错误:本应相等的量由于精度造成不相等;不同类型进行比较逻辑
运算符不正确或优先次序错误;循环终止不正确(如多循环一次或少循环一次)、死循环;不恰当地修改循环变量;当遇到分支循环时,出口错误等。
4. 出错处理。
好的设计应该能预测到出错的条件并且有出错处理的途径。虽然计算机机可以显示出错信息的内容,但仍需要程序员对出错进行处理,保证其逻辑的正确性以便于用户维护。
5. 边界条件
边界条件的测试是单元测试的最后工作,也是非常重要的工作。毫件容易在边界出现错误。块进行测试时,需要开发两种模块:
6. 驱动模块
相当于一个主程序,接收测试用例的数据,将这些数据送到测试椁,输出测试结果。
7. 桩模块
也称为存根模块。桩模块用来代替测试模块中所调用的子模块,其进行少量的数据处理,目的是为了检验人口,输出调用和返回的信息。提高模块的内聚度可以简化单元测试。如果每个模块只完成一种功能,对于具一块来讲,所需的测试方案数据就会显著减少,而且更容易发现和预测模块中的错误。
第二章单元测试经验总结
1. 概述
工厂在组装一台电视机之前,会对每个元件都进行测试,这,就是单元测试。其实我们每天都在做单元测试。你写了一个函数,除了极简单的外,总是要执行一下,看看功能是否正常,有时还要想办法输出些数据,如弹出信息窗口什么的,这,也是单元测试,我们把这种单元测试称为临时单元测试。只进行了临时单元测试的软件,针对代码的测试很不完整,代码覆盖率要超过70%都很困难,未覆盖的代码可能遗留大量的细小的错误,这些错误还会互相影响,当BUG暴露出来的时候难于调试,大幅度提高后期测试和维护成本,也降低了开发商的竞争力。可以说,进行充分的单元测试,是提高软件质量,降低开发成本的必由之路。对于程序员来说,如果养成了对自己写的代码进行单元测试的习惯,不但可以写出高质量的代码,而且还能提高编程水平。
要进行充分的单元测试,应专门编写测试代码,并与产品代码隔离。我们认为,比较简单的办法是为产品工程建立对应的测试工程,为每个类建立对应的测试类,为每个函数(很简单的除外)建立测试函数。首先就几个概念谈谈我们的看法。
一般认为,在结构化程序时代,单元测试所说的单元是指函数,在当今的面向对象时代,单元测试所说的单元是指类。以我们的实践来看,以类作为测试单位,复杂度高,可操作性较差,因此仍然主张以函数作为单元测试的测试单位,但可以用一个测试类来组织某个类的所有测试函数。单元测试不应过分强调面向对象,因为局部代码依然是结构化的。单元测试的工作量较大,简单实用高效才是硬道理。
有一种看法是,只测试类的接口(公有函数),不测试其他函数,从面向对象角度来看,确实有其道理,但是,测试的目的是找错并最终排错,因此,只要是包含错误的可能性较大的函数都要测试,跟函数是否私有没有关系。对于C++来说,可以用一种简单的方法区隔需测试的函数:简单的函数如数据读写函数的实现在头文件中编写(inline函数),所有在源文件编写实现的函数都要进行测试(构造函数和析构函数除外)。
2.什么时间开始测试
什么时候测试?单元测试越早越好,早到什么程度?XP开发理论讲究TDD,即测试驱动开发,先编写测试代码,再进行开发。在实际的工作中,可以不必过分强调先什么后什么,重要的是高效和感觉舒适。从我们的经验来看,先编写产品函数的框架,然后编写测试函数,针对产品函数的功能编写测试用例,然后编写产品函数的代码,每写一个功能点都运行测试,随时补充测试用例。所谓先编写产品函数的框架,是指先编写函数空的实现,有返回值的随便返回一个值,编译通过后再编写测试代码,这时,函数名、参数表、返回类型都应该确定下来了,所编写的测试代码以后需修改的可能性比较小。
3.谁来测试
由谁测试?单元测试与其他测试不同,单元测试可看作是编码工作的一部分,应该由程序员完成,也就是说,经过了单元测试的代码才是已完成的代码,提交产品代码时也要同时提交测试代码。测试部门可以作一定程度的审核。
4.关于桩代码
我们认为,单元测试应避免编写桩代码。桩代码就是用来代替某些代码的代码,例如,产品函数或测试函数调用了一个未编写的函数,可以编写桩函数来代替该被调用的函数,桩代码也用于实现测试隔离。采用由底向上的方式进行开发,底层的代码先开发并先测试,可以避免编写桩代码,这样做的好处有:减少了工作量;测试上层函数时,也是对下层函数的间接测试;当下层函数修改时,通过回归测试可以确认修改是否导致上层函数产生错误。
第三章单元测试的基本策略
1.概述
当设计一个单元测试的策略时,可以采用三种基本的组织方法。它们分别是自上而下法、自下而上法和分离法。在接下来的第二、第三和第四部分将对上述三种方法的详细内容、各自的优点和缺点分别进行介绍。在文章中要一直用到测试驱动和桩模块这两个概念。所谓的测试驱动是指能使软件执行的软件,它的目的就是为了测试软件,提供一个能设置输入参数的框架,并执行这个框架单元以得到相应的输出参数。而桩模块是指一个模拟单元,用这个模拟单元来替代真实的单元完成测试。
2. 自上而下法
2.1 详述
在自上而下的测试过程中,每个单元是通过使用它们来进行测试的,这个过程是由调用这些被测单元的其他独立的单元完成的。
首先测试最高层的单元,将所有的调用单元用桩模块替换。接着用实际的调用单元替换桩模块,而继续将较低层次的单元用桩模块替换。重复这个过程直到测试了最底层的单元。自上而下测试法需要测试桩,而不需要测试驱动。
图2.1描述了使用测试桩和一些已测试单元来测试单元D的过程,假设单元A,B,C 已经用自上而下法进行了测试。
由图2.1得到的是一个使用基于自上而下组织方法的单元测试计划,其过程可以描述如下:
1)步骤1:测试A单元,使用B,C,D单元的桩模块。
2)步骤2:测试B单元,通过已测试过的A单元来调用它,并且使用C,D单元的桩
模块。步骤3:测试C单元,通过已测试过的A单元来调用它,并且使用已通过
测试的B单元和D单元的桩模块。
3)步骤4:测试D单元,从已测试过的A单元调用它,使用已测试过的B和C单元,
并且将E,F和G单元用桩模块代替。(如图2.1所示)
4)步骤5:测试E单元,通过已测试过的D单元调用它,而D单元是由已通过测试
的A单元来调用的,使用已通过测试的B和C单元,并且将F,G,H,I和J单
元用桩模块代替。
5)步骤6:测试F单元,通过已测试过的D单元调用它,而D单元是由已通过测试
的A单元来调用的,使用已通过测试的B,C和E单元,并且将G,H,I和J单
元用桩模块代替。
6)步骤7:测试G单元,通过已测试过的D单元调用它,而D单元是由已通过测试
的A单元来调用的,使用已通过测试的B,C和F单元,并且将H,I和J单元用
桩模块代替。
7)步骤8:测试H单元,通过已测试过的E单元调用它,而E单元是由已通过测试
的D单元来调用的,而D单元是由已通过测试的A单元来调用的,使用已通过测
试的B,C,E,F,G和H单元,并且将J单元用桩模块代替。
8)步骤9:测试J单元,通过已测试过的E单元调用它,而E单元是由已通过测试的
D单元来调用的,而D单元是由已通过测试的A单元来调用的,使用已通过测试
的B,C,E,F,G,H和I单元
2.2 优点
自上而下单元测试法提供了一种软件集成阶段之前的较早的单元集成方法。实际上,自上而下单元测试法确实将单元测试和软件集成策略进行了组合。
单元的详细设计是自上而下的,自上而下的测试实现过程使得被测单元按照原设计的顺序进行,因为单元测试的详细设计与软件生命周期代码设计阶段的重叠,所以开发时间将被缩短。
在通常的结构化设计中,高等级的单元提供高层的功能,而低等级的单元实现细节,自上而下的单元测试将提供一种早期的“可见”的功能化集成。它给予单元测试一种必要的合理的实现途径。
较低层次的多余功能可以通过自上而下法来鉴别,这是因为没有路径来测试它。(但是,这可能在区分多余的功能和没有被测试的功能时带来困难)。
2.3 缺点
自上而下法是通过桩模块来进行控制的,而且测试用例常常涉及很多的桩模块。对于每个已测单元来说,测试变得越来越复杂,结果是开发和维护的费用也越来越昂贵。
依层次进行的自上而下的测试,要达到一个好的覆盖结构也很困难,而这对于一个较为完善、安全的关键性应用来说至为重要,同时这也是很多的标准所要求的。难于达到一个好的覆盖结构也可能导致最终的多余功能和未测试功能之间的混乱。由此,测试一些低层次的功能,特别是错误处理代码,将彻底不切实。
一个单元的变化往往会影响对其兄弟单元和下层单元的测试。例如,考虑一下D单元
一个变化。很明显,对D单元的单元测试不得不发生变化和重新进行。另外,要使用已测试单元D的E、F、G、H、I和J单元也不得不重新测试。作为单元D改变的结果,上述测试自身可能也不得不发生改变,即使单元E、F、G、H、I和J实际上并没有改变。这将导致当变化发生时,重复测试带来的高成本,以及高额的维护成本和高额的整个软件生产周期的成本。
在为自上而下测试法设计测试用例当中,当被测单元调用其他单元时需要测试人员具备结构化知识。被测试单元的顺序受限于单元的层次结构,低层次的单元必须要等到高层次的单元被测试后才能被测试,这样就形成了一个“又长又瘦”的单元测试阶段。(然而,这可能会导致测试详细设计与软件生命周期编码阶段的整体重叠。)
如图2.1所示的例子程序中各个单元之间的层次关系十分简单,在实际的编程过程中可能会遇到类似的情形,而且各个单元之间的层次关系会更复杂。所以自上而下测试法的缺点对单元测试造成的不利影响会随着被测单元之间复杂的联系而加深。
2.4 总结
一个自上而下的测试策略成本将高于基于分离的测试策略,这取决于顶层单元下层单元的复杂程度,以及由于下层单元自身发生变化所带来的显著影响。对于单元测试来说自上而下的组织方法不是一个好的选择。然而,当各个组成单元已经被单独测试的情况下,用自上而下法进行单元的集成测试是个不错的手段。
3. 自下而上法
3.1 详述
在自下而上的单元测试中,被测单元与调用被测单元的单元是分开测试的,但是测试时所使用的是真实的被调用单元。
测试时最底层的单元首先被测试,这样就方便了对高层次单元的测试。然后使用前面已经被测试过的被调用单元来测试其他的单元。重复这个过程直到最高层的单元被测试为止。自下而上法需要测试驱动,但是不需要测试桩。
图3.1说明了测试D单元时需要的测试驱动和已测单元的情况,假设单元E、F、G、H、I和J已经通过自下而上法进行了测试。
图3.1显示了一个程序的单元测试的测试计划,该计划使用了基于自下而上的组织方法,其过程如下:
步骤(1)(注意在测试步骤中测试的顺序不是最主要的,步骤1中的所有测试可以同步进行).
1)测试单元H,在调用H单元的E单元处使用一个测试驱动;
2)测试单元I,在调用I单元的E单元处使用一个测试驱动;
3)测试单元J,在调用J单元的E单元处使用一个测试驱动;
4)测试单元F,在调用F单元的D单元处使用一个测试驱动;
5)测试单元G,在调用G单元的D单元处使用一个测试驱动;
6)测试单元B,在调用B单元的A单元处使用一个测试驱动;
7)测试单元C,在调用C单元的A单元处使用一个测试驱动。
步骤(2)
测试单元E,在调用E单元的D单元处使用一个测试驱动,再加上已测试过的单元H、I和J。
步骤(3)
测试单元D,在调用D单元的A单元处使用一个测试驱动,再加上已测试过的单元E、F、G、H、I和J。(如图3.1所示)
步骤(4)
测试单元A,使用已测试过的单元B、C、D、E、F、G、H、I和J。
3.2 优点
和自上而下法一样,自下而上单元测试法提供了一种比软件集成阶段更早的单元集成。自下而上单元测试同样也是真正意义上的单元测试和软件集成策略的结合。因为不需要测试桩,所以所有的测试用例都由测试驱动控制。这样就使得低层次单元附近的单元测试相对简单些。(但是,高层次单元的测试可能会变得很复杂。)
在使用自下而上法测试时,测试用例的编写可能只需要功能性的设计信息,不需要结构化的设计信息(尽管结构化设计信息可能有利于实现测试的全覆盖)。所以当详细的设计文档缺乏结构化的细节时,自下而上的单元测试就变得十分有用处。
自下而上单元测试法提供了一种低层次功能性的集成,而较高层次的功能随着单元测试
过程的进行按照单元层次关系逐层增加。这就使得自下而上单元测试很容易地与测试对象相兼容。
3.3 缺点
随着测试逐层推进,自下而上单元测试变得越来越复杂,随之而来的是开发和维护的成本越来越高昂,同样要实现好的结构覆盖也变得越来越困难。
低层单元的变化经常影响其上层单元的测试。例如:想象一下H单元发生变化的情况。很明显,对H单元的测试不得不发生变化和重新进行。另外,对于A、D和E单元的测试来说,因为它们共同使用了已测试过的H单元,所以它们的测试也不得不重做。作为H单元发生变化的后果,这些测试本身可能也要进行改变,即使单元A、D和E实际上并没有发生变化。这就导致了当变化发生时,产生了与重新测试有关的高额代价,以及高额的维护成本和整个软件生命周期成本的提高。
单元测试的顺序取决于单元的层次关系,较高层次的单元必须要等到较低层次单元通过测试后才能进行测试,所以就形成了“长瘦”型的单元测试阶段。最先被测试的单元是最后被设计的单元,所以单元测试不能与软件生命周期的详细设计阶段重叠。
如图2.2所示的例子程序中各个单元之间的层次关系十分简单,在实际的编程过程中可能会遇到类似的情形,而且各个单元之间的层次关系会更复杂。与自上而下测试法一样,自下而上测试法的缺点会随着被测单元之间复杂的联系而放大。
3.4 总结
自下而上组织法对于单元测试来说是个比较好的手段,特别是当测试对象和重用情况时。然而,自下而上方法偏向于功能性测试,而不是结构化测试。对于很多标准所需要的高集成度和安全的关键性应用,需要达到高层次的结构覆盖,但自下而上法很难满足这个要求。
自下而上单元测试法与很多软件开发所要求的紧凑的时间计划是相冲突的。总的来说,一个自下而上策略成本将高于基于分离的测试策略,这是因为单元层次结构中低层次单元以上单元的复杂程度和它们发生变化所带来的显著影响。
4. 分离法
4.1 详述
分离测试法是分开测试每一个单元,无论是被调用单元还是调用单元。被测单元可以按照任意顺序进行测试,因为被测单元不需要其他任何已测单元的支持。每一个单元的测试都需要一个测试驱动,并且所有的被调用单元都要用测试桩代替。图4.1 说明了测试单元D 时需要的测试驱动和测试桩的情况。
图4.1
图4.1 显示了某个程序中一个单元的测试计划,该计划基于分离组织方法的策略,只需要如下所示的一步:
步骤(1)(注意该测试计划只有一步。测试的顺序不是最主要的,所有的测试可以同步进行。)
1)测试A 单元,使用一个测试驱动启动测试,并且将B、C 和D 单元换成测试桩;
2)测试B 单元,在A 单元处使用一个测试驱动来调用B 单元;
3)测试C 单元,在A 单元处使用一个测试驱动来调用C 单元;
4)测试D 单元,在A 单元处使用一个测试驱动来调用D 单元,并且将E、F和G
单元换成测试桩(如图3.1 所示);
5)测试E 单元,在D 单元处使用一个测试驱动来调用E 单元,并且将H、I和J
单元换成测试桩;
6)测试F 单元,在D 单元处使用一个测试驱动来调用F 单元;
7)测试G 单元,在D 单元处使用一个测试驱动来调用G 单元;
8)测试H 单元,在E 单元处使用一个测试驱动来调用H 单元;
9)测试I 单元,在E 单元处使用一个测试驱动来调用I 单元;
10)测试J 单元,在E 单元处使用一个测试驱动来调用J 单元。
4.2 优点
彻底地测试一个分离的单元是很容易做到的,单元测试将其从与其它单元之间复杂的关系中分离了出来。分离测试是最容易实现良好的结构性覆盖的方法,并且实现良好结构性覆盖的困难程度与确定某一个单元在单元层次中所处位置的难易度没有什么不同。
因为每一次只测试一个单元,所以该方法中所使用的测试驱动比自下而上法中所使用的测试驱动简单,该方法中所使用的测试桩比自上而下法中使用的测试桩简单。由于采用了分离的方法进行单元测试,被测单元之间没有依赖关系,所以单元测试阶段可以和详细设计阶段,以及软件生命周期的代码编写阶段重叠。所有单元都能同步测试,形成了单元测试阶段“短而宽”的特点。这有利于通过扩大团队规模的手段缩短整个软件开发的时间。分离测试法另外一个优点是去除了测试单元之间的内部依赖关系,所以当一个单元发生变化时只需要改
变那个发生变化的测试单元,而对其它测试单元没有任何影响。由此可以看出分离组织法的成本要低于自下而上组织法和自上而下组织法,特别是当发生变化时其效果更加明显。
分离法提供了一种与集成测试不同的单元测试分离手段,它允许开发人员在软件生命周期的单元测试阶段专心致力于单元测试工作,而在软件生命周期的集成测试阶段专心致力于集成测试工作。只有分离法是纯粹意义上适用于单元测试的方法,自上而下测试法和自下而上测试法适用于单元测试和集成阶段的混合过程。与自上而下法和自下而上法不同的是,用分离法进行的单元测试,被测单元不会受到与其关联的其它任何单元的影响。
4.3 缺点
用分离法进行单元测试最主要的缺点是它不能提供一个早期的单元集成。这必须要等到软件生命周期的集成阶段才能做到。(这很难说是一个真正的缺点)
用分离法进行单元测试时需要结构设计信息和使用测试桩、测试驱动。这会导致在测试靠近底层的单元时,所花费成本要高于自下而上法。然而,这个缺陷可以通过简化层次较高的单元的测试,以及每个单元每次发生变化时的较低花费得到补偿。
4.4 总结
用分离法进行单元测试是最合适的选择。在加上适当的集成策略作为补充,将会缩短软件开发时间所占比例和降低开发费用,这个优势将会贯穿整个软件开发过程和软件生命周期。按照分离法进行单元测试时,被测单元可以按照自上而下或者自下而上的顺序进行集成,或者集成为任何便利的群组和群组的结合。然而,一个自下而上的集成方式是与目前流行的面向对象和面向对象的设计最相兼容的策略。分离法单元测试是实现高层次结构覆盖的最佳手段,而高层次结构覆盖对于很多标准所要求的高完善性和安全的关键性应用来说是至关重要。在通过单元测试完成了所有实现好的结构覆盖的困难工作的基础上,集成测试就可以集中于全面的功能测试和单元交互的测试。
5. 使用AdaTEST 和Cantata
一个单元的测试在整个软件生命周期中要重复进行很多次,无论是在开发阶段还是维护过程中。一些测试工具如:AdaTEST 和Cantata,可以用于一些易于重复进行和花费较少的自动化单元测试中,这样可以有效降低人为因素带来的风险。AdaTEST 和Cantata 测试脚本由一个测试驱动和一个桩的集合(可选的)组成。AdaTEST 和Cantata 可以用于本文所介绍的任何单元测试的组织方法,或者这些方法的任意组合,使得开发人员可以采用最适合于项目应用的测试策略。IPL 提供了两篇相关论文,如下所示:“Achieving Testability when using Ada Packaging and Data Hiding Meth ods”“Testing C++ Objects”,论文“Testing C++Objects”同样详细讨论了在用自下而上法进行单元测试时,分离的类和层次等级的约束是如何引发问题的。文章介绍了分离单元测试法是如何成为唯一实用的处理分离的类和层次等级约束的途径。
6.结论
在实践中,将任何一种方法专门用于进行单元测试是不可能的。通常,分离单元测试法要通过一些自下而上的测试加以修改,将被调用单元用测试桩和已测的实际单元的混合体来表示。例如,直接使用一个数学函数更有实际意义,因为它已被测试并且不大可能发生改变。一些建议的策略如下:
1)基于你的分离法的单元测试策略,继而自下而上的集成被测单元。
2)折中法,即自下而上的通过合并一些便于合并的单元,(例如:使用实际的操作符,
数学函数,字符串操作等。)但是要记住潜在的变化带来的影响。无论是进行单元
测试,还是随着所测单元发生变化时重新测试和维护,同时也为了满足软件的可靠
性而促进彻底的测试覆盖,这些都将导致成本的最低化。请记住,单元测试是指测
试每一个单元,而集成测试是指测试被测单元之间的交互关系。
第四章单元测试自动化方法
本发明公开了一种单元测试自动化方法,通过脚本文件控制被测试程序单元,其步骤为:测试脚本文件控制单元测试辅助模块;单元测试辅助模块控制被测试程序单元。脚本解释器解释执行测试脚本文件中的程序代码,根据程序代码的行为向数据交换文件中写入设置数据;被测试程序单元调用单元测试辅助模块中的功能函数;单元测试辅助模块中的功能函数读取数据交换文件中的设置数据,通过设置数据控制重新定义的关键字和函数的执行结果;单元测试辅助模块中的功能函数通过重新定义的关键字或函数控制被测试程序单元。从而提供通用简单的自动化单元测试过程,以实现提高单元测试的执行效率,方便回归测试,降低单元测试成本的目的。
1、一种单元测试自动化方法,其特征在于:通过测试脚本文件控制被测试程序单元,包含以下步骤: A、测试脚本文件控制单元测试辅助模块; B、单元测试辅助模块控制被测试程序单元。
自动化测试解决方案和工具
一: 自动化编程规范检查解决方案 代码的可阅读性、可维护性是个基本要求,这个最基本的要求在很多公司往往无法实现。我们见到更多的是风格各异、富有个性的代码。这对代码的相互阅读和理解,后人的维护代理很大的困惑,而所有这一切本来就不应该出现的。很多公司都有自己的一套编程规范,在实践中却无法持之以恒地执行。通过人工检查代码,耗时、耗力,效果不理想,而且不可避免存在遗漏。 如何为一个部门,甚至一个公司定制一套规则?并用这套规则强制地检测公司所有的代码,而且省时、省力? 自动化编程规范检查解决方案高效的解决了这个问题。它可以按客户的需求定制一套规则,
并采用工具严格地检查所有的代码,强制保证所有的代码风格一致,书写格式一致。提高的代码的可阅读性和可维护性。自动化编程规范检查解决方案可以实现一个部门、公司的代码风格一致。减少因代码风格各异带来阅读理解、维护困难。 实现步骤 1.架构师制定团队统一规则,Architect Edition(C++Test、Jtest、.Test)定制规则,团队统一使用此规则(编码标准,单元测试用例生成) 2.架构师上传规则到TCM(Team Configuration Manage) 3.开发人员使用团队规则进行自动代码走查,单元测试 4.结果发布
二: C++Test介绍 C++Test是一个C/C++单元测试工具,自动测试任何C/C++类、函数或部件,而不需要您编写一个测试用例、测试驱动程序或桩调用。C++Test能够自动测试代码构造(白盒测试)、测试代码的功能性(黑盒测试)和维护代码的完整性(回归测试)。C++Test是一个易于使用的产品,能够适应任何开发生命周期。通过将C++Test集成到开发过程中,您能够有效地防止软件错误,提高代码的稳定性,并自动化单元测试技术(这是极端编程过程的基础)。 特性 ?即时测试类/函数 ?支持极端编程模式下的代码测试 ?自动建立类/函数的测试驱动程序和桩调用 ?自动建立和执行类/函数的测试用例 ?提供快速加入和执行说明和功能性测试的框架 ?执行自动回归测试 ?执行部件测试(COM) 优点 ?帮助您立即验证类功能性和构造 ?将您从编写测试驱动程序、桩和测试用例的繁重工作中解放出来 ?自动化极端编程和其它编程模式的单元测试过程 ?使得您能够实现和执行100%的代码覆盖性 ?支持紧急和短线开发项目 ?降低调试和维护时间 ?改善应用的可靠性 ?防止简单错误的扩大
《web前端开发基础》作业考核试题题库大全(精品文档)
《web前端开发基础》作业考核试题题库大 全 《web前端开发基础》这门课是非常重要的,尤其是对于计算机专业的同学们来说,下面带来的《web前端开发基础》作业考核试题题库大全一起看看! 一、单选题共20题,40分 1 2分 浮动会让元素塌陷。即被浮动元素的父元素不具有高度。例如一个父元素包含了浮动元素,它将塌陷具有零高度。你可以按以下()方法处理。 A在浮动元素后加个div设置clear: both; height:0,overflow:hidden B使用clearfix; C设置父元素浮动; D以上方法均可 2 2分 在CSS中,关于BOX的margin属性的叙述正确的是()。 A边距margin只能取一个值 Bmargin属性的参数有margin-left、margin-right、
margin-top、 margin-bottom Cmargin属性的值不可为auto Dmargin属性的参数值不能全部设置成0px 3 2分 下列( )HTML属性可用来定义内联样式。 Afont Bclass Cstyles Dstyle 4 2分 要将某div设置为漂浮于页面之上,以下能做到得是:Aposition:absolute; Bposition:relative Cposition:fixed Dposition:static 5 2分 下列()工具可以方便地选择连续的、颜色相似的区域。 A魔棒工具
B矩形选框工具 C椭圆选框工具 D磁性套索工具 6 2分 给一个盒子设置左右填充分别为10px和20px后,如果要求盒子在页面中占的总宽度不变,那么应该让盒子的宽度减少()像素。 A10px B20px C30px D不需减少 7 2分 在客户端网页脚本语言中最为通用的是( )。 AVB BJavaScript CPerl DASP 8 2分 下列( )标签里包含的内容可以显示在页面上。
WinAMS--嵌入式软件单元测试集成测试自动化工具
白盒测试工具―Winams介绍CoverageMaster winAMS : 适用于嵌入式目标机代码的单元测试工具 全面支持嵌入式微机!验证嵌入式C/C++软件实施以模块为单位的自动化单元测试工具 不需要HookCode 直接使用目标机代码进行单元测试 联合静态解析工具[CasePlayer2],提供C1,MC/DC用优化测试计划(test case)制作功能 已取得第三方认证机构TUVSUD对适用于汽车机能安全ISO26262软件工具的认证 产品概要 [Coverage master winAMS]是以嵌入式软件的函数为单位,实施模块单元测试以及C0/C1/MCDC覆盖率测试(coverage test)的嵌入式软件自动化单元测试工具。目标机源代码通过交叉编译器生成目标机执行代码,通过跟实际处理器同样的模拟处理器环境进行单元测试,不需要对执行代码做任何变动,使高信赖性的模块测试成为可能。在汽车控制软件这样的对安全性要求极高的领域,单元测试已经成为不可缺少的一部分。使用目标机代码进行单元测试也是为了符合汽车行业中ISO26262功能安全认证标准。 产品特长 全面支持嵌入式微机!验证嵌入式C/C++软件实施以模块为单位的自动化单元测试工 具 作为能够检验出仅凭系统测试以及整体测试无法发现的[潜在错误]的检测方法,[单元测试]在嵌入式 开发领域受到广泛重视。同时,单元测试也是汽车用软件功能安全(ISO26262)领域中要求实施的认 证项目之一。 [Coverage master winAMS]直接使用通过交叉编译生成的目标机代码,在模拟处理器环境下进行单元测试。既能实现C语言程序的逻辑上的单元验证,又能够对嵌入式微机组装为产品后可能发生的问题等进行具有高信赖度的白盒(white box)测试。 不需要HookCode 使直接使用目标机代码进行单元测试成为可能的业界唯一的工具 有些公司的单元测试工具往往采用在被测试对象的源代码中追加测试用代码或者测试用驱动器的方法,导致测试时所用的代码与组装为产品后的目标机用代码不同。虽然[理论上运行功能应该是相同的],但是从嵌入式开发的角度考虑,这样就如同对交叉编译所生成的经过优化处理的代码进行了加工,无法确保最终产品的质量。Coverage master winAMS是业界唯一的,具有[不需要对被测试对象做任何加工]实施单元测试功能的工具,特别是在安全性要求高的领域中得到很高的评价。
最新web前端面试题(及答案)
1、常用那几种浏览器测试?有哪些内核(Layout Engine)? 答: (Q1) 浏览器:IE,Chrome,FireFox,Safari,Opera。 (Q2) 内核:Trident,Gecko,Presto,Webkit。 2、说下行内元素和块级元素的区别?行内块元素的兼容性使用?(IE8 以下)答: (Q1) 行内元素:会在水平方向排列,不能包含块级元素,设置width无效,height无效(可以设置line-height),margin上下无效,padding上下无效。 块级元素:各占据一行,垂直方向排列。从新行开始结束接着一个断行。 (Q2) 兼容性:display:inline-block;*display:inline;*zoom:1; 3、清除浮动有哪些方式?比较好的方式是哪一种? 答: (Q1) (1)父级div定义height。 (2)结尾处加空div标签clear:both。 (3)父级div定义伪类:after和zoom。 (4)父级div定义overflow:hidden。 (5)父级div定义overflow:auto。 (6)父级div也浮动,需要定义宽度。 (7)父级div定义display:table。 (8)结尾处加br标签clear:both。 (Q2) 比较好的是第3种方式,好多网站都这么用。 4、box-sizing常用的属性有哪些?分别有什么作用? 答: (Q1)box-sizing: content-box|border-box|inherit; (Q2)content-box:宽度和高度分别应用到元素的内容框。在宽度和高度 之外绘制元素的内边距和边框(元素默认效果)。 border-box:元素指定的任何内边距和边框都将在已设定的宽度和高度内 进行绘制。通过从已设定的宽度和高度分别减去边框和内边距才能得到内容的 宽度和高度。 5、Doctype作用?标准模式与兼容模式各有什么区别? 答: (Q1) 告知浏览器的解析器用什么文档标准解析这个文档。DOCTYPE不 存在或格式不正确会导致文档以兼容模式呈现。 (Q2) 标准模式的排版和JS运作模式都是以该浏览器支持的最高标准运行。在兼容模式中,页面以宽松的向后兼容的方式显示,模拟老式浏览器的行为以防 止站点无法工作。 6、HTML5 为什么只需要写?
16种常用数据分析方法
一、描述统计描述性统计是指运用制表和分类,图形以及计筠概括性数据来描述数据的集中趋势、离散趋势、偏度、峰度。 1、缺失值填充:常用方法:剔除法、均值法、最小邻居法、比率回归法、决策 树法。 2、正态性检验:很多统计方法都要求数值服从或近似服从正态分布,所以之前需要进行正态性检验。常用方法:非参数检验的K-量检验、P-P图、Q-Q图、W 检验、动差法。 二、假设检验 1、参数检验 参数检验是在已知总体分布的条件下(一股要求总体服从正态分布)对一些主要的参数(如均值、百分数、方差、相关系数等)进行的检验。 1)U验使用条件:当样本含量n较大时,样本值符合正态分布 2)T检验使用条件:当样本含量n较小时,样本值符合正态分布 A 单样本t检验:推断该样本来自的总体均数卩与已知的某一总体均数卩0 (常为理论值或标准值)有无差别; B 配对样本t 检验:当总体均数未知时,且两个样本可以配对,同对中的两者在可能会影响处理效果的各种条件方面扱为相似; C 两独立样本t 检验:无法找到在各方面极为相似的两样本作配对比较时使用。 2、非参数检验 非参数检验则不考虑总体分布是否已知,常常也不是针对总体参数,而是针对总体的某些一股性假设(如总体分布的位罝是否相同,总体分布是否正态)进行检验。 适用情况:顺序类型的数据资料,这类数据的分布形态一般是未知的。 A 虽然是连续数据,但总体分布形态未知或者非正态; B 体分布虽然正态,数据也是连续类型,但样本容量极小,如10 以下; 主要方法包括:卡方检验、秩和检验、二项检验、游程检验、K-量检验等。 三、信度分析检査测量的可信度,例如调查问卷的真实性。 分类: 1、外在信度:不同时间测量时量表的一致性程度,常用方法重测信度 2、内在信度;每个量表是否测量到单一的概念,同时组成两表的内在体项一致性如何,常用方法分半信度。 四、列联表分析用于分析离散变量或定型变量之间是否存在相关。对于二维表,可进行卡 方检验,对于三维表,可作Mentel-Hanszel 分层分析列联表分析还包括配对计数资料的卡方检验、行列均为顺序变量的相关检验。 五、相关分析 研究现象之间是否存在某种依存关系,对具体有依存关系的现象探讨相关方向及相关程度。 1、单相关:两个因素之间的相关关系叫单相关,即研究时只涉及一个自变量和一个因变量; 2、复相关:三个或三个以上因素的相关关系叫复相关,即研究时涉及两个或两个以
常用数据分析方法详细讲解
常用数据分析方法详解 目录 1、历史分析法 2、全店框架分析法 3、价格带分析法 4、三维分析法 5、增长率分析法 6、销售预测方法 1、历史分析法的概念及分类 历史分析法指将与分析期间相对应的历史同期或上期数据进行收集并对比,目的是通过数据的共性查找目前问题并确定将来变化的趋势。 *同期比较法:月度比较、季度比较、年度比较 *上期比较法:时段比较、日别对比、周间比较、 月度比较、季度比较、年度比较 历史分析法的指标 *指标名称: 销售数量、销售额、销售毛利、毛利率、贡献度、交叉比率、销售占比、客单价、客流量、经营品数动销率、无销售单品数、库存数量、库存金额、人效、坪效 *指标分类: 时间分类 ——时段、单日、周间、月度、季度、年度、任意 多个时段期间 性质分类 ——大类、中类、小类、单品 图例 2框架分析法 又叫全店诊断分析法 销量排序后,如出现50/50、40/60等情况,就是什么都能卖一点但什么都不 好卖的状况,这个时候就要对品类设置进行增加或删减,因为你的门店缺少 重点,缺少吸引顾客的东西。 如果达到10/90,也是品类出了问题。 如果是20/80或30/70、30/80,则需要改变的是商品的单品。 *单品ABC分析(PSI值的概念) 销售额权重(0.4)×单品销售额占类别比+销售数量权重(0.3) × 单品销售数量占类别比+毛利额权重(0.3)单品毛利额占类别比 *类别占比分析(大类、中类、小类) 类别销售额占比、类别毛利额占比、 类别库存数量占比、类别库存金额占比、
类别来客数占比、类别货架列占比 表格例 3价格带及销售二维分析法 首先对分析的商品按价格由低到高进行排序,然后 *指标类型:单品价格、销售额、销售数量、毛利额 *价格带曲线分布图 *价格带与销售对数图 价格带及销售数据表格 价格带分析法 4商品结构三维分析法 *一种分析商品结构是否健康、平衡的方法叫做三维分析图。在三维空间坐标上以X、Y、Z 三个坐标轴分别表示品类销售占有率、销售成长率及利润率,每个坐标又分为高、低两段,这样就得到了8种可能的位置。 *如果卖场大多数商品处于1、2、3、4的位置上,就可以认为商品结构已经达到最佳状态。以为任何一个商品的品类销售占比率、销售成长率及利润率随着其商品生命周期的变化都会有一个由低到高又转低的过程,不可能要求所有的商品同时达到最好的状态,即使达到也不可能持久。因此卖场要求的商品结构必然包括:目前虽不能获利但具有发展潜力以后将成为销售主力的新商品、目前已经达到高占有率、高成长率及高利润率的商品、目前虽保持较高利润率但成长率、占有率趋于下降的维持性商品,以及已经决定淘汰、逐步收缩的衰退型商品。 *指标值高低的分界可以用平均值或者计划值。 图例 5商品周期增长率分析法 就是将一段时期的销售增长率与时间增长率的比值来判断商品所处生命周期阶段的方法。不同比值下商品所处的生命周期阶段(表示) 如何利用商品生命周期理论指导营运(图示) 6销售预测方法[/hide] 1.jpg (67.5 KB) 1、历史分析法
自动化测试复习题
一0+、单项选择题 1、下列术语中,( B )是ISTQB术语表中缺陷(Defect)的同义词。 A、Incident B、Bug C、Mistake D、Error 2、软件测试目的可以是(B )。 a.发现缺陷 b.确认软件能够正常运行 c.预防缺陷 d.直接提高产品的售价 e.减少整个产品开发周期时间 A、a,b B、a,b,c C、a,b,c,d D、所有选项 3、下列方式可以提高和改善测试人员和开发人员关系的是( B )。 A、理解项目经理工作的重要性 B、对所发现的可能的缺陷以一种中立的方式进行沟通 C、单元测试、集成测试和系统测试都由同一批测试人员来完成 D、测试人员参加代码调试 4、基本的测试过程主要由( D )活动组成。 a.计划和控制 b.分析和设计 c.实现和执行
d.评估出口准则和测试报告 e.测试结束活动 A、a, b 和c B、a, b, c 和d C、除e 以外所有选项 D、所有选项 5、以下关于测试原则的描述,正确的是( B )。 A、所有的软件测试不需要追溯到用户需求; B、完全测试是不可能的; C、测试可以显示软件潜在的缺陷; D、程序员不需要避免检查自己的程序。 6、软件测试工作应该开始于( B )。 A、Coding之后; B、需求分析阶段; C、概要设计阶段; D、详细设计阶段。 7、下面(C )是一个好的测试的特点。 a.每个开发活动都有相对应的测试行为 b.每个测试级别都有其特有的测试目标 c.对于每个测试级别,需要在相应的开发活动过程中进行相应的测试分析和设计 d.软件测试的工作重点应该集中在系统测试上 A、c,d B、a,b C、a,b,c D、a,b,c,d
《windows7应用基础》单元检测题(一)
《windows7应用基础》单元检测题(一) (第一、二章) (满分100分,45分钟完卷) 班级:姓名:学号:得分: 一、填空题(2分/空,共20分) 1.7个二进制可表示种状态。 2.每个用户去请求计算机系统完成的一个独立的操作称为。 3.系统总线按其传输信息的不同可分为、地址总线,控制总线3类。 4.windows7文件夹名称的最大长度为个字符。 5.在windows7中,在“运行”对话框中输入,可进入注册表。 6.新磁盘在格式化时,应该选择格式化。 7.windows7中文件夹的概念相当于dos中的,一个文件夹中可以包含多个文件和文件夹。文件夹是 用来组织磁盘文件的一种数据结构。 8.在“windows资源管理器”中,文件和文件夹的排序方式有种。 9.在“开始”菜单中单击,可进行计算机的相关性能的设置 二.单选题(2分/题,共40分) 1.在计算机领域中通常用主频来描述()。 A.计算机的运算速度 B. 计算机的可靠性 C.计算机的可运行性 D. 计算机的可扩充性 2.计算机能直接识别和执行的语言是()。 A.机器语言B。高级语言 C. 汇编语言 D. 数据库语言 3.led指的是( ) A. 阴极射线管显示器 B. 液晶显示器 C. 等离子显示器 C. 以上说法都不对 4.用于描述内存性能优劣的两个重要指标是() A.存储容量和平均无故障工作时间 B.存储容量和平均修复时间 C. 平均无故障工作时间和内存的字长 D. 存储容量和存取时间 5.windows7系统安装并启动后,由系统安排在桌面上的图标是() A.资源管理器B。回收站C.Microsoft word D.Microsoftfoxpro 6.windows7的用户不可以通过开始菜单实现对系统的管理有() A.查找对象 B.运行C删除程序D关闭系统 7.Windows窗口提供了联机帮忙的功能,按下热键(),可以查看与窗口有关的帮助信息。 A.F1 B.F2 C.F3 D.F4 8.()选定后,没有操作,任务栏会自动地隐藏起来。 A.“分栏相似任务按钮”复选栏 B.:将任务保持在其他窗口的前端“复选栏 C.“显示快速启动“复选栏 D.自动隐藏任务栏“复选栏 9.在Windows资源管理器的细节窗格中,显示着选定的对象的() A.可以显示文件名,也可以显示文件的部分或全部目录信息,用户选择可以添加 B.固定显示文件的全部目录信息 C.固定显示文件的部分目录信息
变电站综合自动化概述
变电站综合自动化概述 变电站综合自动化,也就是我们常说的综自系统,是二次系统的一个组成部分。也是保证变电站安全。经济运行的一种重要技术手段。随着智能站的推广,综自系统和保护的界限越来越模糊,其的重要性越来越高。近几期就和大家一起来学习一些综自方面的相关知识。本期介绍一些总体的概念。 1.综自的概念 变电站综合自动化就是将变电站的二次设备(包括测量仪表、保护装置、信号系统、自动装置和远东装置等)的功能综合于一体,实现对变电站主要设备的监视、测量、控制、保护以及与调度通信等自动化功能。 综自系统包括微机监控、微机保护、微机自动装置、微机五防等 子系统。它通过微机化保护、测控单元采集变电站的各种信息(如 母线电压、线路电流、断路器位置、各种遥信等)。并对采集到 的信息进行分析处理,并借助通信手段,相互交换和上传相关信
综自所谓的综合,既包括横向综合,即讲不同间隔、不同厂家的 设备相互连接在一起;也包括纵向综合,即通过纵向通信,将变 电站与控制中心、调度之间紧密集合。 2.综自的布局 综自系统按照设备的布局来划分,可以分为集中式、局部分散式、 分散式三种。 (1)集中式 通过集中组屏的方式采集变电站的模拟量、开关量和数字量等信息,并同时完成保护、控制、通信等功能。这种布局形式早期应用的比较多,因为早期综自设备技术不成熟,对运行现场的条件要求比较高,所以只能在环境比较良好的主控室中安装。 集中式布局的主要缺点是,所有与综自系统相连的设备都需要拉 电缆连接进入主控室,电缆的安装敷设工作量很大,周期长,成 本高,也增加了CT的二次负载。随着综自设备技术的成熟,已经用的很少。
持续集成:自动化测试篇
持续集成:自动化测试篇 前言 如果组件A\B\C的可靠性都为90%,是否说明了A\B\C组成的系统整体可靠性为90%?其实不是,实际结果是90% * 90% * 90%* = 73%。大部分软件系统都由几百个甚至几千个对象组成,如果包含了100个组件的线性系统,每个组件的可靠性均为99%,那么整个系统的可靠性只有37%。 如果想要构建一个在服务层面承诺到达100%或接近100%的软件系统,则必须在单个对象层面上确保可靠性。如果不能从最低层面确保并测量可靠性,就不可能在系统层面上达到要求。 这就要求我们在每当系统发生变更时测试都必须执行,并且这些测试不单单是单元测试,还应包括组件测试、系统测试等,在日常的开发过程中,反复进行多种测试无疑是枯燥乏味的,在CI系统中包含持续测试则能让你轻松解决这一烦恼。 自动化单元测试 “单元测试”是验证软件系统中所有小元素的行为,这些小元素通常都是一个类。有时单元测试和被测试的类之间一对一的关系也会被放大,因为一些测试的类耦合程度较高。 单元测试没有外部依赖关系,不会依赖于文件系统和数据库。因为编码和看到单元测试之间的时间很短,所以单元测试是一种有效的除错方法。在进行持续集成过程的单元测试时,可以利用NUnit或JUnit单元测试框架,让单元测试自动化。 真正的单元测试应该少于1秒的时间内完成。如果花费的时间较长就需要检查一下,它是否失败了,或者它实际是一个组件级测试。配置自动化测试需要一些代价,但是执行这些测试的资源代价可以忽略不计。
自动化组件测试 “组件测试”或“子系统测试”验证的是系统的各个部分,可能需要安装整个系统或某些外部依赖关系,如数据库、文件系统、网络终端等。 典型的组件测试需要底层数据库支持,甚至可能跨越架构边界,这些测试涉及更多对象,每个测试的代码覆盖率也更大,通常比单元测试需要花更长的时间,如果用到数据库可以使用DbUnit\NDbUnit实现自动化。 组件测试执行的时间比较长,可以作为次级构建的一部分来执行或定期执行。 自动化系统测试 “系统测试”允许整个软件系统,需要完整安装系统,系统测试比组件测试执行时间更长,通常涉及多个组件。 如果事先已成功执行单元测试和组件测试,则已解决一些底层问题,只需要计划定期执行这个耗时较长的测试就可以。也可以作为次级集成构建的一部分,在下班后或夜间执行。 自动化功能测试 “功能测试”也称为“验收测试”,从用户的角度测试应用程序,意味着测试将模仿用户行为,通常是自动化测试套件中执行时间最长的。 开发者测试分组 通过将测试分组,按不同的时间间隔来执行较快(如单元测试)和较慢的(如组件测试)测试,顺序可以设置为:单元测试、组建测试、系统测试、功能测试。 可以“告诉”CI系统在恰当的时候执行每一类测试,构建次数完全可管理,测试定期执行,而不是当它们需要很长时间执行时就抛弃它们。 为缺陷编写测试
web前端开发技术试卷六
Web前端开发技术课程考试试卷(六) 总分100分考试时间:120分钟考试形式:闭卷 一、选择题(每题1分,共20分) 1.以下标记符中,用于设置页面标题的是_______。 (A)