目录

使用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来创建一个角色,并通过onCreateAvatarSuccessonCreateAvatarFailed返回给客户端是否创建成功。

那我们来看看,我们的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的角色的请求,同时保存已有的角色列表。服务器返回时会回调onCreateAvatarSuccessonCreateAvatarFailed。我们可以根据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调试?

使用的手段和工具就是之前提到的运行时日志查看GUIConsoleWebConsole以及PyCluster集群控制,通过他们可以在线调试和查看日志。

区别在于:
1:GUIConsole和WebConsole下,需要选中的是bots进程;
2:PyCluster选择连接bots进程;
3:日志文件是前缀为logger_bots的.log文件。


Copyright © 2018 Yolo Technologies. Publication: 2.0-025. Built: 2018-12-07.