TDD实践小结

2024-03-01 23:48
文章标签 实践 小结 tdd

本文主要是介绍TDD实践小结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

所谓TDD,就是测试驱动开发。近期看了一些如何写代码的书,包括《修改代码的艺术》,《代码整洁之道》等,这些书都提到了TDD。

我记得几年以前在书店就开始看到关于极限编程的书,也偶尔听到测试驱动开发的概念。大体的思想就是在实现一个功能时,先写测试用例,

再写代码,然后让代码 通过测试用例。通过不断的迭代,来完善所开发的功能。

我以前也尝试过TDD,虽然也有收益,但现在看来,当时做的还不算TDD。主要原因是我的单元测试的粒度太粗糙,因为不会打桩,很多分支和

逻辑都走不到,而且因为需要真实的环境(比如需要真实的数据库环境),所以测试代码的维护成本较高,并且测试用例运行的时间也较长。

这些都让TDD很难持续下去,我觉得我当时的单元测试用例,更像是集成测试用例。而且这种测试用例往往是一次性的。

最近我对TDD产生兴趣的重要原因是我现在调试程序的成本比以前要高的多了。如果你在真实环境中发现并解决一个bug需要至少2个小时的话,

你肯定希望代码在真实环境测试前bug已经被消除。TDD的价值就在于此。

但TDD不能发现所有的bug,有两类bug,TDD是无能为力:

第一个是与操作系统的接口层,或者其他第三方库的接口层, 如果程序包括界面,还包括界面相关代码,这部分UT测试不到;

第二个是设计者逻辑上的理解错误,当我们期望的结果就是错的时候,UT就无能为力了。

除此之外,UT都可以测到,通过打桩的办法,可以实现分层测试,并且可以把每个UT的运行时间控制在毫秒级别。

我前段时间添加一个新功能,用TDD的方式来做,大概写了700多行测试代码,300多行正式代码。在编码过程中,发现了好几个

bug,但是在真实环境中调试还是遇到了问题,后来分析遇到的问题,就是前面说的这两种情况。其他的bug,都在调试之前解决掉了。

即使这样,我从开始调试到解决问题还是用了一天的时间。如果没有TDD估计效率只会更低。

还有一点,TDD不能完全取代设计,虽然TDD本身是个设计的过程,在做TDD前,要有一个初步的设计方案。

另外,如果要写出好代码,光有TDD不够,要能熟练运用各种设计模式。

这篇关于TDD实践小结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/764241

相关文章

python uv包管理小结

《pythonuv包管理小结》uv是一个高性能的Python包管理工具,它不仅能够高效地处理包管理和依赖解析,还提供了对Python版本管理的支持,本文主要介绍了pythonuv包管理小结,具有一... 目录安装 uv使用 uv 管理 python 版本安装指定版本的 Python查看已安装的 Python

C#中DrawCurve的用法小结

《C#中DrawCurve的用法小结》本文主要介绍了C#中DrawCurve的用法小结,通常用于绘制一条平滑的曲线通过一系列给定的点,具有一定的参考价值,感兴趣的可以了解一下... 目录1. 如何使用 DrawCurve 方法(不带弯曲程度)2. 如何使用 DrawCurve 方法(带弯曲程度)3.使用Dr

Python 中的 with open文件操作的最佳实践

《Python中的withopen文件操作的最佳实践》在Python中,withopen()提供了一个简洁而安全的方式来处理文件操作,它不仅能确保文件在操作完成后自动关闭,还能处理文件操作中的异... 目录什么是 with open()?为什么使用 with open()?使用 with open() 进行

MySQL 分区与分库分表策略应用小结

《MySQL分区与分库分表策略应用小结》在大数据量、复杂查询和高并发的应用场景下,单一数据库往往难以满足性能和扩展性的要求,本文将详细介绍这两种策略的基本概念、实现方法及优缺点,并通过实际案例展示如... 目录mysql 分区与分库分表策略1. 数据库水平拆分的背景2. MySQL 分区策略2.1 分区概念

Python基础语法中defaultdict的使用小结

《Python基础语法中defaultdict的使用小结》Python的defaultdict是collections模块中提供的一种特殊的字典类型,它与普通的字典(dict)有着相似的功能,本文主要... 目录示例1示例2python的defaultdict是collections模块中提供的一种特殊的字

Spring Security方法级安全控制@PreAuthorize注解的灵活运用小结

《SpringSecurity方法级安全控制@PreAuthorize注解的灵活运用小结》本文将带着大家讲解@PreAuthorize注解的核心原理、SpEL表达式机制,并通过的示例代码演示如... 目录1. 前言2. @PreAuthorize 注解简介3. @PreAuthorize 核心原理解析拦截与

C++变换迭代器使用方法小结

《C++变换迭代器使用方法小结》本文主要介绍了C++变换迭代器使用方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、源码2、代码解析代码解析:transform_iterator1. transform_iterat

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Java中的String.valueOf()和toString()方法区别小结

《Java中的String.valueOf()和toString()方法区别小结》字符串操作是开发者日常编程任务中不可或缺的一部分,转换为字符串是一种常见需求,其中最常见的就是String.value... 目录String.valueOf()方法方法定义方法实现使用示例使用场景toString()方法方法

Java中List的contains()方法的使用小结

《Java中List的contains()方法的使用小结》List的contains()方法用于检查列表中是否包含指定的元素,借助equals()方法进行判断,下面就来介绍Java中List的c... 目录详细展开1. 方法签名2. 工作原理3. 使用示例4. 注意事项总结结论:List 的 contain