SigmaTestApp 的基本功能测试



测试内容

在不同型号的设备上测试 SigmaTestApp的基本功能:

1)点击 SETTINGS 按钮是否生效。

2)TIMEOUT 输入框输入文字是否正确。

3)列表的滑动查找功能是否正确。

4)多输入框输入是否正确。

5)滑动条是否正确。

6)多选框选择是否正确。



查看视频




测试环境

测试设备

为了在不同设备型号上进行覆盖测试,选取了华为鸿蒙(鸿蒙2.0)、三星S10(安卓13)、红米9A(安卓10)、一加 A6000(安卓11) 手机进行测试。



测试 APP

测试 App 使用了 SigmaTestApp, 您可以自行获取,位于 Total Control 安装目录的APK目录下。




脚本

脚本语言

本脚本使用了JavaScript。

Total Control 自带 JavaScript 脚本执行编译器,并集成 Ringo 库。您可以使用 JavaScript 来编写您的自动化脚本。如果您对其他语言比较熟悉,我们提供了 REST API 接口,您可以通过调用 REST API 来操作设备,进行自动化测试。



脚本编辑软件

可以使用任意的文本编辑软件,编辑完成后,将脚本文件存储在 Total Control 默认脚本目录下,默认目录可以更改。




代码

/**
*设置公共函数:启动测试的APP
*/
function restart_test_app() {
  devices.send(tcConst.KEY_HOME);
  delay(3000)
  var step1 = devices.sendAai({ action: "restartApp(com.sigma_rt.sigmatestapp)" }); //启动对应的需要测试的app
  if (step1.success() != true) {
    print("启动APP执行失败:启动APP失败步骤1 " + step1);
    return false;
  }
  delay(3000)
  var step2 = devices.sendAai({ action: "waitQuery('T:ci:SETTINGS',5000)" });//等待可以标识app启动成功的特殊按钮出现,ci表示不区分大小写
  if (step2.success() != true) {
    print("启动APP执行失败:启动APP失败步骤2 " + step2);
    return false;
  }
  return true;
}

/**
* 用例1:测试点击SETTINGS按钮是否生效
*      初始条件:启动测试app
*      测试步骤:1)在页面上点击对应的按钮
*                2)应该会弹出新的页面(通过校验关键节点来判断这个页面是否弹出) 
*/
function case1_test_click() {
  if (restart_test_app() == false) {
    print("case1_test_click 执行失败:启动APP失败");
  }
  var step1 = devices.clickSync("SETTINGS"); //点击SETTINGS按钮测试
  if (step1.success() != true) {
    print("case1_test_click 执行失败:点击SETTINGS按钮失败");
    return false;
  }
  var step2 = devices.sendAai({ action: "waitQuery('T:GO',25000)" });//新的页面会出现一个GO的文字,进行检查
  if (step2.success() != true) {
    print("case1_test_click 执行失败:点击SETTINGS按钮后,没有出现GO页面 ");
    return false;
  }
  print("case1_test_click 执行成功");
}

/**
* 用例2:测试TIMEOUT输入框输入
*      初始条件:启动测试app
*      测试步骤:1)在TIMEOUT输入框中输入信息
*                2)检查是否所有手机都正常输入并能够显示出来
*                3)测试timeout功能,在timeout超时前去获取T:FINISH!!应该失败
*    			 4)测试timeout功能,在timeout超时后去获取T:FINISH!!应该成功
*/
function case2_test_timeout_input() {
  if (restart_test_app() == false) {
    print("case2_test_timeout_input 执行失败:启动APP失败");
  }
  var step1 = devices.inputTextSync(0, "30000"); //在第一个输入框中输入
  if (step1.success() != true) {
    print("case2_test_timeout_input 执行失败:输入文字错误" + step2);
    return;
  }
  var step2 = devices.sendAai({ query: "T:ci:Timeout||OX:1", action: "getText" });//获取输入框中的文字进行校验
  if (step2.success() != true) {
    print("case2_test_timeout_input 执行失败:输入后文字没有出现在输入框 ");
    return false;
  }
  //测试输入的时间是否真的生效
  devices.sendAai({ query: "T:TIMEOUT", postAction: "click" })
  //当25000毫秒时,不应该显示FINISH!!
  delay(25000)
  var step3 = devices.sendAai({ query: "T:FINISH!!" });//正常需要等待timeout时间,才能获取到,现在提前去获取,应该失败
  if (step3.success() == true) {
    print("case2_test_timeout_input 执行失败:输入的TIMEOUT没有真的生效 ");
    return false;
  }
  delay(5000) //在继续等5000毫秒
  var step4 = devices.sendAai({ query: "T:FINISH!!" });//正常需要等待timeout时间,才能获取到,现在在timeout时间后,再去获取应该成功
  if (step4.success() != true) {
    print("case2_test_timeout_input 执行失败:在TIMEOUT时间后,依然没有出现等待的文字 ");
    return false;
  }
  print("case2_test_timeout_input 执行成功");
}

/**
* 用例3:测试列表的滑动查找
*      初始条件:启动测试app
*      测试步骤:1)滚动查找到指定好友
*                2)获取整个屏幕的可滑动节点的文字
*                3)向指定好友发送"Hello World",并检查是否发成功
*/
function case3_test_list_scroll() {
  if (restart_test_app() == false) {
    print("case3_test_list_scroll 执行失败:启动APP失败");
  }
  var step1 = devices.clickSync("ci:List"); //点击List按钮,ci表示不分区大小写
  if (step1.success() != true) {
    print("case3_test_list_scroll 执行失败:点击List按钮失败" + step1);
    return;
  }
  var step2 = devices.sendAai({ actions: ["scrollIntoView('T:Andy','down')"] }) //向下自动滚动查找Andy
  if (step2.success() != true) {
    print("case3_test_list_scroll 执行失败:没有滚动到对应的好友 ");
    return false;
  }

  //开始点击好友并发送Hello World信息
  devices.sendAai({ query: "T:Andy", postAction: "click" })
  delay(3000)
  var step3 = devices.inputTextSync(0, "Hello World")
  if (step3.success() != true) {
    print("case3_test_list_scroll 执行失败:没有输入成功");
    return false;
  }
  devices.sendAai({ query: "C:.ImageView&&R:.btn_chat_message_send&&CC:0", postAction: "click" }) //点击发送按钮

  //检查Hello World是否真的在对话中
  var getresult1 = devices.sendAai({ query: "TP:scrollable", action: "getText" })
  for (var i = 0; i < getresult1.length; i++) {
    var gettemp = getresult1[i].value;
    if (gettemp == -1) {
      print("case3_test_list_scroll 执行失败:不是一个可以滚动的界面");
      return false;
    } else {
      var getretval = gettemp.retval;
      var checkpoint = getretval.indexOf("Hello World");
      if (checkpoint == -1) {
        print("case3_test_list_scroll 执行失败:在当前界面没有找到对应的好友");
        return false;
      }
    }
  }
  print("case3_test_list_scroll 执行成功");
}

/**
* 用例4:测试多输入框输入
*      初始条件:启动测试app
*      测试步骤:1)在FILED 6个输入框中输入信息
*                2)提交内容
*                3)对输入的内容进行校验
*/
function case4_test_mul_input() {
  if (restart_test_app() == false) {
    print("case4_test_mul_input 执行失败:启动APP失败");
  }
  var step1 = devices.clickSync("ci:EDITTEXT"); //点击List按钮 ci表示不区分大小写
  if (step1.success() != true) {
    print("case5_test_Seekbar 执行失败:点击SLIDER按钮失败" + step1);
    return;
  }
  var step1 = devices.inputTextSync(0, "1"); //在第一个输入框中输入
  var step2 = devices.inputTextSync(1, "2"); //在第二个输入框中输入
  var step3 = devices.inputTextSync(2, "3"); //在第二个输入框中输入
  var step4 = devices.inputTextSync(3, "4"); //在第二个输入框中输入
  var step5 = devices.inputTextSync(4, "5"); //在第二个输入框中输入
  var step6 = devices.inputTextSync(5, "6"); //在第二个输入框中输入
  if (step1.success() != true || step2.success() != true || step3.success() != true || step4.success() != true || step5.success() != true || step6.success() != true) {
    print("case4_test_mul_input 执行失败:输入失败" + step1.output + "," + step2.output + "," + step3.output + "," + step4.output + "," + step5.output + "," + step6.output);
    return;
  }
  //开始提交收入的信息
  var step7 = devices.sendAai({ query: "T:ci:SUBMIT", action: "click" }); //submit不区分大小写
  if (step7.success() != true) {
    print("case4_test_mul_input 执行失败:SUBMIT失败");
    return false;
  }
  delay(2000)

  //开始检查field的输入内容
  for (var t = 1; t <= 6; t++) {
    var result = devices.sendAai({ query: "T:Field " + t + ":||OX:1", action: "getText" }).output //获取Filed 1边上输入框的内容,通过ox偏移来获取
    for (var i = 0; i < result.length; i++) {
      var gettemp = result[i].value;
      if (gettemp == -1) {
        print("case4_test_mul_input 执行失败:没有获取到信息");
        return false;
      } else {
        var getretval = gettemp.retval;
        if (getretval != t) {
          print("case4_test_mul_input 执行失败:与输入的内容不匹配t=" + t + ",retval=" + getretval);
          return false;
        }
      }
    }
  }
  print("case4_test_mul_input 执行成功");
}


/**
* 用例5:测试滑动条
*      初始条件:启动测试app
*      测试步骤:1)进入滑动条设置页面
*                2)对滑动条进行设置
*                3)对滑动条的值获取校验
*/
function case5_test_Seekbar() {
  if (restart_test_app() == false) {
    print("case5_test_Seekbar 执行失败:启动APP失败");
  }
  var step1 = devices.clickSync("ci:SLIDER"); //点击SLIDER按钮
  if (step1.success() != true) {
    print("case5_test_Seekbar 执行失败:点击SLIDER按钮失败" + step1);
    return;
  }
  delay(3000)
  //对滑动条进行设置
  var setsliders = devices.sendAai({ query: "C:.SeekBar&&R:.seekBar_int&&CC:0", action: aaix("setProgress", 50) })
  if (step1.success() != true) {
    print("case5_test_Seekbar 执行失败:设置值为" + step1.output);
    return;
  }
  delay(3000)
  //对滑动条值进行获取并进行校验
  var getsliders = devices.sendAai({ query: "C:.SeekBar&&R:.seekBar_int&&CC:0", action: "getProgress" })
  if (step1.success() != true) {
    print("case5_test_Seekbar 执行失败:设置值为" + step1.output);
    return;
  }
  var getresult1 = getsliders.output;
  //检查是否真的设置的刚才的值
  for (var i = 0; i < getresult1.length; i++) {
    var gettemp = getresult1[i].value;
    if (gettemp == -1) {
      print("case3_test_list_scroll 执行失败:获取值失败");
      return false;
    } else {
      var getretval = gettemp.retval.current;
      if (getretval != 50) {
        print("case5_test_Seekbar 执行失败:获取的滑动值不对");
        return false;
      }
    }
  }
  print("case5_test_Seekbar 执行成功");
}

/**
* 用例6:测试多选框选择
*      初始条件:启动测试app
*      测试步骤:1)进入多选框设置页面
*                2)对多选框进行设置
*                3)获取多选框对应的值校验
*/
function case6_test_CheckBox() {
  if (restart_test_app() == false) {
    print("case6_test_CheckBox 执行失败:启动APP失败");
  }
  var step1 = devices.clickSync("ci:CHECKBOX"); //点击checkbox按钮不区分大小写
  if (step1.success() != true) {
    print("case6_test_CheckBox 执行失败:点击SLIDER按钮失败" + step1);
    return;
  }
  delay(3000)
  //对多选框进行勾选
  var setsliders = devices.sendAai({ query: "R:.checkbox1", action: "setChecked(true)" })
  if (step1.success() != true) {
    print("case6_test_CheckBox 执行失败:设置值为" + step1.output);
    return;
  }
  delay(3000)
  //对滑动条值进行获取并进行校验
  var getsliders = devices.sendAai({ action: "getChecked(R:.checkbox1)" })
  if (step1.success() != true) {
    print("case6_test_CheckBox 执行失败:设置值为" + step1.output);
    return;
  }
  var getresult1 = getsliders.output;
  //检查是否真的是设置的刚才的值
  for (var i = 0; i < getresult1.length; i++) {
    var gettemp = getresult1[i].value;
    if (gettemp == -1) {
      print("case3_test_list_scroll 执行失败:获取值失败");
      return false;
    } else {
      var getretval = gettemp.retval;
      if (getretval != true) {
        print("case6_test_CheckBox 执行失败:对应的多选框状态不对");
        return false;
      }
    }
  }
  print("case6_test_CheckBox 执行成功");
}

case1_test_click();
case2_test_timeout_input();
case3_test_list_scroll();
case4_test_mul_input();
case5_test_Seekbar();
case6_test_CheckBox();



脚本调试

Total Control 支持命令行调试窗口,可以快速进行调试。




脚本执行

在脚本窗口中点击脚本后面的执行图标。