dojo和kata的练习记录:
  进入 http://cyber-dojo.org/

  由一个人进行 setup a default practice,然后创建:

  这里支持各种语言和各种测试框架,这里我们选择C++和GoogleTest

  这里是选择一个题目进行联系,我们选择“网球记分规则”来练习。

  成功之后,他会给每个人都分配一个动物头像,下面的三个圈,红色代表case执行失败,黄色代表编译失败,绿色代表case执行通过。

  第一个创建的人,把生成的url中的http://cyber-dojo.org/kata/edit/52E43B0082?avatar=raccoon “52E43B0082” 提取出即可,这样其他人可以通过enter a practice进入:

  所有人进入后,我们可以通过首页的看到所有人的一个状态:

  每个人进入后,都是如下界面:

  这就是我们用来练习的IDE

  默认会帮你生成一个失败的case,我们点击上方的test就会失败。

  于是我们需要修改case,让它变为成功状态,变为绿色。

  这是我修改成功后,点击test之后,得到了绿色的小球,然后再点击绿色小球的结果,这里可以看到你每次的修改。

  后面的流程基本就是写一个case,然后再实现一个逻辑的代码,然后在run。如此反复,我第一次完成的时候的代码:

  先看测试代码:

#include "hiker.hpp"
#include <gtest/gtest.h> using namespace ::testing; TEST(Hiker, player0_0)
{
ASSERT_EQ("Love-All", score(0, 0));
}
TEST(Hiker, player1_1)
{
ASSERT_EQ("Fifteen-All", score(1, 1));
}
TEST(Hiker, player2_2)
{
ASSERT_EQ("Thirty-All", score(2, 2));
}
TEST(Hiker, player0_1)
{
ASSERT_EQ("Love-Fifteen", score(0, 1));
}
TEST(Hiker, player1_0)
{
ASSERT_EQ("Fifteen-Love", score(1, 0));
}
TEST(Hiker, player1_2)
{
ASSERT_EQ("Fifteen-Thirty", score(1, 2));
}
TEST(Hiker, player3_1)
{
ASSERT_EQ("Forty-Fifteen", score(3, 1));
}
TEST(Hiker, player0_3)
{
ASSERT_EQ("Love-Forty", score(0, 3));
}
TEST(Hiker, player4_4)
{
ASSERT_EQ("Deuce", score(4, 4));
}
TEST(Hiker, player5_4)
{
ASSERT_EQ("Advantage Player1", score(5, 4));
}
TEST(Hiker, player4_5)
{
ASSERT_EQ("Advantage Player2", score(4, 5));
}
TEST(Hiker, player6_4)
{
ASSERT_EQ("Win for Player1", score(6, 4));
}
TEST(Hiker, player4_6)
{
ASSERT_EQ("Win for Player2", score(4, 6));
}

  再看业务代码

#include "hiker.hpp"

string score(int p1, int p2)
{
string so[]={"Love","Fifteen","Thirty","Forty"}; cout<<p1<<p2<<endl;
if (p1 < && p2 < )
{
if (p1== && p2==)
{
return "Love-All";
}
else if (p1== && p2==)
{
return "Fifteen-All";
}
else
{
return so[p1]+"-"+so[p2];
}
}
else
{
if (p1==p2)
{
return "Deuce";
}
int cha = p1-p2;
if (cha> && cha<)
{
return "Advantage Player1";
}
else if(cha>)
{
return "Win for Player1";
}
else if(cha< && cha>-)
{
return "Advantage Player2";
}
else if(cha<-)
{
return "Win for Player2";
}
}
return "hello world";
}

  是不是看起来逻辑好乱啊。没错我也是这样的感觉,特别想重构,一般说到重构,很多人心有余悸,没关系,我们有测试用例不用担心。 

  重构完成的代码和测试用例:

#include "hiker.hpp"

string score(int p1, int p2)
{
string s_score[]={"Love","Fifteen","Thirty","Forty"};
string s_same[]={"Love-All","Fifteen-All","Thirty-All","Deuce"};
map<int,string> m_res;
m_res.insert(pair<int, string>(, "Advantage Player1"));
m_res.insert(pair<int, string>(, "Win for Player1"));
m_res.insert(pair<int, string>(-, "Advantage Player2"));
m_res.insert(pair<int, string>(-, "Win for Player2")); cout<<p1<<p2<<endl; // 处理相等的情况
if (p1 == p2)
{
if (p1 > )
return s_same[];
return s_same[p1];
} // 处理赢球数都在3以下的情况
if (p1 < && p2 < )
{
return s_score[p1]+"-"+s_score[p2];
} // 处理赢球数都在3以上的情况
else
{
return m_res[p1-p2]; }
return "error";
}

  可以看到我一共提交了48次

  大家的结果 http://cyber-dojo.org/dashboard/show/D9D934A59E:

  通过这次Dojo Coding,总结如下:

    1、先写case,再实现代码;

    2、每实现一个功能,run一次测试代码;

    3、重构的时候,每个小的单元重构一次,run一次测试代码。

  这样就可以保证,你在重构完成之后,所有的功能是可以通过的。也就是TDD的思想。

TDD 之 Dojo coding的更多相关文章

  1. Coding Dojo

    Coding Dojo 发表于 2012-10-25 什么是Coding Dojo? Coding Dojo是一个学习的过程.一些程序员(通常是15-20人)在一起编程解决一个程序问题.一边编程,一边 ...

  2. Coding道场:第一次

    10/23日,我在部门内部进行了一次内部学习,使用目前流行的Coding Dojo(道场)方式,进行了TDD开发的演练.演练的题目如下:     有关Coding道场的介绍,请自行百度一下,我就不再多 ...

  3. 一起来学习DOJO吧--序

    DOJO的官方站点http://dojotoolkit.org/ DOJO是一套完整的javascript解决方案,从UI到类库都提供了全覆盖的支持. DOJO是一套很重的框架,在运用到项目中前请谨慎 ...

  4. 现代DOJO(翻译)

    http://dojotoolkit.org/documentation/tutorials/1.10/modern_dojo/index.html 你可能已经不用doio一段时间了,或者你一直想保持 ...

  5. TDD in Expert Python Programmin

    Test-Driven Development PrinciplesTDD consists of writing test cases that cover a desired feature, t ...

  6. python+selenium自动化软件测试(第10章):测试驱动TDD

    测试驱动开发模式,要求开发在写业务代码的时候,先写出测试代码,同时单元测试例子决定了如何来写产品的代码,并且不断的成功的执行编写的所有的单元测试例子,不断的完善单元测试例子进而完善产品代码, 这样随着 ...

  7. CODING 敏捷实战系列课第四讲:从头搭建持续集成 DevOps 流水线

    <从头搭建持续集成 DevOps 流水线>由资深敏捷教练.极限编程学院高级讲师.CODING 特邀敏捷顾问李小波老师主讲,将基于 CODING 展示如何编写 Jenkinsfile 搭建 ...

  8. TDD在Unity3D游戏项目开发中的实践

    0x00 前言 关于TDD测试驱动开发的文章已经有很多了,但是在游戏开发尤其是使用Unity3D开发游戏时,却听不到特别多关于TDD的声音.那么本文就来简单聊一聊TDD如何在U3D项目中使用以及如何使 ...

  9. 初步认识TDD

    TDD,测试驱动开发(Test Driven Development)是极限编程中倡导的程序开发方法,以其倡导先写测试程序,然后编码实现其功能得名.本文将对TDD有一个较为系统的认识.    基础属性 ...

随机推荐

  1. Linux硬链接软连接

    转载原文出处:http://www.cnblogs.com/itech/archive/2009/04/10/1433052.html 1.Linux链接概念 Linux链接分两种,一种被称为硬链接( ...

  2. JVM锁机制之synchronized

    概述: synchronized是java用于处理多线程同步的一个关键字,用于标记一个方法/代码块,使之成为同步方法/同步块. 用synchronized可以避免多线程处理时的竞态条件问题. 相关概念 ...

  3. Activiti-02-activiti api

    流程引擎API和服务 通过ProcessEngine你可以获取各种服务,它和所有的服务对象都是线程安全的,因此整个整个应用中可以只有一份. ProcessEngine processEngine =P ...

  4. JPA关系映射之many-to-many

    @ManyToMany Board表实体类 @Entity @Cache(usage=CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) @Table(nam ...

  5. 框架应用:Spring framework (二) - AOP技术

    基础概念 线程中的方法栈 java程序虚拟机启动时会载入程序码,虚拟机会为每一条正在运行的线程生成一个方法调用栈,线程以方法运行为执行单位. AOP概念以及目标 AOP是面向切面编程,其实就是在不修改 ...

  6. [python学习笔记] 运算符

    数学运算符 与大多语言相同的运算符就不介绍了.不同的地方会用 (!不同)标出 与java相同的运算符 , - , * , % , / 不同之处 除法 (!不同) /  与java不同,整数相除,结果为 ...

  7. 常用Linux命令、包括vi 、svn

    /etc/init.d/network restart//===========================================更新脚本cd /www/scripts更新站点./sta ...

  8. escape()、encodeURI()、encodeURIComponent()区别详解(转)

      JavaScript中有三个可以对字符串编码的函数,分别是: escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape,decodeURI,dec ...

  9. Storm同步调用之DRPC模型探讨

    摘要:Storm的编程模型是一个有向无环图,决定了storm的spout接收到外部系统的请求后,spout并不能得到bolt的处理结果并将结果返回给外部请求.所以也就决定了storm无法提供对外部系统 ...

  10. Object.defineProperty()方法的用法详解

    Object.defineProperty()函数是给对象设置属性的. Object.defineProperty(object, propertyname, descriptor); 一共有三个参数 ...