接口和协议组成 游戏测试中的接口测试

陈子昂 · 2015年12月21日 · 最后由 wangshun 回复于 2018年10月15日 · 6183 次阅读
本帖已被设为精华帖!

游戏行业的测试,业务规则上会根据每个项目的不同进行调整,所以是属于需要根据每个不同项目组去适当调整工作内容。客户端部分是基于引擎较多,
介于游戏因为封装的关系,除非在二端内部写完整过程的代码,但这个难度也太大。 我提供一些思路就是从 c->s 入手,维护起来也比较简单,以下文章介绍。

游戏内通信对象大体三类

  • c->s
  • s->c
  • s->s

这点和软件是一样的,外部就多 1 个平台。

游戏行业做接口测试基本也和其他类型测试一样。

这里先介绍下,需要先准备:

  • 游戏后台开启
  • 起码 2 个游戏客户端。另外 1 个客户端观察游戏内的情况。

下面举一个例子,先找 1 个触发器,这里用的是聊天框,代码如下(貌似没.lua 的)
代码参考还是上面的 2)部分里的内容。1)代表原来的

function Chat:rueryChatCache()
    local msg = "cQueryChatCache"
    app.net:sendMsg(msg)
end

function Chat:requestChat(chatType, name, content)    --1正常情况
    local msg = "cChat " .. chatType .. " " .. name .. " " .. content
    app.net:sendMsg(msg)
end

function Chat:requestChat(5, damao, cQueryDailyTask)   --2使用聊天框做触发器输出协议
    local msg = "cChat " .. chatType .. " " .. name .. " " .. content
    app.net:sendMsg(content)
end

function Chat:requestChat(1, damao, msgtxt)     --2用于修改chatType类型
  local msg = "cChat " .. chatType .. " " .. name .. " " .. content
 app.net:sendMsg(msg)
end

function Chat:requestPublishNotice(content)
    local msg = "cAnnounce " .. content
    app.net:sendMsg(msg)
end

第一个例子需要检查的协议

1) cChat eChatType(1=私聊 2=本服 4=世界 3=公会 5=系统 服务器触发 不受理客户端 6=gm 公告) toName Content

需要分别检查 cChat 类型。

修改 chatType1,2,3,4,5…分别输出。
其中在另外 1 个客户端开另外 1 个帐号就可以看到文本里的内容。或者在后台可以显示输出内容
其中输出类型 5,另外 1 个客户端是不可见的。

第 2 个例子协议(用于社交关系变更)
2) cBlacklistModify nType(1=拉黑 2=撤销) idTarget

cBlacklistModify nType 的 2 个类型的测试,可以同时对 1 个有效的用户名。 检查 s->c 回来的内容
nType 1or2 idTarget 传不存在的用户,检查 s->c 回来的内容
这样可以简化测试,并且不会有遗漏,绕过了很多操作步骤。具体可以想想平时你如何拉黑的。

在介绍 1 个好东西,关于可以便捷的调用接口的方式

c->s 的消息都可以用以下图片里的,后面 2 段内容,在 chat 聊天界面输出就可以自动调用 c->s 的协议内容。
例如 cQueryDailyTask 请求任务
代码参考还是上面的 2)部分里的内容。1)代表原来的

在游戏后面内有很多协议需要根据检查成功和失败的返回参数,也需要进行创造力的去组合测试。
下图就是一个游戏很小一部分协议的文档截图。
协议的说明被单独抽离出来,维护的话就是协议如何不失效就一直可使用,失效就备注去掉。内容被修改在文本里备注即可。所有文本放在 1 个目录下,用 notepad 类似的都可以读取查找具体协议类。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 18 条回复 时间 点赞


棒棒哒

把代码截图换成 markdown 代码吧

—— 来自 TesterHome 官方 安卓客户端

#2 楼 @seveniruby 好的,下次用那个。

#5 楼 @lihuazhang 额,这个我的确写的不清楚。cblacklistmodify 就是变更社交关系的 2 个状态。以后一定会写清楚点。

#5 楼 @lihuazhang 这是他的第二个例子, cblacklistmodify ntype 状态的变更, 其实貌似是少了一行注释

感谢提供的思路,自己项目上尝试了一下,发现是可行的。解决了很多协议测试上的困难。

#8 楼 @rojasall 主要用这种方式 利于维护,也想了蛮久的,之前是用别的方式做的。另外如果有些复杂的协议,需要加多个参数的那种,协议中的空格,根据业务在客户端程序处理时会不会去空格。比如副本 cFight type target 输出是有空格的,客户端处理会去除空格,服务器就不会 sFight ret 参数了。可以在本地路径上面单独留 1 个客户端测试这个,svn 更新也不覆盖脚本文件。

想问一下,这里都是 C->S,如果要模拟 S->C 的有什么方法吗?

#10 楼 @rojasall 那种测试起来比较麻烦,因为客户端文件本地想怎么改都可以。s->c 修改套接字,可以几个协议串联一起测试,需要封装在机器人程序里。当版本协议变更时和客户端处理方式一样。

#6 楼 @jiazurongyu 可以编辑下帖子 修改下。

#12 楼 @lihuazhang 好,= =工作环境是封闭的,明天就改。

#12 楼 @lihuazhang 修改好了。

因为我们项目是 Unity3D 开发的,今天研究了一下 U3D 的 unit test tool 工具,把楼主的这种发送协议的代码加入到这个工具的测试脚本里面。
在编辑器里面启动游戏,并运行 unit test tool 的测试脚本,实现了发送协议的功能。
这样后续都可以结合 unit test tool 里面的自动化,断言等等功能。
后面再研究一下客户端接收服务器发送协议的代码,这样应该可以做完整个 C->S->C 的测试流程。

#15 楼 @rojasall 恩没错 ,不过起始点还是 C 开始的,如果从 S 开始的那种接口测试,是做绕开 C->S,直接发送返回结果,是做异常测试用的。其他一切加油,一起为了这个行业努力。

#15 楼 @rojasall 我早年参加 u3d 项目开发时还没做到你现在的层面,当时还卡在 843 最大承载和 u3d 异步加载资源上。后面虽然解决了 loader 问题,可惜当时项目组在大改游戏玩法,没人听建议,罢了。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册