浅谈测试驱动开发(TDD)
学会使用行为驱动开发和测试驱动开发的方法

学会使用行为驱动开发和测试驱动开发的方法行为驱动开发(Behavior-Driven Development,简称BDD)和测试驱动开发(Test-Driven Development,简称TDD)是两种软件开发方法,分别强调通过定义行为和测试来驱动软件开发流程。
在这篇文章中,我们将讨论这两种方法的基本概念、原则和使用方法。
1.行为驱动开发(BDD)行为驱动开发是一种以实现和测试软件系统的行为为导向的开发过程。
它强调开发团队应该通过定义目标与期望行为来推动开发过程,以确保最终的软件系统满足用户的需求和期望。
BDD的核心思想是通过故事(stories)和场景(scenarios)来描述系统的行为。
故事描述了用户在特定情境中解决问题的过程,而场景则描述了故事中各个参与者的行为和系统的响应。
BDD的开发流程通常包括以下几个步骤:-了解用户需求和期望-编写故事和场景描述-编写能够验证场景的代码-运行测试并修复问题-重复上述步骤直至所有的故事和场景都得到满足BDD的优点包括:-强调用户需求和期望,提高了软件系统的可靠性和用户满意度-可以促进开发团队与用户、业务部门之间的沟通和理解-通过编写可读性强的场景和测试用例,提高了代码的可维护性2.测试驱动开发(TDD)测试驱动开发是一种以测试为中心的开发方法。
它的核心思想是在编写实际的代码之前先编写对应的测试用例,并确保这些测试用例都会失败。
然后开发人员根据测试用例去实现功能,并运行测试用例来验证代码的正确性。
TDD的基本流程如下:-编写一个失败的测试用例-运行测试,确保测试用例失败-编写最少量的代码,使得测试用例通过-运行测试,确保测试用例通过-重构代码,保持代码的质量和可维护性-重复上述步骤直至所有的功能都得到实现和测试TDD的优点包括:-提高了代码的质量和可靠性,因为每一行代码都会经过测试-避免了过度设计,因为只有满足测试需求的代码才会被编写-提高了代码的可维护性,因为测试用例可以检测到代码变更引起的错误3.行为驱动开发与测试驱动开发的比较行为驱动开发和测试驱动开发有很多相似之处,它们都注重通过测试来驱动开发过程,并且都倡导频繁测试和持续集成的开发模式。
测试驱动开发

测试驱动开发测试驱动开发(TDD,Test Driven Development)是一种软件开发的方法论,它的核心理念是在编写功能代码之前,先编写测试代码。
通过编写测试代码来指导和驱动功能代码的开发,以确保软件具有良好的质量和高度的健壮性。
本文将介绍测试驱动开发的意义、原则以及步骤,并探讨其在软件开发中的应用。
一、测试驱动开发的意义测试驱动开发的出现是为了解决传统软件开发模式下的一些问题。
传统的开发模式中,往往是在编写完功能代码后再编写测试代码,这种做法存在一些不足之处。
首先,由于功能代码的编写已完成,开发者可能会受到其已有逻辑的限制,导致无法全面覆盖各种测试情况。
其次,一旦发现错误,需要进行大量的调试和修改,增加了代码的复杂性和开发时间。
最后,测试在发布之前通常是最后进行的,这可能会导致问题的暴露较晚,并且难以定位和解决。
测试驱动开发通过先编写测试代码,可以解决传统开发模式的问题。
首先,因为测试先行,可以更全面地覆盖各种测试情况,尽早发现潜在问题。
其次,测试代码可以帮助开发者更好地理解需求,明确功能的实现方式。
最后,测试代码的编写可以提前考虑边界条件和异常情况,增加软件的健壮性和稳定性。
二、测试驱动开发的原则在实施测试驱动开发时,需要遵循以下几个原则:1. 测试先行原则:先编写测试代码,再编写功能代码;2. 最小实现原则:在编写功能代码时,尽量实现最小的功能,通过测试后再逐步扩展;3. 频繁重构原则:调整和优化代码结构,保持良好的可读性和可维护性;4. 持续集成原则:将测试代码与功能代码集成到同一个代码库中,实现持续的自动化测试和集成。
这些原则帮助开发者在实践测试驱动开发时保持良好的开发习惯和思维方式,促进软件质量的提升。
三、测试驱动开发的步骤测试驱动开发的步骤通常包括以下几个阶段:1. 编写测试代码:根据需求编写针对功能代码的测试代码,包括输入、输出和预期结果。
2. 运行测试代码:运行测试代码进行测试,确保测试代码能够通过。
测试驱动开发(TDD)提高开发效率的秘诀

测试驱动开发(TDD)提高开发效率的秘诀测试驱动开发(Test-Driven Development,TDD)是一种软件开发方法论,其核心原则是先编写测试用例,再编写代码来满足测试用例的要求。
TDD的目标是提高软件开发过程的质量和效率,并使得代码更加健壮和可维护。
本文将探讨TDD的秘诀和提高开发效率的方法。
一、编写清晰明确的测试用例在开始编写代码之前,先编写测试用例是TDD的核心步骤。
测试用例应该具备明确的输入、输出和预期结果。
通过编写清晰明确的测试用例,可以帮助开发者更好地理解需求,同时也为代码编写提供了明确的目标。
在编写测试用例时,应考虑各种可能的情况,包括边界条件和异常情况。
二、先编写失败的测试用例TDD的另一个核心原则是先编写失败的测试用例。
这是为了确保编写的代码真正能够满足需求,而不是简单地通过测试。
通过先编写失败的测试用例,可以更好地驱动代码的编写,确保代码的正确性和完整性。
只有在编写了失败的测试用例后,才能去编写能够通过这些测试的代码。
三、逐步迭代开发TDD鼓励开发者采用逐步迭代的方式进行开发。
在编写测试用例和代码时,可以分为多个小步骤,每个步骤只需考虑一个需求点。
通过逐步迭代的方式,可以更好地控制代码的复杂度,减少出错的可能性,并且能够更好地进行代码重构。
迭代的过程中,可以不断优化和改进代码,提高其可读性和可维护性。
四、保持测试的可靠性和独立性测试的可靠性和独立性是TDD的关键。
测试用例应该是可靠的,即每次运行测试应该得到相同的结果。
为了保持测试的可靠性,应注意避免使用随机性的因素,同时也应尽量避免对外部环境的依赖。
另外,测试用例应该是独立的,即每个测试用例应该单独测试一个功能点,不依赖其他测试用例的执行结果。
五、及时重构代码TDD强调持续改进和重构代码的重要性。
通过TDD开发出的代码可能不是最优的,但是可以保证其正确性。
在编写代码的过程中,应时刻关注代码的可读性、可维护性和扩展性,并及时进行重构。
tdd原理

tdd原理TDD(测试驱动开发)原理是一种软件开发方法,强调在编写代码之前先编写测试,以确保软件的质量和可靠性。
这种方法的基本思想是:在开发过程中,不断地运行测试,以确保代码的正确性和健壮性。
一、TDD的优势提高代码质量TDD强调测试的重要性,这意味着在编写代码之前,开发人员需要考虑测试案例并定义代码的期望行为。
这种方法可以帮助开发人员发现代码中的错误和缺陷,并及时修复它们,从而提高代码的质量和可靠性。
减少开发时间和成本TDD可以帮助开发人员更快地编写高质量的代码,并减少错误和缺陷的数量。
这意味着开发人员可以更快地交付软件,并减少修复错误和缺陷所需的时间和成本。
此外,TDD还可以帮助开发人员更好地理解需求,并更好地设计代码结构,从而减少代码的复杂性和维护成本。
提高开发效率TDD可以帮助开发人员更快地编写代码,并减少调试和测试的时间。
由于测试是自动执行的,开发人员可以更快地得到反馈,并采取必要的措施来修复错误和缺陷。
这可以提高开发人员的效率,并使他们能够更快地响应变化和需求。
二、TDD的实践步骤编写测试案例在编写代码之前,开发人员需要定义测试案例,以确保代码能够按预期工作。
测试案例应该覆盖所有可能的情况,包括边界条件和异常情况。
测试案例应该是自动化的,并且应该能够快速地运行。
运行测试案例并查看结果在编写完测试案例后,开发人员需要运行这些测试案例并查看结果。
如果测试未通过,则开发人员需要修复代码并重新运行测试,直到所有测试都通过为止。
这个过程应该是自动化的,并且应该能够快速地运行。
编写代码以满足测试案例一旦所有测试案例都通过,开发人员就可以开始编写代码。
由于已经定义了测试案例,开发人员可以更加自信地编写代码,因为他们知道代码必须满足测试案例的要求。
这个过程应该是迭代的,即开发人员需要不断地运行测试并修复错误和缺陷,直到代码满足所有测试案例的要求为止。
三、TDD的注意事项不要过度测试虽然测试是TDD的核心,但是过度测试会增加开发时间和成本。
测试驱动开发(TDD)测试与开发的完美结合

测试驱动开发(TDD)测试与开发的完美结合在软件开发领域,测试驱动开发(Test-Driven Development,简称TDD)已经被广泛应用并被证明是一种非常有效的开发方法。
TDD的核心理念是在编写功能代码之前先编写测试代码,通过测试代码来驱动开发过程,以此来确保代码的质量和功能的完整性。
本文将探讨TDD如何实现测试与开发的完美结合,并分析其优势和实施步骤。
一、TDD的优势TDD的最大优势在于它可以提高软件开发的质量和稳定性。
通过在编写功能代码之前先编写测试代码,可以提前考虑各种边界情况和异常情况,从而减少在后续开发和测试过程中的问题和漏洞。
此外,TDD还可以促使开发人员更加关注软件的设计和接口,进一步提升代码的可读性和可维护性。
另一个TDD的优势在于它可以提高开发效率和降低开发成本。
通过及时执行测试代码,开发人员可以立即发现和解决问题,避免问题在后续阶段的扩大和深化。
同时,TDD还可以减少代码的重构工作,使开发过程更加高效和流畅。
二、TDD的实施步骤TDD的实施步骤可以总结为以下几个阶段:编写测试、运行测试、编写功能代码、运行测试、重构代码。
1. 编写测试在TDD中,测试是先于功能代码的。
开发人员需要思考并明确所需功能的具体要求,并将其转化为测试用例。
测试用例应包含正常输入、边界情况和异常情况等不同测试场景,以覆盖尽可能多的代码路径。
2. 运行测试在编写测试代码完成后,开发人员需要运行测试来验证代码的正确性。
此时,由于尚未实现功能代码,测试当然会失败。
但这种失败并非问题,相反,它告诉开发人员有哪些功能尚未实现,为下一步编写功能代码提供了方向。
3. 编写功能代码在运行测试后,开发人员需要开始编写功能代码,以满足测试用例的要求。
此时,开发人员可以放心地按照测试用例的要求来实现功能,因为测试用例已经帮助我们定义了代码应该具备的行为。
4. 运行测试在编写功能代码完成后,开发人员需要再次运行测试来验证代码的正确性。
测试驱动开发TDD实战与模式解析

测试驱动开发TDD实战与模式解析测试驱动开发(TDD)是一种软件开发方法论,其核心思想是在编写代码之前先编写测试代码,然后通过编写足够的代码来使得测试代码通过。
TDD能够帮助开发人员更加自信地编写代码,并且在整个开发过程中可以保证代码的质量和可维护性。
在TDD的实践中,开发人员首先要编写一个失败的测试用例,这个测试用例描述了期望代码的一些具体行为。
然后,开发人员需要编写足够的代码来满足这个测试用例。
当测试用例通过后,开发人员可以进一步优化代码,重构代码,同时保证测试用例仍然通过。
TDD的核心优势之一是它可以帮助开发人员更好地理解需求,因为在编写测试用例的过程中,开发人员需要清楚地定义每个功能的输入和输出。
这样可以帮助开发人员更好地沟通和理解需求,从而减少需求变更和开发过程中的不确定性。
TDD还可以提高代码的可维护性和可测试性。
通过编写测试用例,开发人员可以更好地理解代码的边界条件和各种情况下的行为。
这样可以使得代码更加健壮和容易维护。
同时,TDD也鼓励开发人员编写可测试的代码,因为测试代码需要和被测代码进行集成测试。
这样可以帮助开发人员更好地设计接口和依赖关系,提高代码的可测试性。
在实践TDD时,开发人员需要注意一些模式和原则。
其中,单一职责原则(SRP)是非常重要的一个原则。
根据SRP,一个类应该有且只有一个职责。
这样可以保证类的扩展性和维护性。
在TDD中,遵循SRP可以帮助开发人员更好地设计和编写测试用例。
此外,开发人员还可以使用一些常见的模式来帮助实践TDD。
例如,工厂模式可以帮助开发人员更好地管理对象的创建过程。
通过工厂模式,开发人员可以将对象的创建逻辑封装在工厂类中,从而减少重复代码和提高代码的可测试性。
另一个常见的模式是依赖注入(DI)。
通过使用DI,开发人员可以将组件之间的依赖关系从代码中解耦出来,从而方便进行测试和扩展。
DI 可以帮助开发人员更好地设计接口和依赖关系,同时提供了一种灵活的方式来替换和改变实现。
如何进行测试驱动开发TDD

如何进行测试驱动开发TDD 测试驱动开发(TDD)是一种以测试为驱动的软件开发方法,它强调先编写测试代码,再编写实现代码。
TDD不仅有助于提高程序员的效率和代码质量,而且能够减少代码错误和维护成本。
对于初学者来说,如何进行TDD还是一个难点。
下面我将从以下几个方面来介绍如何进行TDD。
一、了解TDD的基本原理在开始TDD之前,必须明确TDD的基本原理,它包括三个步骤:1. 写一个自动化测试用例;2. 运行这个测试用例,确保它失败;3. 编写代码,使得测试用例能够通过。
这三个步骤构成了一个TDD的迭代循环,每一次循环都要优先写测试用例,而不是写实现代码。
二、选择适当的测试框架测试框架加速TDD的进程,减少错误和重复性劳动。
选择一个适合自己需求的测试框架是很有必要的。
对于Java开发者来说,JUnit是一个不错的选择;而对于Ruby开发者来说,RSpec是更好的选择。
无论选用哪种测试框架,都应该掌握它的基本概念和使用方法。
三、写好测试用例一个好的测试用例,必须具备以下特点:1. 它必须能够检验一个特定的行为,而不是一个结果;2. 它必须是自动化的,能够在不人为干预的情况下得出测试结果;3. 它必须是可重复的,对于同一个输入应该得到同样的输出结果;4. 它必须是独立的,不依赖其他测试用例或系统环境;5. 它必须是全面的,能够覆盖所有可能出现的情况。
四、编写实现代码实现代码必须按照测试用例的要求进行编写,从而保证代码的正确性和可读性。
当一个测试用例通过后,应该停下来检查是否需要重构或重写代码。
重构和重写的目的是尽可能地消除复杂性,让代码更加简单易懂。
五、持续集成和持续交付持续集成和持续交付是TDD不可或缺的一部分,它可以让代码随时随地得到运行和测试。
通过持续集成和持续交付,可以快速地发现错误和缺陷,并及时修复,保证软件质量。
六、总结TDD是一种以测试为驱动的开发方法,它可以提高代码质量,减少错误和维护成本。
深入探讨测试驱动开发的优势

深入探讨测试驱动开发的优势测试驱动开发(Test-Driven Development,简称TDD)是一种软件开发方法论,其核心理念是先编写测试代码,再编写能通过这些测试的实现代码。
通过测试驱动开发,开发者可以更好地理解需求、减少错误并改善代码质量。
在本文中,将深入探讨测试驱动开发的优势。
一、提高软件质量测试驱动开发强调编写测试代码,并在实现代码之前运行这些测试代码。
通过编写全面的测试用例,开发者可以在每一次的开发迭代中对代码进行验证。
测试用例覆盖率的提升可以大大减少代码中的缺陷和错误。
通过及时发现和修复问题,测试驱动开发可以帮助保持软件质量的稳定和高效。
二、增加代码可维护性测试驱动开发鼓励开发者编写易于测试和清晰易懂的代码。
首先,测试代码本身需要可读性强、易于理解,能够准确覆盖各种场景。
其次,实现代码需要通过这些测试代码,以确保其功能正确性。
因此,在测试驱动的开发模式下,开发者需要更加注重代码的可维护性,编写解耦合、低耦合度的代码结构,以利于测试和维护。
三、快速反馈与迭代测试驱动开发通过频繁运行测试代码并快速反馈结果,有助于开发者及时了解代码的正确性。
只有在测试通过后,开发者才继续推进下一步工作。
这种快速反馈的机制使得开发者能够及时纠正错误,提高效率。
此外,在开发过程中,通过不断迭代,不断完善测试用例和代码实现,能够更好地适应需求变化。
四、提升开发效率测试驱动开发可以帮助开发者更好地理解需求,并在开发过程中充分考虑不同情况下的代码行为。
通过在开发前编写测试用例,可以使开发者更加明确地了解要实现的功能,并可以在确定实现方式前就发现和消除问题。
这样,开发者可以更便捷、高效地编写出满足需求的代码,提升开发效率。
五、促进团队协作测试驱动开发强调频繁运行测试用例,在团队协作中,这种实践可以增强对代码的信任和透明度。
每个团队成员都可以通过运行测试用例来验证代码的正确性,减少了对代码质量的猜测与怀疑。
此外,测试驱动开发还可以促进开发人员和测试人员之间的合作和协同,加强团队内部的交流与理解。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
浅谈测试驱动开发(TDD)李群测试驱动开发(TDD)是极限编程的重要特点,它以不断的测试推动代码的开发,既简化了代码,又保证了软件质量。
本文从开发人员使用的角度,介绍了TDD 优势、原理、过程、原则、测试技术、Tips 等方面。
背景一个高效的软件开发过程对软件开发人员来说是至关重要的,决定着开发是痛苦的挣扎,还是不断进步的喜悦。
国人对软件蓝领的不屑,对繁琐冗长的传统开发过程的不耐,使大多数开发人员无所适从。
最近兴起的一些软件开发过程相关的技术,提供一些比较高效、实用的软件过程开发方法。
其中比较基础、关键的一个技术就是测试驱动开发(Test-Driven Development)。
虽然TDD光大于极限编程,但测试驱动开发完全可以单独应用。
下面就从开发人员使用的角度进行介绍,使开发人员用最少的代价尽快理解、掌握、应用这种技术。
下面分优势,原理,过程,原则,测试技术,Tips等方面进行讨论。
1. 优势TDD的基本思路就是通过测试来推动整个开发的进行。
而测试驱动开发技术并不只是单纯的测试工作。
需求向来就是软件开发过程中感觉最不好明确描述、易变的东西。
这里说的需求不只是指用户的需求,还包括对代码的使用需求。
很多开发人员最害怕的就是后期还要修改某个类或者函数的接口进行修改或者扩展,为什么会发生这样的事情就是因为这部分代码的使用需求没有很好的描述。
测试驱动开发就是通过编写测试用例,先考虑代码的使用需求(包括功能、过程、接口等),而且这个描述是无二义的,可执行验证的。
通过编写这部分代码的测试用例,对其功能的分解、使用过程、接口都进行了设计。
而且这种从使用角度对代码的设计通常更符合后期开发的需求。
可测试的要求,对代码的内聚性的提高和复用都非常有益。
因此测试驱动开发也是一种代码设计的过程。
开发人员通常对编写文档非常厌烦,但要使用、理解别人的代码时通常又希望能有文档进行指导。
而测试驱动开发过程中产生的测试用例代码就是对代码的最好的解释。
快乐工作的基础就是对自己有信心,对自己的工作成果有信心。
当前很多开发人员却经常在担心:“代码是否正确?”“辛苦编写的代码还有没有严重bug?”“修改的新代码对其他部分有没有影响?”。
这种担心甚至导致某些代码应该修改却不敢修改的地步。
测试驱动开发提供的测试集就可以作为你信心的来源。
当然测试驱动开发最重要的功能还在于保障代码的正确性,能够迅速发现、定位bug。
而迅速发现、定位bug是很多开发人员的梦想。
针对关键代码的测试集,以及不断完善的测试用例,为迅速发现、定位bug提供了条件。
我的一段功能非常复杂的代码使用TDD开发完成,真实环境应用中只发现几个bug,而且很快被定位解决。
您在应用后,也一定会为那种自信的开发过程,功能不断增加、完善的感觉,迅速发现、定位bug的能力所感染,喜欢这个技术的。
那么是什么样的原理、方法提供上面说的这些好处哪?下面我们就看看TDD的原理。
2. 原理测试驱动开发的基本思想就是在开发功能代码之前,先编写测试代码。
也就是说在明确要开发某个功能后,首先思考如何对这个功能进行测试,并完成测试代码的编写,然后编写相关的代码满足这些测试用例。
然后循环进行添加其他功能,直到完全部功能的开发。
我们这里把这个技术的应用领域从代码编写扩展到整个开发过程。
应该对整个开发过程的各个阶段进行测试驱动,首先思考如何对这个阶段进行测试、验证、考核,并编写相关的测试文档,然后开始下一步工作,最后再验证相关的工作。
下图是一个比较流行的测试模型:V 测试模型。
【图 V测试模型】在开发的各个阶段,包括需求分析、概要设计、详细设计、编码过程中都应该考虑相对应的测试工作,完成相关的测试用例的设计、测试方案、测试计划的编写。
这里提到的开发阶段只是举例,根据实际的开发活动进行调整。
相关的测试文档也不一定是非常详细复杂的文档,或者什么形式,但应该养成测试驱动的习惯。
关于测试模型,还有X测试模型。
这个测试模型,我认为,是对详细阶段和编码阶段进行建模,应该说更详细的描述了详细设计和编码阶段的开发行为。
及针对某个功能进行对应的测试驱动开发。
【图 X测试模型】基本原理应该说非常简单,那么如何进行实际操作哪,下面对开发过程进行详细的介绍。
3. 过程软件开发其他阶段的测试驱动开发,根据测试驱动开发的思想完成对应的测试文档即可。
下面针对详细设计和编码阶段进行介绍。
测试驱动开发的基本过程如下:1)明确当前要完成的功能。
可以记录成一个 TODO 列表。
2)快速完成针对此功能的测试用例编写。
3)测试代码编译不通过。
4)编写对应的功能代码。
5)测试通过。
6)对代码进行重构,并保证测试通过。
7)循环完成所有功能的开发。
为了保证整个测试过程比较快捷、方便,通常可以使用测试框架组织所有的测试用例。
一个免费的、优秀的测试框架是 Xunit 系列,几乎所有的语言都有对应的测试框架。
我曾经写过一篇文章介绍CppUnit的文章(/developerWorks/cn/linux/l-cppunit/index.shtml)。
开发过程中,通常把测试代码和功能代码分开存放,这里提供一个简单的测试框架使用例子,您可以通过它了解测试框架的使用。
下面是文件列表。
project/ 项目主目录project/test 测试项目主目录project/test/testSeq.cpp 测试seq_t 的测试文件,对其他功能文件的测试文件复制后修改即可project/test/testSeq.hproject/test/Makefile 测试项目的 Makefileproject/test/main.cpp 测试项目的主文件,不需要修改project/main.cpp 项目的主文件project/seq_t.h 功能代码,被测试文件project/Makefile 项目的 Makefile主要流程基本如此,但要让你的代码很容易的进行测试,全面又不繁琐的进行测试,还是有很多测试原则和技术需要考虑。
4. 原则测试隔离。
不同代码的测试应该相互隔离。
对一块代码的测试只考虑此代码的测试,不要考虑其实现细节(比如它使用了其他类的边界条件)。
一顶帽子。
开发人员开发过程中要做不同的工作,比如:编写测试代码、开发功能代码、对代码重构等。
做不同的事,承担不同的角色。
开发人员完成对应的工作时应该保持注意力集中在当前工作上,而不要过多的考虑其他方面的细节,保证头上只有一顶帽子。
避免考虑无关细节过多,无谓地增加复杂度。
测试列表。
需要测试的功能点很多。
应该在任何阶段想添加功能需求问题时,把相关功能点加到测试列表中,然后继续手头工作。
然后不断的完成对应的测试用例、功能代码、重构。
一是避免疏漏,也避免干扰当前进行的工作。
测试驱动。
这个比较核心。
完成某个功能,某个类,首先编写测试代码,考虑其如何使用、如何测试。
然后在对其进行设计、编码。
先写断言。
测试代码编写时,应该首先编写对功能代码的判断用的断言语句,然后编写相应的辅助语句。
可测试性。
功能代码设计、开发时应该具有较强的可测试性。
其实遵循比较好的设计原则的代码都具备较好的测试性。
比如比较高的内聚性,尽量依赖于接口等。
及时重构。
无论是功能代码还是测试代码,对结构不合理,重复的代码等情况,在测试通过后,及时进行重构。
关于重构,我会另撰文详细分析。
小步前进。
软件开发是个复杂性非常高的工作,开发过程中要考虑很多东西,包括代码的正确性、可扩展性、性能等等,很多问题都是因为复杂性太大导致的。
极限编程提出了一个非常好的思路就是小步前进。
把所有的规模大、复杂性高的工作,分解成小的任务来完成。
对于一个类来说,一个功能一个功能的完成,如果太困难就再分解。
每个功能的完成就走测试代码-功能代码-测试-重构的循环。
通过分解降低整个系统开发的复杂性。
这样的效果非常明显。
几个小的功能代码完成后,大的功能代码几乎是不用调试就可以通过。
一个个类方法的实现,很快就看到整个类很快就完成啦。
本来感觉很多特性需要增加,很快就会看到没有几个啦。
你甚至会为这个速度感到震惊。
(我理解,是大幅度减少调试、出错的时间产生的这种速度感)5. 测试技术5.1. 测试范围、粒度对哪些功能进行测试?会不会太繁琐?什么时候可以停止测试?这些问题比较常见。
按大师Kent Benk 的话,对那些你认为应该测试的代码进行测试。
就是说,要相信自己的感觉,自己的经验。
那些重要的功能、核心的代码就应该重点测试。
感到疲劳就应该停下来休息一下。
感觉没有必要更详细的测试,就停止本轮测试。
测试驱动开发强调测试并不应该是负担,而应该是帮助我们减轻工作量的方法。
而对于何时停止编写测试用例,也是应该根据你的经验,功能复杂、核心功能的代码就应该编写更全面、细致的测试用例,否则测试流程即可。
测试范围没有静态的标准,同时也应该可以随着时间改变。
对于开始没有编写足够的测试的功能代码,随着bug的出现,根据bug补齐相关的测试用例即可。
小步前进的原则,要求我们对大的功能块测试时,应该先分拆成更小的功能块进行测试,比如一个类A使用了类B、C,就应该编写到A使用B、C功能的测试代码前,完成对B、C的测试和开发。
那么是不是每个小类或者小函数都应该测试哪?我认为没有必要。
你应该运用你的经验,对那些可能出问题的地方重点测试,感觉不可能出问题的地方就等它真正出问题的时候再补测试吧。
5.2. 怎么编写测试用例测试用例的编写就用上了传统的测试技术。
∙操作过程尽量模拟正常使用的过程。
∙全面的测试用例应该尽量做到分支覆盖,核心代码尽量做到路径覆盖。
∙测试数据尽量包括:真实数据、边界数据。
∙测试语句和测试数据应该尽量简单,容易理解。
∙为了避免对其他代码过多的依赖,可以实现简单的桩函数或桩类(Mock Object)。
∙如果内部状态非常复杂或者应该判断流程而不是状态,可以通过记录日志字符串的方式进行验证。
6. Tips很多朋友有疑问,“测试代码的正确性如何保障?是写测试代码还是写测试文档?”这样是不是会陷入“鸡生蛋,蛋生鸡”的循环。
其实是不会的。
通常测试代码通常是非常简单的,通常围绕着某个情况的正确性判断的几个语句,如果太复杂,就应该继续分解啦。
而传统的开发过程通常强调测试文档。
但随着开发节奏的加快,用户需求的不断变化,维护高层(需求、概要设计)的测试文档可以,更低层的测试文档的成本的确太大了。
而且可实时验证功能正确性的测试代码就是对代码最好的文档。
软件开发过程中,除了遵守上面提到的测试驱动开发的几个原则外,一个需要注意的问题就是,谨防过度设计。
编写功能代码时应该关注于完成当前功能点,通过测试,使用最简单、直接的方式来编码。
过多的考虑后期的扩展,其他功能的添加,无疑增加了过多的复杂性,容易产生问题。
应该等到要添加这些特性时在进行详细的测试驱动开发。