测试优先设计案例分析


最近在看《敏捷软件开发--原则、模式与实践》,其中讲的是如何进行测试先行设计。以下是对书中的一个案例进行分析。

测试优先案例

Hunt the Wumpus

玩家在洞穴中移动,设法在Wumpus吃掉之前杀掉Wumpus,洞穴是由相连接的房间组成。每个房间可以具有通向东、南、西、北方向的通道。玩家由行走的方向而四处移动。

在我为这个程序首先编写的测试中,有一个程序4.1中的testMove(),构建一个新的WumpusGame对象,通过一个东面的通道把房间4连接到房间5, 把玩家调出了向东移动的命令,接着断言玩家应该在房间5中。

   @Test
    public void testMove(){
        WumpusGame game = new WumpusGame();
        game.connect(4, 5, "E");
        game.setPlayerRoom(4);
        game.east();
        assertEquals(5, game.getPlayerRoom());
    }

根据书中的测试代码构造出的实现:

//这里使用lombok来简化Getter, Setter和ToString
@Getter
@Setter
@ToString
public class WumpusGame {

    private int playerRoom;

    private Map<Integer, Map<String, Integer>> map = new HashMap<>();

    public void connect(int firstRoom, int anotherRoom, String direction) {
        HashMap<String, Integer> directionMap = new HashMap<>();
        directionMap.put(direction, anotherRoom);
        map.put(firstRoom, directionMap);
    }

    public void east() {
        int roomNumber = map.get(playerRoom).get("E");
        this.setPlayerRoom(roomNumber);
    }

run测试方法,测试通过。
研究这段代码,可以发现以下问题:

  1. 整个代码就是在一个类中。感觉是个面向过程的。
  2. 存储方向的映射,由于需要存储2个房间以及方向的映射关系,是Map内嵌Map的形式。

下面来优化设计:

通过面向对象的思想,将测试代码优化。


    @Test
    public void testMoveObject(){
        Room room4 = new Room(4);
        //Set connection between Room and Room.
        room4.connect(Direction.EAST, 5);

        //construct player and set Room.
        Player player = new Player();
        player.setRoom(room4);
        //let the player to move by east direction.
        player.move(Direction.EAST);
        //Assert the result after the move action.
        assertEquals(5, player.getRoom().getNumber());
    }
  • Player对象
//Player.java
@Getter
@Setter
@ToString
public class Player {

    //the room where the player located.
    private Room room;

    /**
     * @param the direction that the player move to.
     *
    */
    public void move(Direction direction){
        Room nextRoom = this.getRoom().getConnectionMap().get(direction);
        this.setRoom(nextRoom);
    }
}
  • Room对象
//Room.java
@Getter
@Setter
@ToString
public class Room {

    //room number(id)
    private int number;

    public Room(int number) {
        this.number = number;
    }

    //the map to store the other room with this room.
    private Map<Direction, Room> connectionMap = new HashMap<>();

    //create connection between room and room.
    public void connect(Direction direction, int anotherRoom) {
        Room room2 = new Room(anotherRoom);
        connectionMap.put(direction, room2);
    }
}
  • 枚举类Direction,包括东西南北四个方向。
//Direction.java
public enum Direction {
    EAST, WEST, NORTH, SOUTH;
}

以上是对这个案例一点小小的理解,大家有什么更好的优化设计的方法可以在评论去留言啊。

转载于:https://www.cnblogs.com/Jarris/p/9992485.html

发布了0 篇原创文章 · 获赞 0 · 访问量 56
展开阅读全文
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览