单元测试篇2-TDD三大法则解密

这篇具有很好参考价值的文章主要介绍了单元测试篇2-TDD三大法则解密。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

引言

在我们上一篇文章了解了单元测试的基本概念和用法之后,今天我们来聊一下 TDD(测试驱动开发)

测试驱动开发 (TDD)

测试驱动开发英文全称是Test Driven Development 简称 TDD。

根据 UncleBob 的 TDD 描述总结

我们先创建一个测试项目

直接在 VS 创建即可,可以参考上一篇文章的创建过程

The Three Laws of TDD.

  • You are not allowed to write any production code unless it is to make a failing unit test pass.
  • You are not allowed to write any more of a unit test than is sufficient to fail; and compilation failures are failures.
  • You are not allowed to write any more production code than is sufficient to pass the one failing unit test.

这是本文的描述的三个 TDD 开发的原则,它确保了代码的质量和可维护性。

下面对这三条内容做详细的解释

  • 第一条规则指出 不允许编写任何的生产代码,除非是在让单元测试通过时。
    • 简单理解就是在编写任何实际的业务逻辑代码之前,必须先编写一个或者多个单元测试,这些单元测试因为没有实现所以会失败,有了失败的单元测试之后我们才可以去在生产代码中实现业务逻辑
  • 第二条规则指出 不允许编写比失败所需更多的单元测试代码;编译失败也是失败:

    • 这可以理解为 在编写单元测试时,应该只编写足够使测试失败的最小代码量。这样,可以立即知道新写的生产代码是否解决了问题。编译失败同样被视为测试失败,因为编译不通过意味着代码无法运行。

那一个我们上一章节的一个数学计算类的例子


namespace dotNetParadise_TDD.Test;

public class MathCalculatorTests
{
    [Fact]
    public void Add_TwoNumbers_ReturnSum()
    {
        // Arrange
        var calculator = new MathCalculator();

        // Act
        var result = calculator.Add(3, 5);

        // Assert
        Assert.Equal(8, result);
    }
}

因为我们没有 MathCalculator 这个类的实现所以,代码会编译失败。

单元测试篇2-TDD三大法则解密

在这个示例中,我们展示了如何编写一个简单的单元测试,测试 Calculator 类的 Add 方法是否能够正确地将两个数字相加并返回正确的结果。根据 TDD 原则,我们只编写了必要部分的代码来测试这个功能,并且在这个阶段测试应该会失败,因为 Add 方法还未实现。编译失败也会被视为测试失败,这强调了编写足够简洁和精确的单元测试的重要性,符合第二条准则。

  • 第三条规则指出 不允许编写比通过单个失败单元测试所需更多的生产代码
    可以理解为在编写生产代码时,只需编写足够让失败的单元测试通过的代码,而不是一次性编写完整的功能。这有助于保持代码的小步前进,并且每次更改都有明确的测试验证。

现在把MathCalculator类中增加一个参数*2 即翻倍的一个功能

第一步编写一个单元测试方法,

    [Fact]
    public void DoubleNumber_WhenGivenSingleNumber_ReturnsDouble()
    {
        // Arrange
        var calculator = new MathCalculator();

        // Act
        var result = calculator.DoubleNumber(2);

        // Assert
        Assert.Equal(4, result);
    }

第二步 编写足够让失败的单元测试通过的代码

namespace dotNetParadise_TDD.Test;

public class MathCalculator
{
    public int DoubleNumber(int number)
    {
        throw new NotImplementedException();
    }
}

接下来运行单元测试

 dotNetParadise_TDD.Test.MathCalculatorTests.DoubleNumber_WhenGivenSingleNumber_ReturnsDouble
   源: MathCalculatorTests.cs 行 20
   持续时间: 371 毫秒

  消息: 
System.NotImplementedException : The method or operation is not implemented.

  堆栈跟踪: 
MathCalculator.DoubleNumber(Int32 number) 行 7
MathCalculatorTests.DoubleNumber_WhenGivenSingleNumber_ReturnsDouble() 行 26
RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor)
MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)

结果和预期一样,测试没有成功

单元测试篇2-TDD三大法则解密

现在来重构一下这个方法

    public int DoubleNumber(int number)
    {
        //throw new NotImplementedException();
        return 2 * number;
    }

再次运行单元测试

单元测试篇2-TDD三大法则解密

可以看到单元测试成功了!

TDD 开发流程图

最后

通常我们进行单元测试的时候都是先写业务逻辑,然后再单元测试,当系统业务逻辑变复杂之后可能会遗漏一些测试 CaseTDD 的出现就是解决这个问题,通过测试 Case 来写重构业务代码的模式。

这三个规则确保了 TDD 的核心循环:红(测试失败)、绿(测试通过)、重构。通过不断地重复这个过程,开发者能够编写出高质量、可测试、易于维护的代码。

本文完整源代码
单元测试篇2-TDD三大法则解密文章来源地址https://www.toymoban.com/news/detail-844127.html

到了这里,关于单元测试篇2-TDD三大法则解密的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 测试驱动开发(TDD)前端篇

    当你在写生产代码时,你处在高认知的状态(obvious),你的研发流程和你的工程实践,有助于你一步一步的提升你的认知能力,把你的问题进行一个降解(分解),只要你做到同样的事情,你用什么方法开发,我认为都是一种高效的方法。 TDD的困惑 TDD的思考 TDD的使用场景

    2024年02月09日
    浏览(35)
  • 【敏捷开发】测试驱动开发(TDD)

    测试驱动开发(Test-Driven Development,简称TDD)是敏捷开发模式中的一项核心实践和技术,也是一种设计方法论。TDD有别于以往的“先编码,后测试”的开发模式,要求在设计与编码之前,先编写测试脚本或设计测试用例。 敏捷开发大师Kent Beck在1996年提出了极限编程(Extreme

    2024年02月14日
    浏览(27)
  • Typescript 测试驱动开发 TDD (1)

    在JavaScript开发的现代世界中,有许多不同的前端框架可供我们用来编写应用程序,从旧的框架如Backbone.js到较新的Angular、React和Vue等。这些框架通常使用模型视图控制器(MVC)设计模式或其变体之一,例如模型视图表现器(MVP)或模型视图视图模型(MVVM)。当将这组模式一起

    2024年02月08日
    浏览(30)
  • 前台自动化测试:基于敏捷测试驱动开发(TDD)的自动化测试原理

    一、自动化测试概述 自动化测试主要应用到查询结果的自动化比较,把借助自动化把相同的数据库数据的相同查询条件查询到的结果同理想的数据进行自动化比较或者同已经保障的数据进行不同版本的自动化比较,减轻人为的重复验证测试。多用户并发操作需要自动化模拟来

    2023年04月20日
    浏览(71)
  • 测试计划驱动开发模式 TPDD:一种比 TDD 更友好的开发模式

    相信大部分开发团队都在使用TDD,并且还有很多开发团队都 对外声明 在使用 TDD 开发模式。 之所以说是“对外声明”,是因为很多开发团队虽然号称使用的是 TDD 开发模式,实际开发过程中却无法满足 TDD 的要求。 实际上,测试驱动的开发模式确实有效,它将可能发生的问题

    2024年02月06日
    浏览(25)
  • web自动化测试进阶篇02 ——— BDD与TDD的研究实践

        😏 作者简介:博主是一位测试管理者,同时也是一名对外企业兼职讲师。 📡 主页地址:【Austin_zhai】 🙆 目的与景愿:旨在于能帮助更多的测试行业人员提升软硬技能,分享行业相关最新信息。 💎 声明:博主日常工作较为繁忙,文章会不定期更新,各类行业或职场问

    2024年02月05日
    浏览(34)
  • 【实战】二、Jest难点进阶(二) —— 前端要学的测试课 从Jest入门到TDD BDD双实战(六)

    学习内容来源:Jest入门到TDD/BDD双实战_前端要学的测试课 相对原教程,我在学习开始时(2023.08)采用的是当前最新版本: 项 版本 @babel/core ^7.16.0 @pmmmwh/react-refresh-webpack-plugin ^0.5.3 @svgr/webpack ^5.5.0 @testing-library/jest-dom ^5.17.0 @testing-library/react ^13.4.0 @testing-library/user-event ^13.5.0 b

    2024年02月19日
    浏览(31)
  • 【实战】二、Jest难点进阶(三) —— 前端要学的测试课 从Jest入门到TDD BDD双实战(七)

    学习内容来源:Jest入门到TDD/BDD双实战_前端要学的测试课 相对原教程,我在学习开始时(2023.08)采用的是当前最新版本: 项 版本 @babel/core ^7.16.0 @pmmmwh/react-refresh-webpack-plugin ^0.5.3 @svgr/webpack ^5.5.0 @testing-library/jest-dom ^5.17.0 @testing-library/react ^13.4.0 @testing-library/user-event ^13.5.0 b

    2024年02月19日
    浏览(28)
  • 【实战】二、Jest难点进阶(一) —— 前端要学的测试课 从Jest入门到TDD BDD双实战(五)

    学习内容来源:Jest入门到TDD/BDD双实战_前端要学的测试课 相对原教程,我在学习开始时(2023.08)采用的是当前最新版本: 项 版本 @babel/core ^7.16.0 @pmmmwh/react-refresh-webpack-plugin ^0.5.3 @svgr/webpack ^5.5.0 @testing-library/jest-dom ^5.17.0 @testing-library/react ^13.4.0 @testing-library/user-event ^13.5.0 b

    2024年02月20日
    浏览(32)
  • 【机组】通用寄存器单元实验的解密与实战

    ​ 🌈个人主页: Sarapines Programmer 🔥 系列专栏: 《机组 | 模块单元实验》 ⏰诗赋清音:云生高巅梦远游, 星光点缀碧海愁。 山川深邃情难晤, 剑气凌云志自修。 ​ 目录 🌺一、 实验目的 🌼二、 实验内容 🌻三、 实验详情 实验1:数据输入通用寄存器 实验2:寄存器内

    2024年01月18日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包