6. 我需要能复位棋盘,以便于重新开始下棋。
7. 我需要用对记住玩家,以便于我能特例化 Player。
6 和 7 需求的测试案例和实现比较比较简单,不在赘述,7 的要求是要建立玩家 Player,这个主要是说要能实例化玩家。可以看附带的工程。
8. 我需要能保存和加载棋局能力,以便于我能下次回来继续之前的游戏。这个需求是一个合理的需求,玩家可以保存和继续回来玩游戏,他的测试用例可以这样设计: - <font face="微软雅黑" size="3">TEST_F(TicTacToeTestFixture,SaveTheBoard)
- {
- IGameBoard * gameBoard=new SimpleGameBoard("simpleBoard");
- char xChess='x',yChess='o';
- gameBoard->PutChess(0,0,xChess);
- gameBoard->PutChess(1,2,yChess);
- IGameIO *gameIO=new SimpleGameIO();
- EXPECT_NO_THROW(gameIO->save(gameBoard,"somewhere"));
- delete gameBoard;
- delete gameIO;
- }
- TEST_F(TicTacToeTestFixture,LoadTheBoard)
- {
- IGameBoard * gameBoard=new SimpleGameBoard("simpleBoard");
- char xChess='x',yChess='o';
- gameBoard->PutChess(0,0,xChess);
- gameBoard->PutChess(1,2,yChess);
- IGameIO *gameIO=new SimpleGameIO();
- EXPECT_NO_THROW(gameIO->save(gameBoard,"somewhere"));
- IGameBoard *game=gameIO->load("somewhere");
- EXPECT_EQ(xChess,game->GetChess(0,0));
- EXPECT_EQ(yChess,game->GetChess(1,2));
- EXPECT_EQ('+',game->GetChess(2,2));
- delete game;
- delete gameBoard;
- delete gameIO;
- }</font>
复制代码
这里用两个测试用例来覆盖这个需求,一个是保存棋盘,一个是加载棋盘。由这个测试用例可以看到,要通过这个测试,必须要定义 IGameIO 接口和 SimpeGameIO 类。 保存棋盘的媒介是文件。按照 TDD 的开发要求,测试单元本身最好是脱离对第三方系统的依赖,但测试中必然会用到第三方系统,解决这些问题的方法有几种。创建第三方系统的 Stub 类或是 FakedObject,第三种选择是 Mock 框架,如 Gmock。 Gmock 的设计理念是基于接口的,只要是第三方访问提供的是接口,这些访问就可以可以被用 Gmock 模拟。可以看参考文献获取更多的信息。 限于篇幅不再赘述。一下是完成所有测试用例的测试结果。 图 7.测试用例输出
或许你会注意到有些测试用例的设计,只是以点盖面,如果想要更多的验证点可以借助于 Gtest 提供的参数化测试设计测试数据,然后去测试实现的类和逻辑。 还有死亡测试的用例,可以在参考资源中的 Gtest 资源中查看。
|