接口和协议组成 lua 与游戏测试 (二)

陈子昂 · 2016年01月17日 · 最后由 陈子昂 回复于 2016年01月18日 · 3188 次阅读

独家提供给 testerhome,需要需引用,带上 testerhome 的链接,谢谢。

接上一篇, lua 与游戏测试(一)

上一篇介绍了下 lua 和 lua 里打 log 的方式。

本文主要还是基于客户端的,服务端其实也可以用 lua,可以了解下云风的 skynet 框架,已经开源。
与简悦合作的陌陌其中的游戏部门就是使用了这套框架在开发 MMO,这里就不多介绍了,
有兴趣的可以自行前往查看。

题外话:最近在验收一些项目时,发现一些数据交互独立的地方,进行了拆分业务,这个没错,但拆分方式导致了同步问题,怪物和英雄分别在 2 个端计算不同的逻辑,然后战斗数据包单包转发,传输过程中不拆包,一些问题还是产生在业务层面上。

回归正文,任何语言和测试的关系,首先测试读懂代码,了解语言的优势,这是第一步也是最基础的,lua 标准库是第二步。

实现 C/C++ 对 Lua 脚本的调用 LuaScript.h

markdown 里没有 lua,先用 ruby 代替

#ifndef __LUA_SCRIPT_H__
#define __LUA_SCRIPT_H__

#include "GameDef.h"

class CLuaScript
{
public:
    CLuaScript();
    ~CLuaScript();

public:
     bool    LoadScript(const char* szFileName);     
     bool    CallFunction(char* cFuncName, int nResults, char* cFormat, va_list vlist);
     bool    CallFunction(const char* cFuncName, int nResults, char* cFormat, ...);

private:
    void    RegisterLuaLib();  --注册lua各种基础库
    bool    RegisterFunctions(TLua_Funcs Funcs[], int n); --将游戏接口注册到lua脚本

private:
    lua_State*  m_LuaState;   --state 脚本和C\C++交互
    bool        m_IsLoadScript;
};
#endif

这段是给做介绍的是公共的。

公共库有很多段,还需要注册 lua 标准库和 c++ 脚本接口

介绍下 lua 的类型有 8 个 Nil Booleans Strings Functions...

今天介绍 nil,nil 用于区分数据和没有数据的值
测试中比较留意的界面层级的测试 CCLayer 用 nil 判断事件。
Nil 判断 touch 事件

function createMaskLayer( priority,touchRect ,touchCallback, layerOpacity,highRect)
    local layer = CCLayer:create()
    layer:setPosition(ccp(0, 0))
    layer:setAnchorPoint(ccp(0, 0))
    layer:setTouchEnabled(true)
    layer:setTouchPriority(priority or -1024)  --默认权限 -1024
    layer:registerScriptTouchHandler(function ( eventType,x,y )
        if(eventType == "began") then
            if(touchRect == nil) then
                if(touchCallback ~= nil) then   --判断事件状态,如果没有取到,则回调屏蔽层touch
                    touchCallback()
                end
                return true
            else
                if(touchRect:containsPoint(ccp(x,y))) then
                    return false
                else
                    if(touchCallback ~= nil) then 
                        touchCallback()   
                    end
                    return true
                end
            end
        end
        print(eventType)
end,false, priority or -1024, true)

循环体还是很简单的,部分解释器可以检查,这里可以改变 touchCallback ~= nil 把 ~= nil 去掉,就可以验证事件,至于层级会产生触摸抛错,不是这段可以解释的。

Nil 用于 函数的默认 没有数据的值
默认情况下,lua 里所有的变量都指向 nil
ChatSence 聊天场景

require "script/network/RequestCenter"
require "script/network/Network"
require "script/libs/LuaCCLabel"

local IMG_PATH = "images/chat/"             -- 图片主路径

local m_layerSize = CCSizeMake(620,700)
local m_chatGmLayer 
local m_chatGmLayerBg =nil  --可以写nil也可以不写

这里没有 nil 不会产生 bug,local 是局部变量,但如果在 tables 初始化后的其他地方定义了 nil,就会导致 bug。

关键测试点,lua 所有未定义的变量使用起来都会返回 nil,发现变量是需要被使用的,但出现了以下就是 bug。

lua:xx: bad argument #参数 to '函数' (string expected, got nil)

实际测试中看到抛错和读都不吃力,要写出来,还是整理思绪了一些时间。
看官可以去读下一些公司 lua 代码,本周就讲到这里,下周日 继续介绍函数类型 Booleans 这个容易发生问题的类型。

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

你还是标明为游戏测试会更好些. 方便别人找到感兴趣的点. 你这个系列大部分应该还是围绕游戏如何测试的. 别人通过搜索游戏测试可以方便的找到你的文章.

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