TDD 之 Dojo coding

由一个人进行 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的更多相关文章
- Coding Dojo
Coding Dojo 发表于 2012-10-25 什么是Coding Dojo? Coding Dojo是一个学习的过程.一些程序员(通常是15-20人)在一起编程解决一个程序问题.一边编程,一边 ...
- Coding道场:第一次
10/23日,我在部门内部进行了一次内部学习,使用目前流行的Coding Dojo(道场)方式,进行了TDD开发的演练.演练的题目如下: 有关Coding道场的介绍,请自行百度一下,我就不再多 ...
- 一起来学习DOJO吧--序
DOJO的官方站点http://dojotoolkit.org/ DOJO是一套完整的javascript解决方案,从UI到类库都提供了全覆盖的支持. DOJO是一套很重的框架,在运用到项目中前请谨慎 ...
- 现代DOJO(翻译)
http://dojotoolkit.org/documentation/tutorials/1.10/modern_dojo/index.html 你可能已经不用doio一段时间了,或者你一直想保持 ...
- TDD in Expert Python Programmin
Test-Driven Development PrinciplesTDD consists of writing test cases that cover a desired feature, t ...
- python+selenium自动化软件测试(第10章):测试驱动TDD
测试驱动开发模式,要求开发在写业务代码的时候,先写出测试代码,同时单元测试例子决定了如何来写产品的代码,并且不断的成功的执行编写的所有的单元测试例子,不断的完善单元测试例子进而完善产品代码, 这样随着 ...
- CODING 敏捷实战系列课第四讲:从头搭建持续集成 DevOps 流水线
<从头搭建持续集成 DevOps 流水线>由资深敏捷教练.极限编程学院高级讲师.CODING 特邀敏捷顾问李小波老师主讲,将基于 CODING 展示如何编写 Jenkinsfile 搭建 ...
- TDD在Unity3D游戏项目开发中的实践
0x00 前言 关于TDD测试驱动开发的文章已经有很多了,但是在游戏开发尤其是使用Unity3D开发游戏时,却听不到特别多关于TDD的声音.那么本文就来简单聊一聊TDD如何在U3D项目中使用以及如何使 ...
- 初步认识TDD
TDD,测试驱动开发(Test Driven Development)是极限编程中倡导的程序开发方法,以其倡导先写测试程序,然后编码实现其功能得名.本文将对TDD有一个较为系统的认识. 基础属性 ...
随机推荐
- Servlet第五篇【介绍会话技术、Cookie的API、详解、应用】
什么是会话技术 基本概念: 指用户开一个浏览器,访问一个网站,只要不关闭该浏览器,不管该用户点击多少个超链接,访问多少资源,直到用户关闭浏览器,整个这个过程我们称为一次会话. 为什么我们要使用会话技术 ...
- PowerDesigner连接MySQL和逆向工程图
0.写在前面的话 最近想梳理公司项目的表间关系,从项目后台管理系统的操作入手,以及代码的hibernate注解入手,都不算特别尽人意,于是最后还是鼓捣了一下PowerDesigner的逆向工程图,这样 ...
- openEntityForm时候如何给关于(regardingobjectid)类型查找字段赋值?
本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复264或者20170924可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong.me ...
- sdk&jdk&jre
1. jre and jdkJRE(Java Runtime Enviroment)是Java的运行环境.面向Java程序的使用者,而不是开发者.如果你仅下载并安装了JRE,那么你的系统只能运行Jav ...
- 第6章 Overlapped I/O, 在你身后变戏法 ---1
这一章描述如何使用 overlapped I/O(也就是 asynchronous I/O).某些时候 overlapped I/O 可以取代多线程的功用.然而,overlapped I/O 加上co ...
- Hive基础(1)---Hive是什么
1. Hive是什么 Hive是基于Hadoop的数据仓库解决方案.由于Hadoop本身在数据存储和计算方面有很好的可扩展性和高容错性,因此使用Hive构建的数据仓库也秉承了这些特性. 这是来自官方的 ...
- 【Spring】面向切面之AOP
前言 前面已经讲解了bean的装配技术,接着学习Spring中另外一个核心概念:切面. 面向切面 面向切面编程 切面能够帮助模块化横切关注点,横切关注点可以被描述为影响应用的功能,如为业务添加安全和事 ...
- php soap实现WebService接口
nusoap是php写的一个功能文件,下载地址:http://pan.baidu.com/s/1i3mUQJr 一.不使用wsdl服务端 server.php <?php //包函nusoap. ...
- JavaScript 版数据结构与算法(三)链表
今天,我们要讲的是数据结构与算法中的链表. 链表简介 链表是什么?链表是一种动态的数据结构,这意味着我们可以任意增删元素,它会按需扩容.为何要使用链表?下面列举一些链表的用途: 因为数组的存储有缺陷: ...
- Jquery仿京东分类导航层简单实现
<script src="/js/jquery-1.11.1.min.js" type="text/javascript"></script& ...