单元测试方法介绍
单元测试的测试方法

单元测试的测试方法单元测试是软件开发中的一个重要环节,它主要用于测试代码中的各个独立单元,以确保其功能的正确性和稳定性。
在进行单元测试时,有多种测试方法可以选择,包括黑盒测试、白盒测试、灰盒测试等。
下面将详细介绍这些测试方法以及它们的适用场景。
1. 黑盒测试黑盒测试是一种在不考虑程序的内部结构和实现细节的情况下进行的测试方法。
测试人员主要通过输入一组测试数据,然后对比预期输出结果和实际输出结果,来判断代码是否按照预期功能进行运行。
黑盒测试适用于以下情况:- 代码结构复杂,测试人员不太关注其实现细节,只关心功能是否正确。
- 代码依赖外部资源或接口,测试人员无法查看到具体实现,只能通过输入输出来测试。
黑盒测试的优点是可以有效地检测功能错误,例如缺少某些功能或输出错误。
但它也存在一定的缺点,例如测试用例的设计相对困难,无法完全覆盖所有可能的路径。
2. 白盒测试白盒测试是一种基于对代码内部结构和实现细节的了解,来设计测试用例的测试方法。
它要求测试人员具备代码背后的知识,以便根据代码的逻辑路径和数据流来设计有效的测试用例。
白盒测试适用于以下情况:- 需要全面测试代码的不同逻辑路径,以确保代码的完整性和稳定性。
- 代码有特定的性能要求,需要通过代码内部结构的测试来验证。
白盒测试的优点是可以充分测试代码的各个分支和边界条件,提高代码覆盖率。
但它也存在一定的缺点,例如测试人员需要具备代码背后的知识,设计测试用例较为困难。
3. 灰盒测试灰盒测试是介于黑盒测试和白盒测试之间的一种测试方法。
它可以同时利用黑盒测试和白盒测试的优点,从而更全面地测试代码的功能和逻辑。
灰盒测试适用于以下情况:- 部分代码需要进行黑盒测试,例如代码的外部接口或依赖。
- 部分代码需要进行白盒测试,例如关键逻辑的代码路径和数据流。
灰盒测试的优点是可以同时利用黑盒和白盒测试的优点,提高测试的效率和准确性。
但它也存在一定的缺点,例如测试用例的设计相对复杂,需要考虑不同的测试策略。
单元测试常用方法是什么

单元测试常用方法是什么单元测试是软件开发中的重要环节,它可以确保代码的质量和稳定性。
在实际的软件开发过程中,有一些常用的方法可以帮助我们编写高效和有效的单元测试。
1. AAA模式AAA模式指的是Arrange、Act、Assert,分别对应着准备、执行和断言这三个步骤。
•Arrange:在这个步骤中,我们准备测试数据、设置对象的状态。
通过合适的准备工作,我们确保测试环境是稳定的。
•Act:在这个步骤中,我们执行被测代码。
这个步骤通常只包含一行代码,即对被测代码的调用。
•Assert:在这个步骤中,我们验证被测代码的行为是否符合预期。
通过断言语句,我们可以检查被测代码的输出结果是否正确。
2. 边界值分析边界值分析是一种测试方法,主要用于检查代码在边界处的行为。
通过针对边界情况设计测试用例,可以帮助我们发现潜在的边界问题。
3. 参数化测试参数化测试是一种测试方法,可以在同一个测试用例中对不同的输入数据进行测试。
通过参数化测试,我们可以减少重复编写测试用例的工作量,同时提高测试覆盖率。
4. Mock对象在单元测试中,有时候需要对依赖的外部资源进行模拟。
Mock对象可以用来替代真实的外部依赖,使得测试更加独立和可控。
5. 测试覆盖率分析测试覆盖率分析是评估测试代码覆盖范围的一种方法。
通过测试覆盖率分析,我们可以了解测试用例对源代码的覆盖情况,帮助我们发现测试不足的地方。
结语以上是单元测试中常用的几种方法,每种方法都有其独特的作用和适用场景。
在实际的单元测试中,结合这些方法可以帮助我们编写更加有效和全面的测试用例,提高代码的质量和可靠性。
希望本文对你理解单元测试有所帮助!。
单元测试常用的方法

单元测试常用的方法
单元测试是针对软件系统中最小的可测试单元——函数或者对象的行为进行测试的方法。
以下是常用的单元测试方法:
1. 手动测试:开发人员编写测试用例,并手动运行代码来验证函数或对象的行为是否符合预期。
2. 断言测试:使用断言来验证函数或对象的输出是否与预期结果一致。
例如,使用断言库(如JUnit、pytest)中的断言方法
来判断返回值、抛出异常等。
3. 边界测试:针对输入的边界条件进行测试。
例如,测试函数在接收极端值(如最小值、最大值)时是否能正确处理。
4. 异常测试:测试函数或对象在异常情况下的行为是否符合预期。
例如,测试函数在接收非法输入时是否会抛出异常。
5. 随机测试:随机生成输入并验证函数或对象的输出是否符合预期。
例如,使用随机数生成器来测试排序算法的正确性。
6. Mock 测试:对于有依赖关系的函数或对象,使用 Mock 框
架来模拟这些依赖的行为,以便于进行单元测试。
例如,使用Mockito 框架来模拟网络请求、数据库访问等。
7. 性能测试:测试函数或对象在大数据量、高并发等情况下的性能表现是否满足要求。
例如,使用性能测试工具(如JMeter、Gatling)来模拟高并发场景并观察系统的响应时间、
吞吐量等指标。
8. 集成测试:测试多个函数或对象之间的交互是否正常。
例如,使用端到端测试框架来模拟用户操作、验证系统的整体功能是否正常。
以上这些方法可以根据具体的应用场景和需求选择合适的方式进行单元测试,以提高代码的可靠性和质量。
单元测试常用测试方法

单元测试常用测试方法一、概述单元测试是软件开发中的一种测试方法,用于测试软件系统中的最小可测试单元——单元。
在进行单元测试时,开发人员将一个个独立的模块或函数进行测试,以验证其功能的正确性。
本文将介绍一些常用的单元测试方法,以供开发人员参考。
二、黑盒测试黑盒测试是一种测试方法,它将被测试的单元看作一个黑盒子,只关心输入和输出,而忽略其内部实现。
黑盒测试方法主要包括等价类划分、边界值分析和错误推测等。
1. 等价类划分等价类划分是一种常用的黑盒测试方法,将输入条件划分为若干等价类,然后选择一部分测试用例进行测试。
这样可以有效地减少测试用例的数量,提高测试的效率。
2. 边界值分析边界值分析是一种针对边界条件进行测试的方法,它通过选择恰好位于边界的测试用例,以验证程序在边界条件下的行为是否正确。
例如,如果一个函数要求输入的数字在1到100之间,那么可以选择1和100作为测试用例。
3. 错误推测错误推测是一种通过测试错误情况来检查系统是否能够正确处理异常情况的方法。
开发人员可以尝试输入错误的参数或者执行错误的操作,以测试程序的鲁棒性和容错性。
三、白盒测试白盒测试是一种测试方法,它关注被测试单元的内部结构和实现细节。
常用的白盒测试方法包括语句覆盖、分支覆盖和路径覆盖等。
1. 语句覆盖语句覆盖是一种测试方法,它要求测试用例能够覆盖被测试单元中的每一条语句。
通过执行所有语句,开发人员可以检查程序的基本功能是否正确。
2. 分支覆盖分支覆盖是一种测试方法,它要求测试用例能够覆盖被测试单元中的每一条分支。
通过执行所有分支,开发人员可以检查程序在不同条件下的行为是否正确。
3. 路径覆盖路径覆盖是一种测试方法,它要求测试用例能够覆盖被测试单元中的每一条路径。
通过执行所有路径,开发人员可以检查程序的各种可能性和边界条件下的行为是否正确。
四、边界测试边界测试是一种测试方法,它主要关注被测试单元的边界条件。
通过选择接近边界的测试用例,开发人员可以测试程序在边界条件下的行为是否正确。
单元测试使用的主要测试方法有哪些

单元测试使用的主要测试方法
在软件开发中,单元测试是保证代码质量和稳定性的重要手段。
而在进行单元测试时,常用的测试方法包括:
1. 边界测试
边界测试是一种测试方法,主要用于验证程序在输入与输出的边界处的表现。
通过在边界值附近测试,可以发现潜在的逻辑错误和边界条件下的异常情况。
2. 断言测试
断言测试是一种通过断言判断程序运行结果是否符合预期的测试方法。
在测试过程中,程序员编写断言语句来验证程序的输出是否与预期一致,从而检测程序中的错误。
3. 异常处理测试
异常处理测试是一种针对程序中异常情况的测试方法。
通过人为构造各种异常情况,测试程序的异常处理能力,以确保程序在异常情况下的稳定性和可靠性。
4. 性能测试
性能测试是一种测试方法,用于验证程序在一定负载下的性能表现。
通过对程序进行负载测试,可以评估程序的性能是否符合需求,并发现潜在的性能问题。
5. 集成测试
集成测试是一种将单元组合在一起进行测试的方法,用于验证不同模块之间的交互是否正确。
通过集成测试,可以发现不同模块集成后可能出现的问题,确保整个系统的功能正常运行。
通过以上几种主要的单元测试方法,可以全面、系统地对程序进行测试,确保程序质量和稳定性。
在开发过程中,程序员可以灵活选择不同的测试方法来验证程序的不同方面,从而提高代码质量和开发效率。
单元测试的主要方法

单元测试的主要方法单元测试是软件开发中非常重要的一环,它旨在对软件系统的最小单位——软件单元进行测试。
通过对单元进行细致的测试,可以提前发现和解决代码中的问题,确保软件的质量和稳定性。
本文将介绍几种主要的单元测试方法。
一、黑盒测试黑盒测试是一种测试方法,测试人员只需关注被测试单元的输入和输出,而无需了解被测试单元的内部实现细节。
测试人员将根据需求文档或规格说明书编写测试用例,在不知道具体实现的情况下进行测试。
黑盒测试可以很好地模拟用户的使用场景,发现潜在的功能性问题。
黑盒测试的优点是简单易懂,测试用例编写相对简单,测试人员不需要具备开发技能。
然而,黑盒测试无法直接定位问题出现的位置,只能发现问题是否存在。
因此,在黑盒测试无法覆盖到的代码块中可能会存在未被发现的问题。
二、白盒测试白盒测试是另一种常用的测试方法,测试人员需要了解被测试单元的内部实现细节,以便编写更全面的测试用例。
通过对代码的结构和逻辑进行测试,可以发现在黑盒测试中可能遗漏的问题。
白盒测试的优点是可以针对代码中的具体分支和路径进行测试,能够提供更为详细的测试覆盖率报告。
缺点是测试用例编写相对复杂,需要测试人员具备一定的开发技能。
此外,白盒测试可能过于关注内部实现细节而忽略了用户的使用场景。
三、单元测试框架单元测试框架是一种工具,能够提供一些用于编写和执行单元测试的结构和功能。
常见的单元测试框架包括JUnit、Pytest等。
使用单元测试框架可以简化测试代码的编写和执行过程,提高测试效率。
单元测试框架一般提供断言(Assertion)功能,能够验证被测试单元的实际输出与预期输出是否一致。
同时,它还可以提供测试覆盖率报告、测试结果统计等功能。
使用单元测试框架可以使测试代码更加规范、易读和易维护。
四、测试驱动开发(TDD)测试驱动开发是一种软件开发方法,它要求在编写功能代码之前先编写单元测试代码。
测试驱动开发的流程一般包括:先编写一个失败的测试用例,然后编写最少的生产代码,使得测试用例通过,接着进行重构。
单元测试常用测试方法

单元测试常用测试方法以下是一些常用的单元测试方法:1. 断言测试(Assert Testing):通过断言语句来验证代码的行为是否符合预期。
可以使用不同的断言方法来测试代码的各个方面,比如验证返回值、异常抛出等。
2. 边界测试(Boundary Testing):针对不同的输入情况,测试边界值,即接近边界的数据。
这样可以验证代码在处理边界数据时是否正确。
3. 异常测试(Exception Testing):针对可能抛出异常的代码段进行测试。
通过输入非法或异常情况的数据,测试代码是否能够正确处理异常,并且抛出正确的异常类型。
4. 参数化测试(Parameterized Testing):通过给定不同的参数组合,测试代码的不同执行路径。
可以使用数据驱动的方法来测试多组数据的情况。
5. 隔离测试(Isolation Testing):测试代码的时候,将被测试代码与其他代码进行隔离,只测试该代码的行为。
可以使用模拟对象的方法来替代依赖的外部模块,使测试更加独立和可控。
6. 逆向测试(Negative Testing):针对代码预期之外的情况进行测试。
测试输入非法、错误或不符合预期的情况,验证代码是否能够正确地处理这些情况。
7. 性能测试(Performance Testing):通过对代码的执行时间、内存消耗等进行测试,验证代码在不同负载下的性能表现。
可以使用各种性能测试工具来模拟不同的负载情况。
8. 随机测试(Random Testing):通过随机生成输入数据来进行测试,以验证代码对随机输入的处理是否正确。
可以使用随机数生成器来生成各种可能的输入情况。
以上是一些常见的单元测试方法,根据实际情况选择合适的测试方法来进行单元测试。
也可以结合多种方法来进行综合测试,以尽可能地覆盖代码的不同执行路径和边界情况。
单元测试常用的方法是什么

单元测试常用的方法是什么在软件开发过程中,单元测试是一种非常重要的测试方法,可以确保代码的质量和功能的正确性。
在进行单元测试时,有一些常用的方法能够帮助开发人员更有效地进行测试,提高代码覆盖率以及测试结果的可靠性。
本文将介绍一些常用的单元测试方法。
1. 测试驱动开发(TDD)测试驱动开发是一种先写测试用例,再编写实现代码的方法。
通过TDD,开发人员可以更好地了解功能需求,同时也能确保代码的健壮性和可测试性。
在TDD 中,每次只编写足够使一个测试用例通过的代码,确保代码的质量和稳定性。
2. Mocking在进行单元测试时,有时候某些组件的依赖比较复杂或是无法直接在测试环境中运行,这时就需要使用Mocking技术。
Mocking可以模拟这些组件的行为,使得单元测试可以在一个封闭的环境中进行,而不受外部因素的干扰。
3. 边界测试边界测试是一种测试方法,旨在验证系统在极限条件下的行为。
通过边界测试,可以确保系统在面对各种极端情况时,能够正确地处理输入数据和产生预期的输出结果,提高系统的鲁棒性。
4. 参数化测试参数化测试是一种通过传递不同参数进行多次测试的方法。
通过参数化测试,可以有效地覆盖多种不同的情况,提高测试的全面性和覆盖率。
参数化测试能够帮助开发人员在写出更全面的测试用例时,减少手动编写重复代码的工作量。
5. 数据驱动测试数据驱动测试是一种基于不同数据输入进行测试的方法。
通过数据驱动测试,可以有效地验证系统在不同数据情况下的表现,并发现潜在的bug。
数据驱动测试能够提高测试的效率和准确性,确保系统在不同数据情况下都能正常工作。
6. 断言和验证在单元测试中,断言和验证是非常重要的部分。
通过合适的断言和验证操作,可以确保代码的正确性和可靠性。
合理地设置断言和验证条件,能够帮助开发人员快速地发现问题并进行修复,提高代码的质量和可维护性。
通过上述介绍,我们可以看出,单元测试是软件开发中非常重要的一环,而选择合适的测试方法对于保证代码质量和系统稳定性至关重要。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第一章单元测试实施要点单元测试主要从模块的以下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所示的例子程序中各个单元之间的层次关系十分简单,在实际的编程过程中可能会遇到类似的情形,而且各个单元之间的层次关系会更复杂。