永久更新地址:https://my.oschina.net/bysu/blog/1647738

写在前面:若有侵权,请发邮件by.su@qq.com告知。

本文主要是学习《Java测试驱动开发》过程中的记录,除了工具有点不一致之外,其他都是摘抄自书本。

转载者告知:如果本文被转载,但凡涉及到侵权相关事宜,转载者需负责。请知悉!

个人觉得这书相当不错,有兴趣的可以买来看看。

开发“遥控军舰”

1.创建项目

书中主要是通过git导入项目到IntelliJ IDEA中,不过由于本人是用eclipse,所以我通过上面的网址下载了源码自本地,在eclipse中创建了一个gradle项目,然后把源码放到里面相关目录(没有试过导入书中的项目会怎样,因为书中用的是IntelliJ IDEA + gradle+TestNG,感兴趣的可以自己试一下)

工具:eclipse+gradle+TestNG,整个项目目录如下:

2.辅助类

假设这个项目最初是由你的一位同事开发的,他是位卓越的程序员和TDD践行者,你深信他编写的测试有极高的代码覆盖率。换言之,你完全可以依赖他已做的工作。然而,这位同事还未完成这个项目就去度假了,余下的工作将由你接手完成。他创建了所有辅助类: Direction、Location、Planet 和Point。你注意到相应的测试类也已编写好,它们的名称与被测试的类相同,但包含后缀Spec (如Directionspec )。使用这个后缀旨在明确这样一点: 它们不仅用于验证代码,还是可执行的规范。

除这些辅助类外,还有另外两个类: Ship (实现) 和shipspec (规范测试),你的大部分时间都将花在完善它们上。你将在ShipSpec中编写测试,再在Sh ip类中编写实现代码( 与本书前面做的完全相同)。

我们知道,测试不仅提供了验证代码的途径,还是可执行的文档。因此从现在开始,我们将测试称为“规范”。

每次编写规范或实现规范的代码后,我们都将运行测试。

项目创建完毕,着手第一个需求。

3.需求1

要移动军舰,需要知道它当前的位置;另外,还需知道军舰面向哪个方向:北、南、东还是西。因此,第一个需求如下:

给定军舰的起始位置(x,y)以及它面向的方向(N、S、E或W)。

处理这个需求前,先看一下可使用的辅助类。Point类存储了坐标x和y,其构造函数如下:

public Point(int x, int y) {

this.x = x;

this.y = y;

}

还有枚举类Directiion,它定义的值如下:

public enum Direction {

NORTH(0, 'N'),

EAST(1, 'E'),

SOUTH(2, 'S'),

WEST(3, 'W'),

NONE(4, 'X');

}

最后,还有Location类,其构造函数将前述两个类的对象作为参数:

public Location(Point point, Direction direction) {

this.point = point;

this.direction = direction;

}

知道这些后,为第一个需求编写测试就非常容易。你应该像前一章那样做。

请尝试自己编写规范,完成后再将其与本书提供的解决方案进行比较。对于实现规范的代码,也这样做:城市自己编写它们,完成后再与我们提供的解决方案进行比较。

1.规范

这个需求的规范如下:

@Test

public class ShipSpec {

public void whenInstantiatedThenLocationIsSet(){

Location location = new Location(new Point(21, 13), Direction.NORTH);

Ship ship = new Ship(location);

assertEquals(ship.getLocation(), location);

}

}

这个规范很简单,我们 只做了这样的检查:传递给构造函数Ship的Location对象是否被存储;能否通过获取函数getLocation访问它。

使用TestNG时,在类级指定注解@Test后,无需再指定应将哪些方法视为测试。在这里,所有的共有方法都被视为TestNG测试。

2.实现

这个规范的实现非常简单,只需将构造函数的参数赋给变量location即可:

public class Ship {

private final Location location;

public Ship(Location location){

this.location = location;

}

public Location getLocation(){

return location;

}

}

3.重构

我们知道,需要为每个规范实例化Ship,因此需要重构规范类,在其中添加一个用@BeforeMethod注解的方法。如下所示:

import org.testng.annotations.*;

import static org.testng.Assert.*;

@Test

public class ShipSpec {

private Ship ship;

private Location location;

@BeforeMethod

public void beforeTest(){

location = new Location(new Point(21, 13), Direction.NORTH);

ship = new Ship(location);

}

public void whenInstantiatedThenLocationIsSet(){

/*Location location = new Location(new Point(21, 13), Direction.NORTH);

Ship ship = new Ship(location);*/

assertEquals(ship.getLocation(), location);

}

}

我们没有引入任何新的行为,而只将部分代码移到了用@BeforeMethod注解的方法中,以免编写后面的规范时重复这些代码。这样,运行每个测试时,都将使用location为参数实例化一个Ship对象。

4.需求2

知道军舰在什么地方后,下面尝试移动它。首先,我们应该让它能够前进和后退。

实现让军舰前进和后退的命令(f和b)。

辅助类Location已包含方法forward和backward,它们实现了这项功能:

......

public boolean forward() {

return move(FORWARD, new Point(100, 100), new ArrayList<>());

}

public boolean forward(Point max) {

return move(FORWARD, max, new ArrayList<>());

}

public boolean forward(Point max, List obstacles) {

return move(FORWARD, max, obstacles);

}

public boolean backward() {

return move(BACKWARD, new Point(100, 100), new ArrayList<>());

}

public boolean backward(Point max) {

return move(BACKWARD, max, new ArrayList<>());

}

public boolean backward(Point max, List obstacles) {

return move(BACKWARD, max, obstacles);

}

......

1.规范

在军舰朝北的情况下,如果我们向前移动它,结果将如何呢?其y坐标将减1.如果军舰面向东呢?其x坐标应加1。

面对这样的情况,你的第一反应应该是编写两个类似下面的规范:

未完待续...

未完待续...

未完待续...

java测试驱动开发_java测试驱动开发(TDD)之《遥控军舰》相关推荐

  1. java邮箱发送_java邮箱发送报错

    展开全部 package com.gpt.util.email; import java.io.FileOutputStream; import java.util.List; import java ...

  2. Java调用 新浪微博API 接口发微博(包含js微博组件、springMVC新浪登录)详解

    参考自:http://www.myexception.cn/program/1930025.html https://blog.csdn.net/qq_36580777/article/details ...

  3. java计算机毕业设计ssm兴发农家乐服务管理系统n159q(附源码、数据库)

    java计算机毕业设计ssm兴发农家乐服务管理系统n159q(附源码.数据库) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行 ...

  4. JAVA代码给QQ邮箱发邮件

    通过java代码给qq邮箱发邮件 使用发送邮箱所需要2个jar包 activation.jar    mail.jar 下载链接:https://pan.baidu.com/s/1YA3jgmUNzW ...

  5. Java调用 新浪微博API 接口发微博,逐项讲解,绝对清晰

    转载自:http://www.myexception.cn/program/1930025.html Java调用 新浪微博API 接口发微博,逐条讲解,绝对清晰 最近要做个课程设计,使用微博控制树莓 ...

  6. 使用Java接口模拟给员工发工资

    模拟给所有员工发工资. 思路: 1. 定义员工Employee类.包含属性:姓名,薪资,银行卡(保存工资). 2. 定义经理Manager类继承Employee类,包含属性:奖金. 3. 定义职员Cl ...

  7. Java jta 原理_Java的分布式事务(JTA和XA)

    Java的分布式事务(JTA和XA) Java的分布式事务(JTA和XA) 关于JTA事务和XA事务的介绍 何为分布式事务 一个事务包含多个操作,多个操作操作了多个数据源,这样的事务称为分布式事务. ...

  8. 【非专业评测】发蜡、发膏、发泥、发油、啫喱、发膜、发胶、干胶、发棒、摩丝

    本博文不定期更新中.... 注意:博主发质偏硬.偏密.末端微卷,测评结果仅代表个人感受,不同发质人群情况不同 今天我们先从发蜡界的劳斯莱斯--澳洲发蜡Morris Motley(莫里斯·莫特利,圈内简 ...

  9. 猫猫学iOS(四十五)之常用的小功能比如打电话、打开网址、发邮件、发短信打开其他应用。...

    猫猫分享,必须精品 原创文章,欢迎转载.转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243?viewmode=contents 简介 iOS中的很多小功能都 ...

最新文章

  1. Struts2_day02--封装数据到集合里面
  2. 【python】数据结构与算法—哈希表
  3. python 讲课_Python语言
  4. Eclipse之如何导入arr文件
  5. NLP哪个细分方向最具社会价值?
  6. python中mean的用法_python 的numpy库中的mean()函数用法介绍
  7. Java MVC 1.0规范开始进入公开评审阶段
  8. java 清除所有 Session
  9. android 盒子gpu,挑选电视盒子时CPU和GPU哪个更重要?
  10. 成功解决win7不能重装ie9的问题(重整版)
  11. linux 如何清理垃圾文件,Linux系统怎样清理垃圾文件
  12. Snort企业部署实战
  13. tf.executing_eagerly()
  14. 原子和非原子oc_原子宝藏
  15. 分享电脑日常使用的小技巧
  16. Oxyplot实时绘图学习笔记(下)
  17. 五、分享优秀的 RISC-V 项目资源
  18. pycharm运行Project Interpreter是空的怎么办?
  19. Invalid data found when processing input
  20. 阅读笔记之《守破离》

热门文章

  1. 如何画线得到股票中的压力点和支撑点
  2. Python还能这么玩?Turtle一个上帝的指纹!(斐波那契螺旋线)
  3. 游戏党最佳吃鸡低延时蓝牙耳机,高续航随时随地驰骋战场
  4. 《关键对话》读后感脑图
  5. 2021-09-28 双等号==和三等号===的区别
  6. 属性赋初始值的四种写法--C#6.0新特性
  7. java注解教程 pdf_Java注解教程和自定义注解
  8. 200万日本男性首选的黑科技太空裤!首创式“枪弹分离”,不仅保暖,关键是舒服!!...
  9. RStudio个性化界面设置
  10. 2k21服务器维护时间,【NBA2K21 启动脚本前一定要做的几件事情】