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有一个较为系统的认识. 基础属性 ...
随机推荐
- 用List传递学生信息
集合在程序开发中经常用到,例如,在业务方法中将学生信息.商品信息等存储到集合中,然后作为方法的返回值返回给调用者,以此传递大量的有序数据. 本实例将使用List集合在方法之间传递学生的信息.实例效果如 ...
- birt 报表设计总结
1, 通过sql查询出来的数据,当某个字段没有值时,我们期望显示别的东东 在表格单元格或者网格中选中这个值, 在属性编辑器-->映射--> 在映射表中添加映射条件 映射中当使用 等于 时, ...
- RabbitMQ消息队列之一:RabbitMQ的环境安装及配置
RabbitMQ简介: MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们 ...
- PHP中foreach循环传值问题
首先看一段代码: <?php $a=array('ab','cd','ef'); $count=3; foreach($a as $key=>$value){ $value='abcdef ...
- html tip实现
一.介绍before/after CSS中的before和after伪类选择器早在CSS2时就被引入,改属性被所有主流浏览器所支持了.before和after顾名思义,分别指的是伪元素在元素前/后添加 ...
- java集合系列——java集合概述(一)
在JDK中集合是很重要的,学习java那么一定要好好的去了解一下集合的源码以及一些集合实现的思想! 一:集合的UML类图(网上下载的图片) Java集合工具包位置是java.util.* 二:集合工具 ...
- TCP/IP(八)之总结ICP/IP四层模型
前言 在这里有一个问题,有的书上说TCP/IP是四层有的却说是五层.其实这个问题我也上网查了一下资料. tcp/ip是事实标准,分4层.osi模型是国际标准,分7层.讲课的时候,一般把他们综合起来讲, ...
- web版的tty
1.wetty Wetty是使用Node.js和websockets开发的一个开源`Web-based SSH` 2.环境配置 2.1.配置epel源 [epel] name=epel baseu ...
- bzoj2118(加法原理)(墨墨的等式)
题目大意:给定n个物品,每个物品有一个非负价值,问[L,R]区间内有多少价值可以被凑出来. 题意网上一大片,具体求解过程是利用了加法原理,将各个模数拥有的个数之和相加. 就是说随机取一个数a[k],那 ...
- 移动WEB 响应式设计 @media总结
第一种: 在引用样式的时候添加 <link rel="stylesheet" media="mediatype and|not|only (media featur ...