• 0
  • 0
分享

背景:

  提起随机自动化操作,相信大家并不陌生,目前使用最为普遍的adb monkey命令应该都有所耳闻。monkey优点不言而喻,它使用起来很简单,只需要在命令输入命令即可完成对app的各种随机操作,期间发现的崩溃也会捕获记录下来。但是在搜狗手机输入法项目中,这一方法就有些局限了:

  1.输入法稳定性测试重点之一是输入各种语料内容,也就是输入ni'hao等比较有规律的词语,这一点monkey无法满足。

  2.输入法稳定性测试需要定制有一些有序的动作,例如:输入ni'hao后,点击候选词文字进行上屏;又或者是切换输入键盘等。

  3.以上2中定制的动作数量很多,希望能够在测试前进行灵活配置,例如:覆盖安装输入法权重低,打字上屏权重高。

  基于以上几点,在搜狗手机输入法自动化测试中,我们设计了一种随机自动化的框架,与大家进行分享。

  具体内容:

  一、输入法随机自动化测试框架图:


图1.jpg


  二、随机操作稳定性主界面

  主界面主要提供的功能是:

  1.配置测试时间

  2.控制随机自动化的开始和结束

  3.配置随机动作的权重

private void initAction(){
if (mstrIme == "搜狗输入法"){
mExecCoreManager.AddPrepareAction("com.sogou.inputmethod.autotest.SogouInputTypeUtil.setDefaultIme");
}else{
mExecCoreManager.AddPrepareAction("com.sogou.inputmethod.autotest.BaiduInputTypeUtil.setDefaultIme");
}
//切换拼音9键
mExecCoreManager.AddAction("com.sogou.inputmethod.autotest.SogouInputSwitchKBUtil.switchPY9", 40);
//切换拼音26键
mExecCoreManager.AddAction("com.sogou.inputmethod.autotest.SogouInputSwitchKBUtil.switchPY26", 10);
//切换笔画
mExecCoreManager.AddAction("com.sogou.inputmethod.autotest.SogouInputSwitchKBUtil.switchBihua", 1);
//切换英文9
mExecCoreManager.AddAction("com.sogou.inputmethod.autotest.SogouInputSwitchKBUtil.switchEn9", 4);
//切换英文26
mExecCoreManager.AddAction("com.sogou.inputmethod.autotest.SogouInputSwitchKBUtil.switchEn26", 1);
//随机打字并点击空格上屏
mExecCoreManager.AddAction("com.sogou.inputmethod.autotest.SogouInputTypeUtil.tapRandomString_Candidate", 40);
//随机打字并点击候选词上屏
mExecCoreManager.AddAction("com.sogou.inputmethod.autotest.SogouInputTypeUtil.tapRandomString_Blank", 10);
//纯随机点击
mExecCoreManager.AddAction("com.sogou.inputmethod.autotest.SogouInputTypeUtil.randomTap", 100);
//切换焦点到编辑框
mExecCoreManager.AddAction("com.sogou.inputmethod.autotest.SogouInputTypeUtil.tapEditControl", 5);
mExecCoreManager.SetLogPath( StateValue.getDoraemonDir() + File.separator + "IMEStabilyTest.log");
mExecCoreManager.SetTempPath( StateValue.getDoraemonDir() + File.separator + "IMEStabilyTestTempindex.log");
}

   

  三、ProbManager概率动作计算

  假设我们要配置的动作列表如下:

图2.jpg


  通过map,记录每个Action的起始点和结束点,然后随机函数获取1到175(最大结束点)的随机数,这样即可得到对应权重的比例。

图3.jpg

 

 四、ExecCoremanager随机动作执行内核

  1.随机动作序列的执行

class ExecThread implements Runnable {
Thread t;
private AtomicBoolean m_bFlagRun = new AtomicBoolean();
ExecThread() {
t = new Thread(this, "ExecAction Thread");
System.out.println("Thread: " + t);
this.m_bFlagRun.set(false);
}
public void run() {
//1.执行前置操作
for(int i = 0; i< m_listPrepareActionList.size(); i++ ){
DoPrepare(i);
}
//2.循环执行随机动作
m_lStartTime = System.currentTimeMillis();
while (true) {
//System.out.println("Running...");
//System.out.println(DoAction());
DoAction();
//3.定时记录执行的动作个数
m_iCountActionDone++;
if( (m_iCountActionDone % 5) == 0 ){
SaveActionIndex();
}
//4.检查执行时间是否已经到了
long currentTime = System.currentTimeMillis();
if ((currentTime - m_lStartTime) >= m_lInterval) {
System.out.println("执行时间到,退出!");
break;
}
//5.检查执行停止是否被设置
if (!this.m_bFlagRun.get()) {
System.out.println("执行被停止,退出!");
break;
}
}
m_bRunningFlag = false;
System.out.println("Exiting thread.");
}
public void start() {
t.start();
this.m_bFlagRun.set(true);
}
public void stop() {
this.m_bFlagRun.set(false);
}
}

   

  2.反射方法调用包名下的方法

private String DoAction(){
String strActionName = null;
String strAction = null;
String strPackageName = null;
//list中的动作已经执行完了,重头执行
if( m_iDoneActionIndex >= this.m_listActionList.size()){
m_iDoneActionIndex = 0;
}
strAction = this.m_listActionList.get(this.m_iDoneActionIndex);
int beginIndex =strAction.lastIndexOf(".");
strActionName = strAction.substring( beginIndex + 1, strAction.length());
strPackageName = strAction.substring(0, beginIndex);
try {
Method bMethod;
Object bObj;
if( m_mapReflict.containsKey(strPackageName)){
Class<?> bClazz = Class.forName(strPackageName);
bObj = m_mapReflict.get(strPackageName);
bMethod = bClazz.getDeclaredMethod(strActionName);
}else{
Class<?> bClazz = Class.forName(strPackageName);
bObj = bClazz.newInstance();
bMethod = bClazz.getDeclaredMethod(strActionName);
m_mapReflict.put(strPackageName, bObj);
}
bMethod.invoke(bObj);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
this.m_iDoneActionIndex++;
return strActionName;
}

   


作者:搜狗测试 诸葛东明   

来源:51Testing软件测试网原创

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   每个应用程序(桌面、网络或移动)在发布到市场之前都需要进行测试。功能测试被认为是最重要的测试类型,因为首先,应用程序必须做它需要做的事情。  功能测试验证每个软件功能的操作是否符合需求规范。如果应用程序不能满足其功能需求,它可能无法长期存在。  在任何应用程序的生命周期中,这种类型的测试都是一个关键且代价高昂的活动。因此,功能测试自动化是提高软件质量和降低测试成本的有效解决方案。  这项工作将引入功能测试和自动化来测试网络应用程序。我将探索如何设计功能测试用例,并使用一个众所周知的测试工具自动化它们。  什么是功能测试?  功能测试是一种测试类型,其中软件根据其功能需求规范进行测试,以发现...
            0 0 1013
            分享
          •   新浪科技讯 北京时间1月20日早间消息,据报道,当地时间周四,Twitter在开发者协议中正式禁止Twe(1.54, -0.05, -3.14%)etbot和Twitterrific等第三方应用接入其平台。  此前一周,这些第三方应用已经无法使用,但Twitter当时并未给出公开解释。  周四更新的开发者协议称,“创造或试图创造Twitter应用替代品或相似服务或产品的”第三方客户端都被封禁。  本周二,Twitter Dev账号也发表了一条简短声明称,Twitter正在“实行早已存在的API规则,这可能导致部分应用无法使用。”然而,历史记录显示,开发者协议中的这一条款似乎是在2022年1...
            0 0 632
            分享
          •   早些年就有人喊出了“测试已死”的口号,主张开发人员交叉测试。他们想说的,并不是“测试已死”,而是“测试人员已死”。没有人否认测试的价值,他们只是认为不再需要专门的测试人员了。  我现在已经是一名测试老兵了,测试人员的价值是什么?我一直在思考。这个问题是在从业的第五年,也就是去年才逐渐清晰明朗起来。  测试的核心价值,我认为是持续地进行技术调查,尽可能快而全面地提供质量反馈。拆成几个关键词:“持续”,“技术调查”,“尽可能快而全面”,“质量反馈”。  “持续”意味着测试是一个迭代的过程。把某一个版本分支测试好了,大多没什么难度,问题在于做长远打算,做好测试数据和用例管理,还有自动化脚本,性能...
            0 0 1165
            分享
          •   需求的全生命周期  需求的全生命周期,也就是从需求的产生开始,到需求的确认,需求的落地实施,需求的后评价。具体来讲包括以下内容:  1.需求的获取  2.需求的编写  3.需求的确认  4.需求的发布  5.需求的分配  6.需求的实现  7.需求的验证(一般来讲是各个级别的测试)  8.需求后评价  需求变更管理  其实变更也是全生命周期一部分。  需求在确认发布后,也就确定了需求基线,理论上来讲经过评审的需求应该没啥问题了,但实际项目实施过程中,需求变更是经常发生的事情,这里面的原因有很多,有的是因为业务在实施过程中,需求发生了变化,也有可能是需求在分析阶段有遗漏或错误,原因种种,做项...
            0 0 308
            分享
          •   应届生,没有实际项目经验怎么破?  面试的过程并不为为了显示面试官技术有多牛,也不是为了体现他们公司有多么难进而是考察你的能力和招聘需求是否相匹配,进而评估你能否满足工作需求,甚至实现更多的岗位期待。  弄清楚了这个核心,那么就只需要把控好两方面的内容:  1、自己的技能水平可以满足招聘需求  2、表达能力OK  围绕上面的核心,咱们来具体的聊一下:  首先来说,目前的行业招聘现状是:  ·测试行业底层在不断洗牌  · 初级人员薪资一直维持不变(相当于降薪)  · 已经不再是公司疯狂招人的阶段  所以就导致了明显的两极分化,大厂倾向于直接招测试开发,测试团队进一步精简,...
            0 0 924
            分享
      • 51testing软件测试圈微信