测试驱动开发TDD(1)

简介:
  TDD
  今儿接到一需求如下:
  比如一个给定的数字2975,让你去猜。6次机会。如果第一次输入2509,系统会提示 1A2B:其中数字“2”位置猜对&&数字也猜对。称为1A,而“9”和“5”数字猜对了但是位置没有猜对。称为2B。。如果输入2975那么就是4个数字都猜对了并且位置也是对的系统提示4A0B。民间俗称猜数字游戏: 百度百科传送门:http://baike.baidu.com/view/358630.htm。
  做个简单分析。客户端输入一个数字,经过游戏内部的猜测,返回一个结果给客户端。嗯,还好,不算难。由于准备做TDD实践。所以我们 Test First.Why? 如果您对TDD不是很了解。就跟我一起做下去,显然我也是新手。我们的目标是“没有蛀牙!”。
  准备 工作:VS任意一个版本(C#)、任意一款 测试工具、纸、笔(真彩0.5的)。
  第一步:笔和纸拿出来。思考思考如何把这个小游戏拆分了。然后我们一步一步去完成它。写一个To-Do-List。
  To-Do-List:
  猜测数字
  输入验证
  生成答案
  输入次数
  输出猜测结果
  ...............
  暂时想起这么多。比如还有选择游戏难度、输入日志、重新开始游戏、中途退出等等。
  今天我要完成这个游戏的核心功能(猜测数字),我称它为Guesser。传入一个数字,返回一个结果。分析一下它可能输出的几种情况:4a0b(全对)、 0a4b(数字全对,位置全错)、2a2b(一半一半)、0a0b(全错)。这4个CASE应该Cover了所有情况了。如果有补充,请Follow。
  今天的TO-DO-LIST:
  假设我们这局游戏的答案是2975。
  输入“2975” 输出4a0b。
  输入“2957” 输出2a2b。
  输入“9257” 输出0a4b。
  输入“1348” 输出0a0b。
  完成Guesser类.
  新建一个TEST 写测试。
  开始第一个CASE:输入2975 与答案正匹配,输出4a0b 。
[TestMethod]
public void Test1()
{
var inputNumber = "2975";
var actual = new Guesser().Guess(inputNumber);
Assert.AreEqual("4a0b", actual);
}
  这个测试方法的命名一眼好像看不出它要测什么。单独看测试的名字很是迷茫。我们修改一下让它看起来很整洁。一眼看上去就知道是啥意思。要测试什么。
[TestMethod]
public void should_return_4a0b_when_input_numbers_all_figures_and_positions_are_right()
{
var inputNumber = "2975";
var actual = new Guesser().Guess(inputNumber);
Assert.AreEqual("4a0b", actual);
}
  修改完之后在看这个方法的命名。 是不是清晰了很多。看到方法的命名应该就能够猜测到此方法是在什么情况下测试什么功能。
  OK。我们的第一个CASE搞定了。Run一下。
  OK。但是我们内部实现如此简单。不知道是否满足第二个CASE呢。
  完成一个CASE要把它划掉。
  To-Do-List:
  输入“2975” 输出4a0b。
  输入“2957” 输出2a2b。
  输入“9257” 输出0a4b。
  输入“1348” 输出0a0b。
  完成Guesser类.
  来第二个CASE:输入9257与答案不匹配,但是所有数字都正确,输出0a4b 。
  有了第一个CASE的经验,这里我们也同样注意命名。
[TestMethod]
public void should_return_2a2b_when_input_numbers_all_figures_right_and_2_positions_right()
{
var inputNumber = "2957";
var actual = new Guesser().Guess(inputNumber);
Assert.AreEqual("2a2b", actual);
}
Run.....
  没有PASS:Assert.AreEqual failed. Expected:<2a2b>. Actual:<2a0b>.
  我们接着去改guess方法,保证第二个CASE PASS。
public class Guesser
{
private const string AnswerNumber = "2975";
public string Guess(string inputNumber)
{
var aCount = 0;
var bCount = 0;
for (var index = 0; index < AnswerNumber.Length; index++)
{
if (AnswerNumber[index]==inputNumber[index])
{
aCount++;
continue;
}
if (AnswerNumber.Contains(inputNumber[index].ToString()))
{
bCount++;
}
}
return string.Format("{0}a{1}b", aCount, bCount);
}
}
  运行所有CASE...pass.别忘记划掉To-Do-List
{
}
{
}
{
}
{
}
  不知不觉我们已经完成了今天的所有任务。
   To-Do-List:
  输入“2975” 输出4a0b。
  输入“2957” 输出2a2b。
  输入“9257” 输出0a4b。
  输入“1348” 输出0a0b。
  完成Guesser类.
  Go Home.然后别忘记把总的List划掉。
   今天的任务完成。今天收获是什么?
  (1)Test First。从用户角度去思考问题。在设计CASE之前。会把关注点放到需求上。只有足够透彻的了解需求。才能设计出正确全面的CASE。
  (2)命名。在最开始我们把Test1改成了‘should_return_4a0b_when_input_numbers_all_figures_and_positions_are_right’。看到方法名,就相当于看到文档。很快速的知道当前方法测的是什么功能。而不需要去翻阅文档。维护起来也是相当清晰。不用花大把时间去维护文档。
   当然也有些疑问。
  (1)先写测试在写代码开发速度降低了。
  带着这些疑问。继续做下去。希望在这个系统实现完之后能解决我的疑问。
  最后Yuheng同学提出了一个问题。
  有4个分别是[风险高 价值高]、[风险高 价值低]、[风险低 价值高]、[风险低 价值低]的事情,你会优先做哪个?
  大家可以给出自己的答案。

最新内容请见作者的GitHub页:http://qaseven.github.io/

相关文章
|
5月前
|
Devops Java 测试技术
软件测试/测试开发|常见软件测试框架类型:TDD、BDD、DDD、ATDD、DevOps介绍
软件测试/测试开发|常见软件测试框架类型:TDD、BDD、DDD、ATDD、DevOps介绍
73 0
|
5月前
|
监控 前端开发 JavaScript
如何测试前端代码? 知道 BDD, TDD, Unit Test 么? 知道怎么测试你的前端工程么(mocha, sinon, jasmin, qUnit..)?
如何测试前端代码? 知道 BDD, TDD, Unit Test 么? 知道怎么测试你的前端工程么(mocha, sinon, jasmin, qUnit..)?
77 0
|
6天前
|
算法 测试技术 开发者
测试驱动开发(TDD)实战:从理论到实践
【5月更文挑战第8天】TDD实战指南:先测试后开发,确保代码质量与可维护性。核心思想是编写测试用例→实现代码→验证→重构。优点包括提高代码质量、促进设计思考和增强可测试性。实战步骤包括编写独立、明确的测试用例,遵循最小可用原则编写代码,运行测试并分析失败原因,以及在验证通过后进行代码重构与优化。通过TDD,开发者能提升编程技能和项目成功率。
|
14天前
|
测试技术 持续交付 Swift
【Swift开发专栏】Swift中的测试驱动开发(TDD)
【4月更文挑战第30天】Test-Driven Development (TDD) 是一种软件开发方法,强调先编写测试用例再写代码。通过测试驱动代码、简明设计、重构和持续集成的循环过程,TDD助力构建高质量Swift软件。在Swift中,使用XCTest框架进行TDD实践,包括编写测试用例、实现功能、运行测试和重构。TDD的优势在于提升代码质量、减少调试时间,且与持续集成相结合。然而,学习曲线和确保测试覆盖率是挑战。TDD不仅是技术实践,也是思维方式,随着Swift的发展,其应用将更广泛。
|
17天前
|
测试技术 开发者
【专栏】测试驱动开发(TDD)和行为驱动开发(BDD)的核心概念与实践
【4月更文挑战第27天】本文探讨了测试驱动开发(TDD)和行为驱动开发(BDD)的核心概念与实践。TDD强调先写测试用例,通过测试推动设计,确保代码质量与可维护性。BDD侧重软件行为和业务价值,提倡使用通用语言描述行为,减少沟通障碍。选择TDD或BDD取决于项目复杂性、团队技能和业务需求。理解两者差异有助于团队做出合适的选择,发挥测试的最大价值。
|
25天前
|
IDE Java 测试技术
Java 测试驱动开发(TDD)实践指南
【4月更文挑战第19天】测试驱动开发(TDD)在Java中强调先写测试用例再写代码,以提升代码质量和可维护性。核心原则是先写测试,确保代码功能正确,降低风险并促进良好设计。实践包括选择IDE,安装JUnit,明确需求,编写失败测试,写最小代码使测试通过,重构并重复该过程。编写测试用例应明确、独立且可重复。TDD能增强开发信心,提高效率,保证代码维护性。遵循指南,开发者能写出高质量代码,为未来开发打下基础。
|
5月前
|
监控 前端开发 JavaScript
如何测试前端代码? 知道 BDD, TDD, Unit Test 么? 知道怎么测试你的前端工程么(mocha, sinon, jasmin, qUnit..)?
如何测试前端代码? 知道 BDD, TDD, Unit Test 么? 知道怎么测试你的前端工程么(mocha, sinon, jasmin, qUnit..)?
41 0
|
3月前
|
测试技术 Python
Python中的单元测试与测试驱动开发(TDD)实践
Python中的单元测试与测试驱动开发(TDD)实践
|
4月前
|
自然语言处理 测试技术
测试驱动开发(TDD)与行为驱动开发(BDD)的比较与选择
在软件开发中,测试驱动开发(TDD)与行为驱动开发(BDD)是两种常见的开发方法。虽然它们都强调测试在开发过程中的重要性,但是两者之间存在一些差异。本文将对TDD和BDD进行比较,分析它们各自的优点和缺点,以及在实际开发中如何选择最适合的方法。
|
6月前
|
测试技术 开发者 Python
Python中的单元测试与测试驱动开发(TDD)指南
测试是保障代码质量的关键步骤,而Python提供了强大的测试工具和框架,让开发者能够轻松地进行单元测试和测试驱动开发(TDD)。本文将深入探讨单元测试的概念、`unittest`库的基本用法,以及如何通过TDD的方式构建高质量的Python代码。

热门文章

最新文章