🤖 使用bots进行调试
bots机器人介绍:
bots就是机器人,可以模拟客户端的连接、通讯、操作等,是一种对服务端进行模拟测试的轻量级客户端程序,并且bots没有渲染等部分。引擎提供了Python脚本API,使开发者无需知道底层实现,简单的通过API和相关配置就可以创建出自己的机器人。
虽然bots一般用来做压力测试的,但同时它也是非常方便快捷的调试工具。在开发初期,使用bots编程,利用少量的bots对客户端进行模拟,可以快速测试出服务器是否存在业务逻辑上的Bug。之后加大bots的数量进行压力测试,测试服务器隐藏的Bug以及压力承受能力。
bots编程:
和其他服务器端的脚本开发一样,bots编程是利用引擎提供的API,模拟客户端的交互和通讯,就像是一个真的客户端一样。
脚本存放位置:
与app上的脚本开发不同,其脚本位置在: {项目资产库}/scripts/bots
文件夹下,同时也有入口脚本kbemain.py
。
API:
API可查询API-BOTS。我们在这里举个简单的例子:模拟客户端登录服务器,向服务器请求角色列表,并创建一个角色。我们先来看一下Account的def配置:
<root>
<Properties>
<!--角色的字典-->
<characters>
<Type>AVATAR_INFO_LIST</Type>
<Flags>BASE</Flags>
<Default></Default>
<Persistent>true</Persistent>
</characters>
</Properties>
<!-- 客户端远程方法 -->
<ClientMethods>
<!-- 请求avatar列表后,返回给客户端 -->
<onReqAvatarList>
<!--返回的角色列表-->
<Arg> AVATAR_INFO_LIST</Arg>
</onReqAvatarList>
<!-- 请求创建avatar后,成功的回调 -->
<onCreateAvatarSuccess>
<!-- 创建出的角色信息 -->
<Arg> AVATAR_INFO </Arg>
</onCreateAvatarSuccess>
<!-- 请求创建avatar后,失败的结果 -->
<onCreateAvatarFailed>
<!--错误代码-->
<Arg> INT8 </Arg>
</onCreateAvatarFailed>
</ClientMethods>
<BaseMethods>
<!-- 暴露给客户端的请求角色列表接口 -->
<reqAvatarList>
<Exposed />
</reqAvatarList>
<!-- 暴露给客户端的请求创建角色接口 -->
<reqCreateAvatar>
<Exposed />
<!-- roleType -->
<Arg> UINT8 </Arg>
<!-- name -->
<Arg> UNICODE </Arg>
</reqCreateAvatar>
</BaseMethods>
<CellMethods>
</CellMethods>
</root>
Account实体的base部分,可以被客户端请求reqAvatarList
,并通过onReqAvatarList
返回客户端。同时Account实体可以被客户端请求reqCreateAvatar
来创建一个角色,并通过onCreateAvatarSuccess
和onCreateAvatarFailed
返回给客户端是否创建成功。
那我们来看看,我们的bots代码该如何设计。
首先,在 {项目资产库}/scripts/bots
文件夹下创建Account.py文件,其作为客户端的Account实体逻辑,直接看代码:
class Account(KBEngine.Entity):
def __init__(self):
KBEngine.Entity.__init__(self)
DEBUG_MSG("Account::__init__:%s." % (self.__dict__))
self.base.reqAvatarList()
def onReqAvatarList(self, infos):
"""
defined method.
"""
DEBUG_MSG("Account:onReqAvatarList::%s" % (list(infos['values'])))
self.base.reqCreateAvatar(1, "kbe_bot_%s" % self.id)
self.characters = copy.deepcopy(infos["values"])
def onCreateAvatarSuccess(self, info):
"""
defined method.
"""
DEBUG_MSG("Account:onCreateAvatarSuccess::%s" % (dict(info)))
def onCreateAvatarFailed(self, errorCode):
"""
defined method.
"""
ERROR_MSG("Account:onCreateAvatarFailed:: errorCode=%i" % (errorCode))
__init__
时,直接调用self.base.reqAvatarList()
,向base服务器请求角色列表,这样就完成了一次远程调用。服务器返回时,会回调onReqAvatarList
方法。(注意:这些方法都是在Account实体的def配置中配置过的。)接着,我们再通过self.base.reqCreateAvatar(1, "kbe_bot_%s" % self.id)
向base服务器发出创建一个名为kbe_bot_xx
的角色的请求,同时保存已有的角色列表。服务器返回时会回调onCreateAvatarSuccess
或onCreateAvatarFailed
。我们可以根据bots的日志了解角色创建是否成功了。
如何启动?
上面介绍了bots编程的基础知识,开发者们大概已经迫切想知道如何启动一个bots了。
在 {项目资产库}
根目录下,有名为start_bots.xx
的批处理文件。Windows使用start_bots.bat
,Linux使用start_bots.sh
就可以启动。
bots的启动配置比较类似于start_server.xx
,详细配置可以参考引擎启动参数段落。
如何配置?
bots机器人的配置,在引擎配置-bots配置中有提及,可以参见。
我们来举个例子,在开发期调试一个业务是否走通时,需要减少机器人数量,甚至只设置一个机器人来模拟整个业务通路。
在{项目资产库}/res/server/kbengine.xml
中,找到bots标签并修改(没有的话新建标签),如下,只设置一个机器人:
<bots>
<defaultAddBots>
<totalCount> 1 </totalCount><!-- Type: Integer -->
<tickTime> 0.1 </tickTime><!-- Type: Float -->
<tickCount> 1 </tickCount><!-- Type: Integer -->
</defaultAddBots>
</bots>
Ok,启动机器人后,仅仅一个机器人就开始运作啦。
如何Debug调试?
使用的手段和工具就是之前提到的运行时日志查看、GUIConsole、WebConsole以及PyCluster集群控制,通过他们可以在线调试和查看日志。
区别在于:
1:GUIConsole和WebConsole下,需要选中的是bots进程;
2:PyCluster选择连接bots进程;
3:日志文件是前缀为logger_bots
的.log文件。