软件测试之单元测试
软件单元测试方法

软件单元测试方法软件单元测试是软件开发中的一项重要活动,用于验证程序代码的正确性和可靠性。
它是一种测试技术,用于验证开发人员编写的代码在其单个组件(即单元)层面上的正确性。
本文将详细介绍几种常见的软件单元测试方法。
1. 黑盒测试方法:黑盒测试是一种测试方法,旨在验证函数或模块的输出是否符合预期。
在黑盒测试中,测试人员只关心程序的输入和输出,而不关心内部实现细节。
黑盒测试通常基于需求规范和功能规范来设计测试用例。
测试人员根据这些规范,独立于程序内部的实现,设计有效的测试用例,以验证程序的功能是否正确。
这种测试方法对于测试过程的透明性要求较高,需要测试人员具备充分的领域知识和测试经验。
2. 白盒测试方法:白盒测试是一种测试方法,旨在验证函数或模块的内部实现是否符合预期。
在白盒测试中,测试人员可以查看程序的内部代码,了解程序的结构和逻辑。
基于这些信息,测试人员设计测试用例来覆盖代码的各条路径和分支,以验证程序的运行是否正确。
白盒测试通常包括语句覆盖、判定覆盖、条件覆盖等不同的覆盖标准,以检测代码中的错误和潜在缺陷。
3. 边界值测试方法:边界值测试是一种专注于测试输入和输出边界的测试方法。
边界值测试通过选择极端情况下的输入来检测可能的错误和异常情况。
对于每个变量,测试人员选择最小和最大的边界值,以及一些特殊的边界条件,来验证程序在这些边界值下的行为是否正确。
边界值测试是一种非常有效的测试方法,可以发现许多常见的错误和边界问题。
4. 等价类划分测试方法:等价类划分是一种测试技术,旨在将输入值划分为等效的类别。
等价类划分测试的基本思想是:对于每个等价类,选择一个典型的测试用例进行测试。
等价类划分可以帮助测试人员在给定的测试资源下选择有效的测试用例。
通过选择具有代表性的等价类进行测试,可以显著减少测试用例的数量,从而提高测试效率。
5. 使用Mock对象进行测试:在某些情况下,一个函数或模块可能依赖于其他函数或模块的行为。
软件测试之单元测试:开发人员的测试

软件测试之单元测试:开发⼈员的测试说到单元测试,⼏乎所有⼈都知道,由开发⼈员完成。
可是为什么要进⾏单元测试呢?开发⼈员写单元测试的时间⼏乎和他写产品代码的时间相当,因此,当做项⽬计划的时候,把单元测试考虑进去是合理的。
尽管单元测试增加了相当⼤的开发⼯作量,看上去开发时间延长了,但实际上对于⼀个长期不断改进和维护的项⽬⽽⾔,我们不能忽视级联效应,要从项⽬整体来看。
单元测试可以保证最基本的缺陷尽早的发现并解决,因此,⽤来解决被流转到后期的测试阶段的缺陷时间实际上就会缩短。
⽽如果问开发⼈员是否进⾏了单元测试,他们通常也会说,是的,已经做了单元测试。
如果问开发⼈员,他们的单元测试的步骤,答案很可能是: 开发完代码之后,实际运⾏了程序,简单的做了些功能测试,没有问题 通过断点调试进⾏了代码跟踪不得不说,这么做是对的,也都具有⼀定的价值,但是并未关注到单元测试最核⼼的价值,那么,什么样的测试是有效的单元测试呢?有效的单元测试需要编写简单的、⾃动化的测试代码,并且⼏乎是和开发代码同时完成的。
开发⼈员做单元测试不仅必要,⽽且重要,每个开发⼈员都有责任对⾃⼰开发的代码进⾏单元测试。
那么,单元测试有哪些特点和作⽤呢?保证代码质量、更容易发现缺陷、可重复执⾏、代码更容易维护、解决缺陷的成本更低为什么单元测试可以更容易发现缺陷?因为单元测试是在系统的最低级别进⾏测试,与别的⽅法或模块进⾏隔离了,因此单元测试的缺陷要⽐其他层⾯的缺陷更容易发现并解决。
进⾏单元测试最主要的原因之⼀就是解决缺陷的成本更低,因为单元测试中就解决缺陷是缺陷⽣成到解决最短的周期。
开发⼈员眼中的测试——把缺陷扼杀在摇篮⾥1. 什么是单元测试?单元测试是由开发⼈员在开发产品代码的同时进⾏的⼀种独⽴测试,验证其开发的每个代码单元。
2. 单元测试的⽬的是什么?确保程序的逻辑和开发⼈员对它的预期是⼀致的。
3. 为什么单元测试应该由开发⼈员来执⾏?对于程序的预期结果,开发⼈员⾃⼰⽐其他⼈都要清楚,因此编写有效的单元测试,开发⼈员本⼈是最合适的⼈选。
软件测试(单元测试)

局部数据结构测试
检查不正确或不一致的数据类型说明; 使用尚未赋值或尚未初始化的变量; 错误的初始值或错误的默认值; 变量名拼写错误或书写错误; 不一致的数据类型。
路径测试
常见的不正确的计算有:
运算的优先次序不正确或误解了运算的优先次 序; 运算的方式错误(运算的对象彼此在类型上不 相容); 算法错误; 初始化不正确; 运算精度不够; 表达式的符号表示不正确等。
桩模块( 桩模块(Stub) ) 又称为存根模块,它用来代替被测单元的 子模块。设计桩模块的目的是模拟实现被 测单元的接口。桩模块不需要包括子模块 的全部功能,但应做少量的数据操作,并 打印接口处的信息。
人们在进行单元测试时尽量避免开发驱动模块和桩模块。 尤其应避免开发桩模块,因为驱动模块开发的工作量一般 少于桩模块。 若采用自底向上的方式进行开发,底层的单元先开发并先 测试,可以避免开发桩模块,采用这种方法测试上层单元 时,也是对下层单元的间接测试,但当下层单元被改动后, 则需要执行回归测试判断其上层单元是否需要修改。 当不得不开发驱动模块及桩模块时,人们力求它们的简单 以提高工作效率。但过于简单的驱动模块和桩模块会影响 单元测试的有效性,因而,对被测单元的彻底测试有时会 被推迟到集成测试阶段完成。
多个被测模块之间的单元测试可同时进行,以提高单元测试效率。 单元测试一般应该由编程人员完成,有时测试人员也加入进来, 但编程人员仍会起到主要作用。 单元测试的依据是软件的详细设计描述、源程序清单、编码标准 等。
2.单元测试的目的
验证代码能否达到详细设计的预期要求。 发现代码中不符合编码规范的地方。 准确定位发现的错误,以便排除错误。
3.单元测试的优点
由于单元测试是在编码过程中进行的,若发现 了一个错误,不管是从做回归测试的角度,还 是对错误原因理解的深刻性的角度,修复错误 的成本远小于集成测试阶段,更是小于系统测 试阶段。 在编码的过程中考虑单元测试问题,有助于编 程人员养成良好的编程习惯,提高源代码质量。
软件测试之单元测试

软件测试之单元测试随着软件行业的迅猛发展,软件测试变得越来越重要。
在软件开发的过程中,测试起到了至关重要的作用,帮助开发人员识别和纠正潜在的错误。
其中,单元测试是软件测试中的一种重要方法。
本文将讨论单元测试的定义、目的、优势以及如何进行单元测试。
1. 单元测试的定义单元测试是指对软件的最小可测试单元进行验证的过程。
它通常是对代码中的函数、方法或模块进行测试,以确保其功能的正确性。
单元测试的目的是找出代码单元的错误,并尽早地发现和解决问题。
2. 单元测试的目的单元测试具有以下几个目的:2.1 验证功能正确性:通过对代码单元的测试,可以验证其功能是否按照预期工作。
这有助于开发人员确认代码的正确性,减少错误的发生。
2.2 提高代码质量:单元测试可以帮助开发人员发现和修复隐藏在代码中的缺陷。
通过频繁地进行单元测试,可以提高代码的健壮性,减少错误的存在。
2.3 支持重构和维护:在重构或维护代码时,单元测试可以帮助开发人员确保代码在修改后仍然正常工作。
这样可以减少对其他部分的影响,并提高代码的可维护性。
3. 单元测试的优势单元测试具有以下几个优势:3.1 提高软件质量:通过频繁地进行单元测试,可以及早地发现和纠正代码中的问题,从而提高软件的质量。
3.2 加速开发过程:单元测试可以帮助开发人员更早地发现问题,减少后期修复错误的成本。
这样可以加快开发进度,提高软件的上线速度。
3.3 支持团队合作:单元测试可以作为开发团队之间的共享标准,促进团队之间的合作和沟通。
同时,它还可以作为代码审查的一部分,帮助开发人员改进代码的质量。
4. 如何进行单元测试进行单元测试需要遵守以下步骤:4.1 编写测试用例:根据代码单元的功能,编写相应的测试用例。
测试用例应该涵盖各种情况,包括正常情况和异常情况。
4.2 执行测试用例:使用适当的单元测试框架,在合适的开发环境中执行编写的测试用例。
确保测试环境的隔离性,以避免测试结果受到其他因素的影响。
软件单元测试的主要工作内容

软件单元测试的主要工作内容1. 概述软件单元测试是软件开发中的一项重要工作,旨在验证软件的各个功能模块是否按照设计要求正常工作。
它是软件测试中的第一个层级,也是最基本的测试层级。
本文将详细介绍软件单元测试的主要工作内容。
2. 单元测试的定义和目标单元测试是对软件中最小可测单元进行验证的过程。
它通常以函数或方法为单位进行测试,旨在确保每个函数或方法都能够按照预期执行,并返回正确的结果。
单元测试的主要目标包括: - 验证每个函数或方法是否按照预期执行; - 确保每个函数或方法返回正确的结果; - 发现并修复潜在的错误; - 提高代码质量和可维护性; - 支持重构和代码优化。
3. 单元测试框架选择在进行单元测试之前,需要选择适合项目需求和开发语言的单元测试框架。
常用的单元测试框架包括JUnit、PyTest、Mocha等。
选择合适的框架可以提高开发效率和代码质量。
4. 单元测试用例编写编写有效且全面覆盖功能的单元测试用例是单元测试的核心工作。
每个函数或方法应至少有一个对应的单元测试用例。
以下是编写单元测试用例的一般步骤:步骤1:确定输入和预期输出根据函数或方法的功能,确定输入参数和预期输出结果。
考虑各种边界情况和异常情况。
步骤2:编写测试代码使用选定的单元测试框架编写测试代码,调用被测函数或方法,并将输入参数与预期输出进行比较。
步骤3:运行测试用例运行编写好的单元测试用例,检查实际输出是否与预期输出一致。
如果不一致,说明被测函数或方法存在问题。
步骤4:修复问题并重新运行如果发现问题,需要修改被测函数或方法,并重新运行相关的单元测试用例,确保问题已解决。
5. 单元测试覆盖率分析单元测试覆盖率是衡量单元测试完整性和质量的重要指标之一。
它表示在所有可能路径中被执行到的代码比例。
常见的覆盖率指标包括语句覆盖率、分支覆盖率、条件覆盖率等。
通过使用覆盖率分析工具,可以得到详细的代码覆盖情况报告,帮助开发人员了解测试的完整性,并找到未被覆盖的代码块。
软件测试单元测试

软件测试单元测试概述单元测试是软件开发过程中的一种重要测试方法,它是对软件中最小可测试单元进行测试,以验证其是否能够按照预期工作。
单元测试旨在尽早地发现和解决软件中的错误和缺陷,提高软件质量和可靠性。
本文将介绍什么是单元测试,为什么需要单元测试,单元测试的优势以及如何编写有效的单元测试。
什么是单元测试单元测试是对软件中最小可测试单元的测试,这个最小可测试单元通常是一个函数或方法。
单元测试的目标是验证函数或方法在给定输入的情况下是否产生了预期输出。
为了达到此目的,通常需要编写测试代码来模拟输入条件并验证输出结果。
单元测试的重点是对函数或方法的功能进行测试,而不是关注整个应用程序的行为。
为什么需要单元测试单元测试是软件开发中的一项关键实践,它有以下几个重要的原因:1. 缺陷早发现在开发过程中,早期识别和纠正软件缺陷可以大大降低修复成本。
单元测试可以在软件开发过程中的早期阶段对代码进行验证和测试,帮助开发人员及时发现和解决问题,保证软件质量。
2. 改进设计编写单元测试需要明确的输入输出条件和预期结果,这要求开发人员更加详细地考虑函数或方法的设计。
通过编写单元测试,开发人员可以发现代码设计不佳或存在潜在问题之处,并对其进行改进。
3. 提高代码质量当开发人员编写单元测试时,通常需要考虑各种边界情况和异常情况。
这有助于找出潜在的错误和不可预料的行为,并及早修复它们。
通过单元测试的不断迭代和完善,可以提高代码的质量和健壮性。
4. 支持重构重构是一种改进代码结构和设计的过程,但它可能导致功能错误或不可预料的行为。
通过编写单元测试,可以验证重构后的代码是否与原始代码具有相同的行为,以确保重构不会引入新的错误。
单元测试的优势相比于其他测试方法,单元测试具有以下几个明显的优势:1. 执行速度快由于单元测试只针对最小可测试单元,因此可以在很短的时间内执行大量的测试用例。
这使得开发人员可以快速获得反馈并进行及时修复,提高开发效率。
软件单元测试方法

软件单元测试方法软件单元测试是软件开发过程中至关重要的一环,它旨在验证代码中的每个单元(通常是函数或方法)是否按预期工作。
通过单元测试,开发人员可以提前发现和修复代码中的错误,确保软件质量和稳定性。
下面介绍几种常用的软件单元测试方法:1. 白盒测试白盒测试又被称为逻辑驱动测试或透明盒测试,是一种测试方法,通过分析代码的内部结构和逻辑来设计测试用例。
白盒测试旨在确保代码能够按照预期执行,覆盖各个代码路径,提高代码覆盖率。
常见的白盒测试技术包括语句覆盖、判定覆盖、条件覆盖、路径覆盖等。
2. 黑盒测试黑盒测试是一种功能驱动的测试方法,测试人员不关心代码的内部结构和逻辑,只关注输入和输出之间的关系。
黑盒测试旨在验证软件功能是否符合需求规格说明书中的要求。
常见的黑盒测试技术包括等价类划分、边界值分析、因果图等。
3. 单元测试框架单元测试框架是一种支持自动化单元测试的工具,可以有效地组织、运行和分析测试用例。
常见的单元测试框架包括JUnit、Pytest、NUnit等,它们提供丰富的断言函数和测试运行器,帮助开发人员快速编写和执行单元测试。
4. Mock对象Mock对象是一种用于模拟依赖组件的测试工具,通过替换依赖组件的实现,使测试独立于外部环境。
Mock对象可以模拟数据库、网络、文件等外部资源,帮助开发人员隔离单元测试环境,加速测试执行。
5. 集成测试集成测试是验证不同单元或组件之间的交互是否正确的测试方法。
集成测试旨在发现并解决不同组件之间的接口问题,确保软件的整体功能符合预期。
常见的集成测试策略包括自顶向下、自底向上、混合式等。
总的来说,软件单元测试方法涵盖了白盒测试、黑盒测试、单元测试框架、Mock对象和集成测试等多种技术和工具。
选择合适的测试方法结合项目实际情况,可以提高软件的质量和可靠性,帮助开发团队提升工作效率,减少错误率。
在软件开发过程中,务必重视单元测试,持续改进测试实践,才能确保软件交付的质量和稳定性。
软件测试的四个阶段:单元测试、集成测试、系统测试和验收测试

软件测试的四个阶段:单元测试、集成测试、系统测试和验收测试软件测试的对象包括软件需求、概要设计、详细设计、软件运⾏环境、可运⾏程序和软件源代码等。
软件测试包括质量、⼈员、资源、技术和流程五⼤要素,以及测试覆盖率和测试效率两个⽬标。
软件测试⼀般分为4个阶段:单元测试、集成测试、系统测试、验收测试。
⼀、单元测试单元测试是对软件中的最⼩可验证单元进⾏检查和验证。
⽐如对Java中的类和⽅法的测试。
测试原则:1、尽可能保证测试⽤例相互独⽴(测试⽤例中不能直接调⽤其他类的⽅法,⽽应在测试⽤例中重写模拟⽅法);2、此阶段⼀般由软件的开发⼈员来实施,⽤以检验所开发的代码功能符合⾃⼰的设计要求。
单元测试的好处:1、尽早的发现缺陷;2、利于重构;3、简化集成;4、⽂档;5、⽤于设计。
单元测试的不⾜:1、不可能覆盖所有的执⾏路径,所以不可能保证捕捉到所有路径的错误;2、每⾏代码需要3~5⾏代码进⾏单元测试,存在投⼊与产出的平衡。
⼆、集成测试集成测试是在单元测试的基础上,把软件单元按照软件概要设计规格说明的规格要求,组装成模块、⼦系统或系统的过程中各部分⼯作是否达到或实现相应技术指标及要求。
集成测试包括BigBang、⾃顶向下、⾃底向上、核⼼系统集成、⾼频集成。
三、系统测试将经过集成测试的软件,作为计算机系统的⼀部分,与系统中其他部分结合起来,在实际运⾏环境下进⾏⼀系列严格有效的测试,以发现软件潜在的问题,性能测试⼯具保证系统的正常运⾏。
集成测试和系统测试之间的⽐较:1、测试内容:集成测试是测试各个单元模块之间的接⼝,系统测试是测试整个系统的功能和性能;2、测试⾓度:集成测试偏重于技术的⾓度进⾏测试,系统测试是偏重于业务的⾓度进⾏测试。
四、验收测试也称交付测试,是针对⽤户需求、业务流程进⾏的正式的测试,以确定系统是否满⾜验收标准,由⽤户、客户或其他授权机构决定是否接受系统。
验收测试包括alpha测试和beta测试,alpha测试是由开发者进⾏的软件测试,beta测试是由⽤户在脱离开发环境下进⾏的软件测试。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
软件测试之单元测试我们所做的产品测试包括了下文所说的软件测试词汇表中的大部分,也就是“单元测试”,组件测试,系统测试,集成测试,压力测试和验收测试。
开发团队成员做的或者参与的是“单元测试”,集成测试。
这里的单元测试我加了引号是因为看完下面的文章,我发现我们所做的单元测试并不是严格意义上的单元测试,叫功能测试比较恰当。
下文所说的功能测试遇到的问题在我们的实际项目中也遇到了。
希望日后有机会改进。
1. 你做的是单元测试么?我看到过至少6个公司因为他们有“单元测试(unit test)”而满脸自豪。
而我们看到的是这种“单元测试”结果会是一个麻烦。
其他人讨论单元测试有多么伟大,但是它确实变得让人痛苦不堪。
这种测试需要45分钟才能跑完,还有你对代码只做了一点改动,但却破坏了7个测试用例”。
这些家伙用的是一堆功能测试(functional test)。
他们掉入了一个流行的思维陷阱,认为只要是使用Junit来运行的测试用例,就必须是单元测试。
你只需要一点点词汇量,90%的问题就都能解决。
2. 软件测试词汇表单元测试(unit test):可测试代码的最小的一部分。
通常是一个单一的方法,不会使用其它方法或者类。
非常快!上千个单元测试能够在10秒以内跑完!单元测试永远不会使用:数据库一个app服务器(或者任何类型的服务器)文件/网络 I/O或者文件系统另外的应用控制台(System.out,system.err等等)日志大多数其他类(但不包括DTO‘s,String,Integer,mock和一些其他的类)单元测试几乎总是回归测试套件(regression suite)的一部分。
回归测试套件(Regression Suite):能够立刻被运行的测试用例的集合。
一个例子就是放在一个特定文件夹中的能够被Junit运行的所有测试用例。
一个开发人员能够在一天中把一个单元测试回归套件运行20次或者他们可能一个月跑两次功能测试回归套件。
功能测试(Functional Test):比一个单元要大,比一个完整的组件测试要小。
通常为工作在一起的的几个方法/函数/类。
上百的测试用例允许运行几个小时。
大部分功能测试是功能测试回归套件的一部分。
通常由Junit来运行。
集成测试(Integration Test):测试两个或者更多的组件一起工作的情况。
有时候是回归套件的一部分。
组件测试(Component Test):运行一个组件。
经常由QA,经理,XP客户等等来执行。
这种类别的测试不是回归套件的一部分,它不由Junit来执行。
组件验收测试(Component Acceptance Test C.A.T.):作为正常流程的一部分,它是在众多人面前运行的一个组件测试。
由大家共同决定这个组件是不是满足需求标准。
系统测试(system Test):所有的组件在一起运行。
系统验收测试(System Acceptance Test S.A.T.):作为正常流程的一部分,它是在众多人面前运行的一个系统测试,由大家来共同决定这个系统是不是满足需求标准。
压力测试(Stress Tests):另外一个程序加载一个组件,一些组件或者整个系统。
我曾经看到过把一些小的压力测试放到回归功能测试中来进行——这是测试并发代码的一个很聪明的做法。
Mock:在单元测试或者功能测试中使用的一些代码,通过使用这些代码来确保你要测试的代码不会去使用其它的产品代码(production code)。
一个mock类覆盖了一个产品类中的所有public方法,它们用来插入到尝试使用产品类的地方。
有时候一个mock类用来实现一个接口,它替换了用来实现同样接口的产品代码。
Shunt:有点像继承(extends)产品代码的mock类,只是它的意图不是覆盖所有的方法,而只是覆盖足够的代码,所以你能够测试一些产品方法,同时mock剩余的产品方法。
如果你想测试一个可能会使用I/O的类它会变得尤为有用,你的shunt能够重写I/O方法同时来测试非I/O方法。
3. 使用太多功能测试(functional test)会有麻烦不要误解我的意思。
功能测试有很大的价值。
我认为一个测试良好的app将会有一个功能测试的回归套件和一个非回归功能测试的集合。
通常情况下对于一磅产品代码,我都想看到两磅单元测试代码和两盎司(注:1磅=16盎司)功能测试代码。
但是在太多的项目中我看到的现象是没有一丁点单元测试,却有一磅功能测试。
下面的两幅图表明了一些类的使用情况。
用一些功能测试来测试这些类一块工作的情况。
修复一个类的bug会破坏许多功能测试上面的情况我看到过多次。
其中的一个例子是一个很小的改动破坏了47个测试用例。
我们通过开会来决定这个bug是不是要被留在代码中。
最后决定我们要留足够的时间来fix所有的case。
几个月过去了,事情依然糟糕。
结果是这个工程变的更加灵活。
4. 功能测试认知纠错“通过只编写功能测试用例,我可以写更少的测试代码,同时测试更多的功能代码!”这是真的!但是这会以你的工程变得更加脆弱为代价。
另外,如果不使用单元测试,你的应用有些地方很难被测试。
同时达到最好的覆盖率和灵活性是使用功能测试和单元测试的组合,其中单元测试的比重要大,功能测试的比重要小。
“我的业务逻辑是让所有的类一块工作,所以只测试一个方法是没有意义的。
”我建议你单独测试所有的方法。
同时我也并不建议你不使用功能测试,它们也是有价值的。
“我不介意我的单元测试组件会花费几分钟来运行”但是你的团队中的其他人介意么?你的team lead介意么?你的manager呢?如果它花费几分钟而不是几秒钟,你还会在一天的时间把整个测试套件运行多次么?在什么情况下人们根本不会运行测试?回到顶部5. 单元测试mock基础下面是单元测试的一个简单例子,测试各种情况却不依赖其他方法。
1415 assertEquals( "-111.44" , Normalize.longitude( "-111.44w" ) );1617 assertEquals( "-111.44" , Normalize.longitude( "-111.44W" ) );1819 assertEquals( "-111.44" , Normalize.longitude( "-111.44 w" ) );2021 assertEquals( "-111.44" , Normalize.longitude( "-111.44 W" ) );2223 assertEquals( "-111.44" , Normalize.longitude( "-111.44" ) );2425 assertEquals( "-111.44" , Normalize.longitude( "111.44-" ) );2627 assertEquals( "-111.44" , Normalize.longitude( "111.44 -" ) );2829 assertEquals( "-111.44" , Normalize.longitude( "111.44west" ) );3031 // ...3233 }当然,任何人都能为上面这种情况做单元测试。
但是大部分业务逻辑都使用了其它业务逻辑:8 String buildingID = servletData.getParameter("buildingID");910 if ( able( species ) && able( buildingID ) )1112 {1314 FarmEJBRemote remote = FarmEJBUtil.getHome().create();1516 remote.addAnimal( species , buildingID );1718 }1920 }2122 }这里不仅仅调用了其他业务逻辑,还调用了应用服务器!可能还会访问网络!上千次的调用可能会花费不少于10秒的时间。
另外对EJB的修改可能会破坏我对这个方法的测试!所以我们需要引入一个mock对象。
首先是创建mock。
如果FarmEJBRemote是一个类,我将会继承(extend)它并且重写(override)它所有的方法。
但是既然它是一个接口,我会编写一个新类并实现(implement)所有方法:89 int addAnimal_calls = 0;1011 public void addAnimal( String species , String buildingID )1213 {1415 addAnimal_species = species ;1617 addAnimal_buildingID = buildingID ;1819 addAnimal_calls++;2021 }2223 }这个类什么都没做,只是携带了单元测试和需要被测试代码之间要交互的数据。
这个类会让你感觉不舒服么?应该是这样。
在我刚接触它的时候有两件事情把我弄糊涂了:类的属性不是private的,并且命名上有下划线。
如果你需要mock java.sql.connection。
总共有40个方法!为每个方法的各个参数,返回值和计数都实现Getters和setters?嗯…稍微想一下…我们把属性声明为private是为了封装,把事情是如何做的封装在内部,于是日后我们就可以修改我们的业务逻辑代码而不用破坏决定要进入我们的内脏的其他代码(也就是要调用我们的业务逻辑的代码)。
但这对于mock来说并不适用,不是么?根据定义,mock没有任何业务逻辑。
进一步来说,它没有任何东西不是从其他地方拷贝过来的。
所有的mock对象都能100%在build阶段生成!..所以虽然有时候我仍然觉的这么实现Mock有一点恶心,但是最后我会重拾自信,这是最好的方法了。
只是闻起来会让你有些不舒服,但是效果比使用其它方法好多了。
现在我需要使用mock代码来替代调用应用服务器的部分。
我对需要使用mock的地方做了高亮:1 public class FarmServlet extends ActionServlet23 {45 public void doAction( ServletData servletData ) throws Exception67 {89 String species = servletData.getParameter("species");1011 String buildingID = servletData.getParameter("buildingID");1213 if ( able( species ) && able( buildingID ) )1415 {1617 FarmEJBRemote remote = FarmEJBUtil.getHome().create();1819 remote.addAnimal( species , buildingID );2021 }2223 }2425 }首先,让我们把这句代码从其他猛兽中分离出来:23 {45 private FarmEJBRemote getRemote()7 {9 return FarmEJBUtil.getHome().create();11 }1213 public void doAction( ServletData servletData ) throws Exception1415 {1617 String species = servletData.getParameter("species");1819 String buildingID = servletData.getParameter("buildingID");2021 if ( able( species ) && able( buildingID ) )2223 {2425 FarmEJBRemote remote = getRemote();2627 remote.addAnimal( species , buildingID );2829 }3031 }3233 }这有一点痛..我将会继承我的产品类然后重写getRemote(),于是我可以把mock代码混入到这个操作中了。