实习日常(1)——提高代码质量:过度保护以及TDD,BDD

Java TDD/BDD实战指南:从理念到Spring Boot复杂场景测试 测试驱动开发(TDD)和行为驱动开发(BDD)是保障软件质量、提升设计水平的核心工程实践。TDD通过“红-绿-重构”循环,从编写失败测试开始,驱动接口设计,并以测试作为安全网进行代码优化。BDD则通过“Given-When-Then”格式,聚焦用户行为,构建团队共享的可执行需求文档。两者协同,能有效应对需求迭代中的代码腐化问题。在现代Java技术栈中,结合JUnit 5、Mockito、Spring Boot Test切片以及Cucumber等工具,可以系统性地将TDD/BDD应用于数据库交互、外部API调 阅读详情

Beginning

  • TDD,BDD:在刚到公司的时候,重构java旧项目,花了漫长时间,写了与原代码运行路径一致,但很繁复的代码,导致在一天之后难以阐述逻辑。被质疑逻辑错误,当时委屈。最后修改抽出了一个子方法,并且将原if else语句进行了精简,代码逻辑清晰。当时看了一篇还不错的关于代码质量的文章。事实上,TDD,BDD中提到的偶发复杂性(TDD遵循,仅仅编写足以使测试代码通过的代码,保持简单设计并适合目的)和代码质量导致的难以阅读是不同的,但是追求的易读性是共同的。
    • 有时我们喜欢通过产出偶发复杂性(可以替换为简单设计的复杂设计)的设计来展示自己的精神能力,确使自己都理解不了那些设计。(——《有效的单元测试》)
    • 认知超负荷是程序员特别常见的问题,因为编程本质上是繁重的记忆力活动。(——《有效的单元测试》)

TDD与BDD

1. 定义 (引自《有效的单元测试》——Lasse Koskela)

TDD
  • TDD(Test-Driven-Development, 测试驱动开发):在编写出能够证明代码存在的失败测试之前,不写生产代码。
  • 优点:
    • 代码变得可用——代码的设计和API适合于你的使用场景。
    • 代码变得精益——生产代码仅仅实现场景所需要的功能(代码质量的罪魁祸首之一,以及使开发者生产力停滞的主要因素,就是称为偶发复杂性:即不必要的复杂性。可以通过替换为简单的设计来避免它,同时仍然满足需求。)
BDD
  • BDD(Behaviour-Driven-Development,行为驱动开发):是在TDD上发展衍生来的。TDD思想和词汇表中所讲的“测试”会误导人们。

    作为BDD实践者,我们小心地以例子的形式编写验收测试,是任何团队成员都能够理解。我们遵循这个过程,编写例子来从业务干系人那里获得反馈,在动手之前就能了解我们是否在构建正确的东西。(——《Cucumber:行为驱动开发指南》)

    • 也就是说。今天的BDD语境和领域远远超出了代码——最引人注目的是将BDD提升到需求层面,与业务分析和需求行为结合起来。
  • 也就是说我们不是一定要用“测试”来作为工具(但并不是说测试不是TDD的本质——所产生的函数和方法是一种有效确保代码工作的方式。然而,如果不能全面地描述系统的行为,那么它们会带给你一种虚假的安全感)。事实上,我在看过这个概念后,发现在工作时,部门所用的thrift这种RPC,在写代码前先定义好主要的功能函数,包括输入输出,再进行开发,就是一个TDD&&BDD的过程。

2. 例子 : 以下是thrift的IDL(可以理解为是TDD,但是定义这个thrift通过了需求沟通,各部门协调,就可以算是BDD)。

    //服务
    service FavoriteSrv {
        //功能
        /**
         * 是否已收藏
         */
        IsFavorResp isFavor(1: IsFavorReq req) throws(1: SrvException e)
    }
    //返回值
    struct IsFavorResp{
        /**
         * true表示已收藏, false表示未收藏
         */
        1: bool isFavor
    }
    //输入参值
    struct FavorReq{
        1: ReqHeader header
        /**
         * 1: 收藏医院, 2: 收藏医生
         */
        2: i32 favorType
        /**
         * 操作类型 0: 取消收藏, 1: 收藏
         */
        3: i32 operType
        4: i64 objId
        5: i64 accountId
    }

过度保护

同在《有效的单元测试》一书中,也是因为娄哥在测试语音识别测试时念了过分保护一章,引起了我的兴趣从而翻看。当天正好有一个代码要加上错误处理,而错误处理一直在工作中和其他同事有分歧,即某个地方是否需要加上错误处理。以下是个人体悟总结而不是书本摘抄,可能有误。

1. 结论:在何时需要增加守卫语句(空值或错误检查)。

  • 不加上无法或难以定位到错误发生的所在地
  • 会引发业务异常而不发生错误

2.例子:go不完全代码(是否需要处理string转date的错误)

    //将req.DateYM(string)类型转换为date类型
    startYM, err := time.ParseInLocation(constants.DateFormatYYYYMM, req.DateYM, time.Local)
    if err != nil {
        return nil, err
    }
    //将endYM设置为本月的最后一天,通过加一个月同时减去一天
    endYM := startYM.AddDate(0, 1, -1)
  • 这个例子的错误处理是必须的,如果不处理:
    • 可能得到一个错误的与业务不相符的错误数据,而不是引起程序异常结束。
    • 可能在下面AddDate时才发生错误,而不是在Parse时,从而难以定位错误。
    • 在go中,如果不处理err,并且不处理发生错误后的panic,会引起进程的异常关闭。(我遇到的情况已经recover接受了panic,如果以上两点不满足,是可以不处理err的,而是直接读取panic信息进行debug)
  • 可以不处理的情况如下:
    • 如果err的错误会直接引起程序异常结束(不会输出错误业务数据),那我们能够直接定位到错误(在go中就是panic后的信息),而不是难以定位(书作者中提到选择调试的难度和代码的简洁,他选择代码简洁)。
go的题外话:我们应该在错误发生时及时处理还有一个原则,不能引起程序panic,或者说panic后有专门的处理方法(推荐或者一般都会在函数中写上recover处理panic防止进程突然关闭,但是我们在init失败时应该在程序直接关闭而不是用recover阻止。具体前上篇文章。)
TDD与BDD在UI自动化测试中的实战应用与融合策略 在软件工程领域,自动化测试是保障产品质量和提升交付效率的核心实践。其原理在于通过脚本模拟用户操作,自动执行预设的测试用例,从而替代重复、易错的人工验证。这一技术的核心价值在于将测试人员从繁琐的回归测试中解放出来,使其能聚焦于更复杂的业务逻辑探索与测试策略设计。随着敏捷开发和持续交付的普及,自动化测试已成为现代研发流程的必需品。在具体实践中,测试驱动开发(TDD)和行为驱动开发(BDD)是两种主流的自动化测试方法论。TDD侧重于从代码层面驱动设计,通过“红-绿-重构”循环确保单元逻辑的正确性;而BDD则侧重于 阅读详情

相关推荐

行为驱动测试历史发展与现状

行为驱动开发(Behavior Driven Development)即BDD,是一种敏捷开发方法,通常应用在自动化测试中,或者也可称为行为驱动测试。通过使用自然描述语言确定自动化脚本,通过这种方式,能够大大促进团队之间的沟通。实现BDD的工具有Cucumber、JBehave、RBehave,以及桌面客户端CukeTest。 下面以自动化测试开发模式的发展过程来说明下行为驱动测试历史发展与现状...

helloimzzy 3250

使用TensorFlow训练WDL模型性能问题定位与调优

简介 TensorFlow是Google研发的第二代人工智能学习系统,能够处理多种深度学习算法模型,以功能强大和高可扩展性而著称。TensorFlow完全开源,所以很多公司都在使用,但是美团点评在使用分布式TensorFlow训练WDL模型时,发现训练速度很慢,难以满足业务需求。 经过对TensorFlow框架和Hadoop的分析定位,发现在数据输入、集群网络和计算内存分配等层面出现性能瓶颈。...

美团技术团队 6082

Java TDD实战:用JUnit与Mockito构建黑洞级代码质量防线

单元测试是保障软件质量的基础实践,其核心在于通过自动化验证确保代码单元按预期工作。测试驱动开发(TDD)将这一实践提升为设计方法论,通过“红-绿-重构”循环,在编写功能代码前先定义其行为规范,从而驱动出更清晰、松耦合的设计。JUnit作为Java生态的标准测试框架,提供了组织与运行测试的基石;而Mockito则通过模拟外部依赖,实现了测试的隔离性,让开发者能聚焦于当前单元的核心逻辑。这种组合能显著提升代码的健壮性与可维护性,尤其适用于后端服务、工具库等需要长期演进的项目。本文将以一个用户积分系统的实战场景为

403

Java 应用中扮演着非常重要的角色

异常处理在编写健壮的 Java 应用中扮演着非常重要的角色。异常处理并不是功能性需求,它需要优雅地处理任何错误情况,比如资源不可用、非法的输入、null 输入等等。Java 提供很多异常处理特性,通过内置的 try、catch、finally关键字实现。Java 同样允许创建新的异常和使用 throw 和 throws 抛出该异常。在实践中,异常处理不单单是知道语法这么简单。编写健壮的代码更像是一

u012402926的专栏 938

TDD、BDD、DDD、XP、Scrum、Kanban、Design Thinking:现代软件开发方法论全解析

本文全面解析了TDD、BDD、DDD、XP、Scrum、Kanban及Design Thinking等现代软件开发方法论的核心思想、适用场景与实践价值。文章将方法论分为“如何构建”、“如何组织”和“如何思考”三大维度,帮助团队根据项目需求与团队特点,灵活选择和组合这些工具,以更高效地交付高质量软件。

weixin_29197051的博客 306

高杂合度基因组组装实战:Hifiasm参数调优与purge_dups过滤效果对比(附猪毛菜案例)

本文深入探讨了高杂合度基因组组装中Hifiasm参数调优与purge_dups过滤的实战效果对比,通过猪毛菜案例详细解析了两种方法的适用场景与优化策略。文章重点分析了purge_dups在contig过滤中的显著效果,为基因组组装提供了关键的技术参考。

weixin_29232121的博客 495

tdd/bdd

底层原理:一段测试代码,通过这段代码去运行其他代码,预期他的结果,然后判断输出结果是否与预期相等 npm i jest@24.8.0 -D "test":"jest" // 运行时会去找xxx.test.js的后缀进行测试 // 初始化配置 npx jest --init npx jest --coverage // 生成代码覆盖率报告 单元测试:测试一个模块 集成测试:多个模块测试 ...

越思考越清晰 955

ROS2理论与实践_宇树机器人Go2开发指南(文字)

本文介绍了Unitree Go2机器人ROS2开发环境的安装与配置流程。主要内容包括:1)从GitHub克隆unitree_ros2仓库;2)安装ROS2 Foxy版本依赖项;3)编译特定版本的CycloneDDS(0.10.2);4)编译unitree_go和unitree_api功能包;5)网络配置,包括设置静态IP和修改环境变量脚本setup.sh以指定网络接口。文章还提供了本地回环测试的替代方案,并建议配置完成后重启电脑。整个流程涉及ROS2环境切换、网络适配和编译安装等多个技术环节。

Li_Dongyi的博客 4203

实践 TDD / BDD: 两个重要质量工程的实践

在過去十年中,軟件開發中從級聯到敏捷方法的轉變迎來了一個持續測試和變革的時代。這種質量工程的新方法使開發人員能夠引入新的更改並防止錯誤或故障阻礙應用程序的可擴展性,從而使開發過程更加動態化。 在敏捷開發環境中操作的任何人都可能熟悉術語行為驅動開發 (BDD) 和測試驅動開發 (TDD)。由於這兩個術語發音相似,因此很容易將一個與另一個混淆或將它們視為同義詞。然而,事實並非如此。 儘管 BDD 和 TDD 都是測試優先的方法,但過程卻明顯不同。在 TDD 中,書面測試用例用於檢查應用程序功能的有效性。另一

Warren Lynch 的博客 796

AI 大模型在电商精准营销中的应用

例如,对于用户 A 和用户 B,通过比较他们对共同评价过的商品的评分差异来确定相似度。其中,(Gain(D,a))表示特征(a)对数据集(D)的信息增益,(Ent(D))表示数据集(D)的信息熵,(V)表示特征(a)的取值个数,(D^{v})表示特征(a)取值为(v)的样本子集。其中,(sim(A,B))表示用户 A 和用户 B 的相似度,(I)表示用户 A 和用户 B 共同评价过的商品集合,(R_{A,i})和(R_{B,i})分别表示用户 A 和用户 B 对商品(i)的评分。(三)营销活动效果预测。

alittlehippo的博客 1627

解决usbisp不识别无法烧录Atmega328P,Arduino不识别问题

如果使用Arduino IDE里面的烧录,可能会遇到一个问题,就是不识别国产这种廉价的USBISP 点击烧录引导程序,会遭遇到找不到USB设备的问题,选哪个都会提示找不到,比如选择USBasp could not find USB device with vid=0x16c0 pid=0x5dc vendor='www.fischl.de' product='USBasp' 因此,我们需要使用到progisp这一个软件的1.72版本 选择好芯片的型号后,调用编译好的HEX文...

arenascat的博客 7436

【TDD】深度解读 - TDD(测试驱动开发)

有广义和狭义之分,常说的是狭义的 TDD,也就是 UTDD(广义的 TDD 是ATDD),包括BDD)和等。本文所说的 TDD 指狭义上的 TDD,也就是「TDD是敏捷开发中的一项核心实践和技术,也是一种设计方法论。TDD的原理是在开发功能代码之前,。。

qq_43331089的博客 2万+

从选型到调试:MCU外部晶振电路设计的实战避坑指南

本文详细解析了MCU外部晶振电路设计的关键要点,从选型到调试提供全面指南。重点探讨了晶振频率选择、负载电容计算、PCB布局优化等核心问题,并分享常见故障排查技巧与EMC设计经验,帮助工程师规避设计陷阱,提升嵌入式系统时钟稳定性。

weixin_30872577的博客 276

理解单元测试、TDD、BDD

当开始自动化测试你的代码的时候,多数人都会遇到很多疑问,你可能听说过各种人谈论单元测试、TDD、BDD等一堆高大上的方法,但是哪种方法更适合你呢?有没有办法可以同时使用他们呢?关于这些问题我和很多开发人员聊过,发现大家对这些方法或多或少都存在一些疑惑或误解,所以接下来我们来分别谈一下Unit Testing、TDD和BDD,希望借助这篇文章能给大家做出详细的梳理。 单元测试—Unit Testing 单元测试一般关注的是单一的代码单元,一般可能是一个对象或者类的一个具体函数,这类关注单个函数的测试通常是简

飞翔的熊blabla 612

手把手教你用RTL8306MB搭建小型网络交换机:从原理到实战

本文详细介绍了如何使用RTL8306MB交换芯片从零搭建小型网络交换机的全过程。内容涵盖芯片原理分析、核心硬件电路设计(包括电源、时钟、RMII接口连接要点)、驱动开发与SMI通信实现,以及从物理链路到交换功能的系统调试实战。重点解析了将MAC5配置为RMII PHY模式与CPU对接的关键步骤和常见错误,帮助嵌入式开发者深入理解网络交换原理并完成实践。

weixin_29274969的博客 192

十七、SAP-采购订单(STO)

业务逻辑、功能讲解、图文解析、章节总结

m0_72403327的博客 2065

重构软件开发的权力格局:从TDD、DDD到AI时代的SDD,哪种才是你的工程哲学?

十年前,TDD让我们重写测试如同推翻巴别塔;三年前,DDD试图用领域语言统一产品与技术的分歧;今天,SDD直接把“规范”变成可执行的源代码,AI成为这个新世界的翻译官。上周团队来了个新人,对着我们基于DDD设计的微服务架构一脸困惑:“这服务划分的依据是什么?这个聚合根的边界怎么定的?”我让他看领域文档,他翻了几页:“这些和代码对不上啊,上次重构后就没更新了吧?这一瞬间,我突然意识到,我们可能站在又一个范式革命的临界点。

三声三视的博客 3247

ESP32网络开发实例-开发环境搭建

NodeMCU-ESP-32S开发环境搭建 NodeMCU-32S 最强的ESP32 开发板非盗版或副厂的CH340。WiFi 蓝牙ESP-32 可用Arduino IDE ESP32-S 是一款通用型WiFi-BT-BLE MCU模组,功能强大,用途广泛,可以用于低功耗传感器网络和要求极高的任务,例如语音编码、音频流和MP3解码等。 此款模组的核心是ESP32芯片,具有可扩展、自适应的特点。两个CPU核可以被单独控制或上电。时钟频率的调节范围为80 MHz到240 MHz。用户可以切断CPU的电源,利用低

视觉与物联智能 3781

深度解读 - TDD(测试驱动开发)

本文结构: 什么是 TDD 为什么要 TDD 怎么 TDD FAQ 学习路径 延伸阅读 什么是 TDD TDD 有广义和狭义之分,常说的是狭义的 TDD,也就是 UTDD(Unit Test Driven Development)。广义的 TDD 是 ATDD(Acceptance Test Driven Development),包括 BDD(Behavior Driven Development)和 Consumer-Driven Contracts Development 等。 本文所说

足球中国的专栏 1979

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

tdd(测试驱动开发)的概述

简单介绍tdd(测试驱动开发)的方法,思想与一些best practices

abchywabc的博客 1万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

测试驱动开发(TDD):精益求精的基石

测试驱动开发(Test-Driven Development,TDD)远不止是一种测试技术,它是一种反直觉但极其强大的编程实践。这个简单的约束引发了一系列连锁反应,引导开发者构建出更健壮、更灵活的软件系统。

xiaoyi_168的博客 1000

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

TDD--01--ATDD、UTDD

TDD概念 TDD(Test-Driven Development) “测试驱动开发". 是敏捷开发中的一项核心实践和技术、是一种方法论。思路是通过测试来推进整个开发的进行。表现为测试代码优先于业务代码。 TDD有别于以往的“先编码、后测试”的开发过程,而是在编程之前,先写测试脚本或设计测试用例。TDD在敏捷开发模式中被称之为“测试优先的编程(test-first programming)”, TDD具体实施过程,可以看作两个层次 UTDD 在代码层次,在编码之前写测试脚本,可以称为单元测试驱动开发

时光里的博客 3254

深度解读 TDD(转载)

TDD 有广义和狭义之分,常说的是狭义的 TDD,也就是 UTDD(Unit Test Driven Development)。广义的 TDD 是 ATDD(Acceptance Test Driven Development),包括 BDD(Behavior Driven Development)和 Consumer-Driven Contracts Development 等。本文所说的 TDD 指狭义上的 TDD,也就是「单元测试驱动开发」。

weixin_55282974的博客 320
上一篇: go错误处理——return,panic,defer
下一篇: 日常英文缩写以及杂记
V_code
博客等级 码龄12年 5粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值