最近一年都在做SNSGame,服务端当然还是用的PHP,而客户端则使用了Flash。
由于使用Flash做为客户端,服务端就不再需要处理一大堆与HTML相关的问题了。客户端和服务端之间就是单纯的数据交换,这大大减低了进行自动化测试的难度。虽然许多开发者选择AMF作为Flash和PHP之间的RPC解决方案,不过我比较一番,还是选择了JSON格式。比较而言,JSON相对AMF最大的优势就是更灵活,其次则是可以少写不少代码 :)
既然使用JSON,那么对应用程序稍微修改一下。让应用程序在测试模式下返回array,而不是JSON字符串。就可以很方便的对返回数据进行测试了。
测试使用了PHPUnit的BDD支持,然后增加了一些必要的扩展。一个测试看上去如下:
01.class GameActionsTest extends GameActionTestCase 02.{ 03. /** 04. * 游戏初始化 05. * 06. * 初始化时,要传递下列数据到客户端: 07. * 08. * ...... 09. */ 10. function testGameInitAction() 11. { 12. $resultSchema = new SchemaValidator(array( 13. 'player' => array( 14. 'uid' => IModel::TYPE_INT, 15. 'name' => IModel::TYPE_STRING, 16. 17. .... 18. 19. 'items' => new RepeatSchemaValidator(array( 20. 'item_id' => IModel::TYPE_INT, 21. 'type' => IModel::TYPE_INT, 22. 'used' => IModel::TYPE_BOOL, 23. )), 24. ), 25. 'ok' => IModel::TYPE_BOOL, 26. 'current' => IModel::TYPE_INT, 27. )); 28. 29. $this->given('login'); 30. $this->when('run game.init'); 31. $this->then('result is array') 32. ->and('result schema validate', $resultSchema); 33. } 34.} |
测试中,SchemaValidator用于检查服务端返回的数据是否符合指定的格式,以及每一个数据项的类型是否正确。而最后的几行代码则是测试逻辑,对应的中文伪代码如下:
01.$this->given('login'); 02.$this->when('run game.init'); 03.$this->then('result is array') 04. ->and('result schema validate', $resultSchema); 05. 06.伪代码: 07. 08.在 login(登录)后 09.当 run game.init(执行 game.init 动作)时 10.result is array(执行结果应该是一个数组) 11.result schema validate(结果的格式应该通过验证) |
BDD测试相对于单元测试,测试代码本身更具有语义。