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. Html在线编辑器--基于Jquery的xhEditor轻量级编辑器

    xhEditor V1.2.2 下载地址 开源中国社区: http://www.oschina.net/p/xheditor xhEditor是一个基于jQuery开发的简单迷你并且高效的可视化XHT ...

  2. geotrellis使用(三十四)矢量瓦片技术研究——矢栅一体化

    前言 本文所涉及技术与Geotrellis并无太大关系,仅是矢量瓦片前端渲染和加载技术,但是其实我这是在为Geotrellis的矢量瓦片做铺垫.很多人可能会说,Geotrellis为什么要搞矢量瓦片, ...

  3. Matlab入门学习(矩阵、函数、绘图的基本使用)

    一.矩阵 1.定义和简单使用(一般的编程语言,数组下标都是从0开始的,但是MATLAB是从1开始的) >> a=[ ; ; ] a = >> b=[ ; ; ]; >&g ...

  4. 什么是PWM信号

    PWM信号脉宽调制PWM是开关型稳压电源中的术语.这是按稳压的控制方式分类的,除了PWM型,还有PFM型和PWM.PFM混合型.脉宽宽度调制式(PWM)开关型稳压电路是在控制电路输出频率不变的情况下, ...

  5. Hive基础(1)---Hive是什么

    1. Hive是什么 Hive是基于Hadoop的数据仓库解决方案.由于Hadoop本身在数据存储和计算方面有很好的可扩展性和高容错性,因此使用Hive构建的数据仓库也秉承了这些特性. 这是来自官方的 ...

  6. Vue状态管理vuex

    前面的话 由于多个状态分散的跨越在许多组件和交互间各个角落,大型应用复杂度也经常逐渐增长.为了解决这个问题,Vue提供了vuex.本文将详细介绍Vue状态管理vuex 引入 当访问数据对象时,一个 V ...

  7. 随机算法 poj 2576 Tug of War

    Tug of War Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 8187   Accepted: 2204 Descri ...

  8. Dubbo分布式服务子系统的划分

    一.划分子系统的策略 按照系统的业务模块的独立性划分 二.划分时服务子系统的数量的控制 过多:可能划分过细,破坏业务子系统的独立性,部署维护工作量大,独立进程占用内存多 过少:没能很好的解耦,开发维护 ...

  9. 使用java实现面向对象-File I/O

    java.io.File类用于表示文件(目录) File类只用于表示文件(目录)的信息(名称.大小等),不能用于文件内容的访问 RandomAccessFile java提供的对文件内容的访问,既可以 ...

  10. Nginx详细安装部署教程

    一.Nginx简介 Nginx是一个web服务器也可以用来做负载均衡及反向代理使用,目前使用最多的就是负载均衡,具体简介我就不介绍了百度一下有很多,下面直接进入安装步骤 二.Nginx安装 1.下载N ...