TDD 的简单概念是在编写新代码之前(开发之前)编写和纠正失败的测试。这有助于避免代码重复,因为我们一次只编写少量代码以便通过测试。(测试只不过是我们需要测试以满足它们的需求条件)。测试驱动开发是在实际开发应用程序之前开发和运行自动化测试的过程。
TDD的主要目标是使代码更清晰、简单和无bug。
测试驱动开发从设计和开发应用程序的每个小功能的测试开始。在TDD方法中,首先,开发测试来指定和验证代码将做什么。
在正常测试过程中,首先生成代码,然后进行测试。测试可能会失败,因为测试甚至在开发之前就已经开发出来了。为了通过测试,开发团队必须开发和重构代码。重构代码意味着更改某些代码而不影响其行为。
下面的步骤说明了如何进行TDD测试:
TDD 生命周期的定义
关于TDD的一些认识:
TDD方法主要是确保你的源代码被彻底测试。
TDD 有两种类型:
Acceptance TDD (ATDD):用ATDD编写一个验收测试。该测试满足了规范的要求,或者满足了系统的行为。之后,编写足够的生产/功能代码来完成验收测试。验收测试侧重于系统的总体行为。ATDD也被称为行为驱动开发(BDD)。
Developer TDD:开发人员TDD,您可以编写单个开发人员测试,即单元测试,然后只需编写足够的生产代码来完成该测试。单元测试侧重于系统的每一个小功能。开发者TDD被简单地称为TDD。
ATDD和TDD的主要目标是在及时(JIT)的基础上为解决方案指定详细的、可执行的需求。JIT意味着只考虑系统中需要的那些需求。所以提高效率。
TDD的优势在于详细说明和验证。它无法考虑更大规模的问题,如总体设计、系统使用或UI。AMDD解决了TDD没有解决的敏捷缩放(裁剪)问题。因此,AMDD用于解决更大规模的问题。
AMDD的生命周期
在模型驱动开发(MDD)中,在编写源代码之前创建广泛的模型。这又有一个灵活的方法?
在上面的图中,每个框代表一个开发活动。
设想是预测/设想将在项目第一周执行的测试的TDD过程之一。设想的主要目标是确定系统的范围和体系结构。高水平的需求和架构建模是为了成功的设想而做的。
它是一个过程,其中没有对软件/系统进行详细的规范,而是探索软件/系统的需求,从而定义项目的总体策略。
1. Iteration 0: 展望
这里有两项子活动:
Sub-task 1: 初始需求.
识别系统的高级需求和范围可能需要几天的时间。主要关注使用模型、初始域模型和用户界面模型(UI)。
Sub-task 2:初始架构
还需要几天时间来识别系统的体系结构。它允许为项目设置技术指导。主要关注于技术图、用户界面(UI)流、域模型和变更案例。
2. 迭代模型
这里团队必须为每个迭代计划将要完成的工作。
3. 模型风暴(Model storming)
这也被称为及时建模(Just in time Modeling)。
4. 测试驱动开发(TDD)
5. 评审
TDD | AMDD |
|
|
|
|
|
|
|
|
|
|
|
|
一个对于用户密码验证的例子:
首先,我们编写代码实现上述需求:
为了运行测试,我们创建 PasswordValidator类。
执行测试,输出 PASSED
这里我们可以在方法TestPasswordLength()中看到,不需要创建PasswordValidator类的实例。实例意味着创建一个类的对象来引用该类的成员(变量/方法)。
我们将从代码中删除类PasswordValidator pv=new PasswordValidator()。我们可以通过PasswordValidator直接调用isValid()方法。IsValid(“Abc123”)。(见下图)
重构代码(Refactoring Code)
重构后的输出显示出失败状态(参见下面的图像),这是因为我们已经删除了实例。因此没有对非静态方法isValid()的引用。
因此,我们需要通过在布尔之前添加“.”单词作为公共静态布尔isValid(String password)来更改此方法。重构类PasswordValidator()以消除上述错误以通过测试。
在更改类PassValidator()之后,如果我们运行测试,那么输出将被PASSED,如下所示。
开发人员测试他们的代码,但是在数据库领域,这通常包括手动测试或一次性脚本。使用TDD,随着时间的推移,您将构建一组自动化测试,您可以和任何其他开发人员随意重新运行这些测试。
- 它有助于理解代码将如何使用以及它如何与其他模块交互。
- 其结果是更好的设计决策和更可维护的代码。
- TDD 允许编写具有单一职责的较小的代码,而不是具有多个职责的单块过程。这使得代码更容易理解。
- TDD 也强制只编写基于用户需求的测试代码来传递测试。
- 如果对代码进行重构,则可能出现代码中断。因此,拥有一组自动化的测试,您可以在发布之前修复这些中断。如果使用自动测试时发现故障,将给出适当的警告。
- 使用TDD,应该可以产生更快、更可扩展的代码,并且具有更少的bug,这些bug可以以最小的风险进行更新。
在团队成员缺席的情况下,其他团队成员可以轻松地获取并处理代码。TDD 还有助于知识共享,从而提高团队的整体效率。
尽管开发人员必须花费更多的时间来编写TDD测试用例,但是调试和开发新特性所花费的时间要少得多。开发者将编写更干净、更简单的代码。