在使用actor模型的游戏后端框架中添加单元测试
2017-08-16 11:06
260 查看
一直在思考如何在flsg这个使用Actor模型的后端页游框架中加入单元测试。
而测试actor类中的方法则有不少区别。
actor 中一般的方法都是Request-Rsponse模式,即接到一个request, 返回一个response。所以测试的第一点是需要比较response的异同,现在游戏中没有比较response的函数,需要添加。
另外,actor中的请求一般还会依赖GameServer类的一些方法,比如sendMessage,broadcast等等,所有需要实现一个GameServer的mock类,来进行测试。
第三点,actor中的请求会衍生出其他请求,这个请求可能是向当前或者其他actor提出。这种请求又分为两类,第一类是同步请求,得到请求结果后再返回response,对该情况进行测试就是第一种测试情况,直接测试response。第二类是异步通知,该情况下该请求不会等待通知的返回结果,所有需要直接对发出的通知进行测试。在我看来对异步通知最后的测试方法是随后加载相应ghost的信息,查看异步通知是否执行正确。这样就不需要改一堆加载不同actor的方法。
另外,游戏还依赖于数据库。对于数据库的依赖有两方面,一方面是从数据库读取数据,一方面是想数据库写入数据。由于flsg中数据库服务是一个单独进程,所以可以在原来的数据库服务的基础上重新写一个数据库stub服务。并且可以在数据库stub中可以在测试最后验证是否全部存到数据库中。从数据库读取的数据可以在stub中写死,这样可以保证每层测试都是基于同样的数据进行。而且这样就不需要给actor添加额外的初始化接口,可以沿用正常流程中的使用数据库内容进行初始化。但是这么做有个很明显的缺点,那就是后面的测试会依赖前面测试的数据,这样依赖太严重。由于数据库数据也是以请求的消息发送给actor,所以可以在每项测试前为该项测试重新初始化相关数据。
单元测试
首先,我们要定义单元和测试这两个概念。通常单元都是指以类为单位, flsg中也不例外,但是由于flsg使用actor模型,我们可以将一个actor视为一个单元,当然每个actor其实也是一个类,但不是每个类都是一个actor。在非actor类中一样可以添加单元测试,但这与其他代码中的单元测试并没有多大区别,我们今天主要讨论的是针对actor的单元测试。结果判定
测试,我们需要定义正确和错误。测试普通类的函数只需要测试返回值或者内部状态中的改变,而测试actor类中的方法则有不少区别。
actor 中一般的方法都是Request-Rsponse模式,即接到一个request, 返回一个response。所以测试的第一点是需要比较response的异同,现在游戏中没有比较response的函数,需要添加。
另外,actor中的请求一般还会依赖GameServer类的一些方法,比如sendMessage,broadcast等等,所有需要实现一个GameServer的mock类,来进行测试。
第三点,actor中的请求会衍生出其他请求,这个请求可能是向当前或者其他actor提出。这种请求又分为两类,第一类是同步请求,得到请求结果后再返回response,对该情况进行测试就是第一种测试情况,直接测试response。第二类是异步通知,该情况下该请求不会等待通知的返回结果,所有需要直接对发出的通知进行测试。在我看来对异步通知最后的测试方法是随后加载相应ghost的信息,查看异步通知是否执行正确。这样就不需要改一堆加载不同actor的方法。
外部依赖
上面段落已经定义了单元和测试,下面就有谈一谈单元测试所依赖的外部环境如何解决。表格
首先,游戏依赖于策划所配的表格。这个还是比较容易解决的,只需要维护一份固定不变的测试表格就ok了。具体到游戏中,配置下测试表格所在路径就行。
数据库
另外,游戏还依赖于数据库。对于数据库的依赖有两方面,一方面是从数据库读取数据,一方面是想数据库写入数据。由于flsg中数据库服务是一个单独进程,所以可以在原来的数据库服务的基础上重新写一个数据库stub服务。并且可以在数据库stub中可以在测试最后验证是否全部存到数据库中。从数据库读取的数据可以在stub中写死,这样可以保证每层测试都是基于同样的数据进行。而且这样就不需要给actor添加额外的初始化接口,可以沿用正常流程中的使用数据库内容进行初始化。但是这么做有个很明显的缺点,那就是后面的测试会依赖前面测试的数据,这样依赖太严重。由于数据库数据也是以请求的消息发送给actor,所以可以在每项测试前为该项测试重新初始化相关数据。相关文章推荐
- 【iOS-Cocos2d游戏开发之十一】使用Box2d物理系统以及在cocos2d框架添加Box2d物理系统lib包的方法
- 【iOS-Cocos2d游戏开发之十一】使用Box2d物理系统以及在cocos2d框架添加Box2d物理系统lib包的方法
- 【Cocos2d游戏开发之十一】使用Box2d物理系统以及在cocos2d框架添加Box2d物理系统lib包的方法
- 【iOS-Cocos2d游戏开发之十一】使用Box2d物理系统以及在cocos2d框架添加Box2d物理系统lib包的方法 推荐
- 【Cocos2d游戏开发之十一】使用Box2d物理系统以及在cocos2d框架添加Box2d物理系统lib包的方法
- 【iOS-Cocos2d游戏开发之十一】使用Box2d物理系统以及在cocos2d框架添加Box2d物理系统lib包的方法
- 【iOS-Cocos2d游戏开发之十一】使用Box2d物理系统以及在cocos2d框架添加Box2d物理系统lib包的方法
- 使用盖莫引擎做的第一个游戏框架
- AX 演示:使用单元测试框架测试类
- 使用Symbian OS Unit单元测试框架进行单元测试
- ADO.NET Entity Framework如何:使用实体数据模型向导(实体框架)
- Android游戏框架Libgdx使用入门
- 使用JUnit在struts+spring+hibernate框架环境下进行单元测试
- Android游戏框架AndEngine使用入门
- ADO.NET Entity Framework 如何:使用存储过程定义模型(实体框架)
- Android游戏框架AndEngine使用入门
- Android游戏框架Libgdx使用入门
- java开源框架集成常见错误之使用Criteria添加查询条件出现java.lang.ClassCastException异常
- 使用JUtil在struts+spring+hibernate框架环境下进行单元测试
- ADO.NET Entity Framework如何:使用存储过程定义模型(实体框架)