TDD培训回演:四则运算(总结)

前言上周末参加了一次代码培训,首次接触了TDD(Test -Driven Development)开发方式。总的来说,能够接受一种新的编程思想,收获不小。本来是打算当天回家就做下培训内容的总结,结果回家有了其他活动,然后拖到这两天。先是抽时间把培训内容代码的演练自己搞了一遍,主要是回忆整个开发的过程,然后在这里我再记录下,分享TDD开发的魅力。关于TDD介绍的文章网上很多,想了解下的同学可以参考下这篇博文《浅谈测试驱动开发(TDD)》。
摘要由CSDN通过智能技术生成

前言


上周末参加了一次代码培训,首次接触了TDD(Test -Driven Development)开发方式。总的来说,能够接受一种新的编程思想,收获不小。本来是打算当天回家就做下培训内容的总结,结果回家有了其他活动,然后拖到这两天。先是抽时间把培训内容代码的演练自己搞了一遍,主要是回忆整个开发的过程,然后在这里我再记录下,分享TDD开发的魅力。

关于TDD介绍的文章网上很多,想了解下的同学可以参考下这篇博文《浅谈测试驱动开发(TDD)》。

TDD开发实例

    培训实例是实现一个普通的四则运算,以下开始整个过程。


准备工作:环境VC6,新建工程,新建expr.cpp / test.cpp文件。


三步军规(重点)
  1. 编译通过,测试不过;(主要是准备测试用例,测试用例的构建是在准确分析了需求之上的,一句话就是将需求细化,明确至最小)
  2. 快速实现,运行通过;(在步骤一基础上,快速实现功能代码,使所有测试用例均能运行通过)
  3. 消除重复,重构优化,领域规则的抽象;(对代码进行重构,消除重复,甚至进行领域规则的抽象。这个真的很难,往往在实现前两步骤时,消除冗余还好些,至于后面的抽象完全有想象,没有方向。然后,我反正是第一次在写代码时候听说领域规则这么个词,表示不那么明白,后来自己理解就是提取出某一类相似的有规律的内容...)
    三步军规这是培训教练们反复强调的TDD开发步骤,虽然略有循规蹈矩的嫌疑,但对于我们新人来说,TDD开发方式的入门门槛很高,没有一定的积累和经验,我感觉学不来。所以按流程走夯实基础不失为一种好的入门方法。

1. 编译通过,测试不过


    测试驱动开发,自然就应该首先编写测试用例。测试用例的编写其实是一个很难的部分,当然,因为是培训实例,需求都很明确化了,所以这点只能自己感受吧。下面直接给出test.cpp中的测试用例代码,需要说明的是,以下的测试用例都不是一蹴而就写好的,而是随着课程的深入一步一步添加的,这里仅给出最后的总体用例,用例的添加过程在后面的代码演进中体现吧。
/* test.cpp */
#include <assert.h>

extern int expr(const char *);

/* 演练过程中主要用到的代替接口 */
// extern int expr_muldiv(const char *);
// extern int expr_bracket_addsub(const char *);
// extern int expr_bracket_muldiv(const char *);

void main()
{
	// test_pares_num
	assert(expr("1") == 1);
	assert(expr("2") == 2);

	// test_addsub
	assert(expr("1+2") == 3);
	assert(expr("2+3+4") == 9);
	assert(expr("2+3-4") == 1);

	// test_muldiv
	assert(expr("1") == 1);           // assert(expr_muldiv("1") == 1); 
	assert(expr("4*5") == 20);
	assert(expr("4*5*6") == 120);
	assert(expr("4*5/2") == 10);

	// test_mix
	assert(expr("2+4*2") == 10);      
	assert(expr("2+4/2") == 4);
	assert(expr("1+2+3*4") == 15);
	assert(expr("2*3+4/2") == 8);

	// test_mix_bracket
	assert(expr("(1)") == 1);          // assert(expr_bracket_addsub("1") == 1);  or expr_bracket_muldiv()...
	assert(expr("(1+1)") == 2);
	assert(expr("(2+(3-4))") == 1);
	assert(expr("(2*(5+1)") == 12);
	assert(expr("(2+3)-(4-2)") == 3);
	assert(expr("(2+3)*(4/2)") == 10);
	
	// test_pow...
}
/* expr.cpp */
int expr(const char *str)
{
	/* Nothing... */

	return 0;
}

2. 快速实现,重构抽象

    之所以将军规中的二、三步合在一块,是因为培训中都是完成一类测试用例功能,然后对比,重构、抽象,这都是自然一体的,没有明显地分割。

=====(加减法)==============================华丽的分割线=====&#
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值