您的位置:首页 > 其它

在使用actor模型的游戏后端框架中添加单元测试

2017-08-16 11:06 260 查看
一直在思考如何在flsg这个使用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,所以可以在每项测试前为该项测试重新初始化相关数据。
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐