安卓开发实现自动化测试遇到的问题解决

目前安卓开发进入了项目的空窗期,项目的迭代速度变慢,需要我们开发人员进行代码的优化和重构。在安卓开发中,开发人员和测试人员的配合默契程度直接会导致产品上线是否合格、是否会出现严重的项目崩溃、是否会出现产品功能的缺失,这些都和开发人员开发的时候,是否有跟测试人员沟通测试的边际和测试人员设计的测试用例是否存在功能缺失等问题。总之一句话,测试是否过关直接可以影响用户对产品的使用。线上产品出现问题,首先背锅的应该是测试人员,然后就是开发人员。但是最后,问题还是需要我们开发人员去解决问题。
所以,我们开发人员除了使用代码编写测试用例外,还需要的就是UI自动化测试,通过编写Ui自动化测试用例,运行测试用例之后,看产品是否会出现崩溃、实现UI自动化最主要的还是测试App的流程是否通畅,并且可以实现一劳永逸,因为测试用例可以实现跨平台的话,那么你的测试用例就可以适用与Android、IOS、小程序等测试场景。
下面我们就来学习可跨平台测试框架:Appium桌面版`、Appium开发框架Github源码。
虽然Appium测试框架有跨平台的优点,但是测试用例代码编写比较繁琐,很多都是重复的代码,并且如果后期如果程序的界面或者功能有改变的话,那么你之前的测试代码也一样需要更新才能继续测试,这样就会增大测试用例代码的维护成本。
发现当你新建一个Android 项目的时候,Android studio会自动给你的app项目下面集成Esprresso测试框架:

    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

然后在你的 android 的defaultConfig目录下新增AndroidJUnitRunner:

 testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

你会发现,原理Google的开发工具已经给我们的项目已经默认集成了自动录屏的测试框架Espresso,下面我们就来使用一下这个框架
Android Studio安装好Kotlin插件之后,如何更新Kotlin的版本呢?还有Kotlin的版本和Android
studio的版本是对应的,如果你的Android Studio更新了,那么你也需要找到Tools ->Kotlin–>
Config Kotlin Plugin Update进行Kotlin版本的更新。这个操作会根据你的Android Studio的版本去下载最新的Kotlin版本,这个可以在Koklin的插件版本官网可以找到对应的版本。
这里我还发现了一个问题,就是Mac如果不设置可以加入的网络的话,让它自己自动链接可能会连上比较差的网,这个是导致我的Android Studio一直在加载Kotlin插件新版本,然后就出现网络链接超时的问题。
如果你的Kotlin插件已经是最新版本,就需要你手动到你的项目根目录的build.gradle文件里面配置:

buildscript {
    ext.kotlin_version = '1.3.31'

    repositories {
        google()
        jcenter()
        jcenter() { url 'http://jcenter.bintray.com/' }
        maven { url 'https://dl.bintray.com/umsdk/release' }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.4.1'
        //2018.12.10最新版本
        classpath "com.alibaba:arouter-register:1.0.2"
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

然后再进行编译,系统会提示你需要更新gradle-wrapper.properties文件下面的远程Gradler wrapper包的远程仓库的地址:

distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip

这样再编译成功了!!!
其实我们自己新建一个项目,android studio就会自动在我们项目的build.gradle文件下创建下面的配置,这个就是我们android studio自带的自动化测试框架。

  testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    androidTestImplementation 'com.android.support.test:rules:1.0.2'

我们编写好代码之后,找到Run–>Record Espresso Test 选项,来开启录制Ui自动化测试案例,然后录制完成点击OK,android studio就会自动在你的androidTest文件夹下面生成UI自动化测试的脚本文件。然后我们通过运行这个测试脚本文件来进行Ui自动化测试。录制完成生成测试代码的时候,需要依赖一个测试框架AndroidJunitRunner,系统会自动提示你添加,你点击确定就可以在下面的目录新增这个框架:

 defaultConfig {
      .....
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

我们会发现这个框架上手并不难,但是要真正的运行起来录制好的测试用例和断点调试录制的程序,还是比较复杂的。我使用的项目录制过程中没有出现问题,但是在运行测试用例的时候报如下错误:

$ adb shell am instrument -w -r   -e debug false -e class 'com.fenjiread.learner.activity.SplashActivityTest3' com.fenjiread.learner.test/android.support.test.runner.AndroidJUnitRunner
Client not ready yet..
Started running tests

java.lang.RuntimeException: Could not launch intent Intent { act=android.intent.action.MAIN flg=0x14000000 cmp=com.fenjiread.learner/.activity.SplashActivity } within 45 seconds. Perhaps the main thread has not gone idle within a reasonable amount of time? There could be an animation or something constantly repainting the screen. Or the activity is doing network calls on creation? See the threaddump logs. For your reference the last time the event queue was idle before your activity launch request was 1560480698305 and now the last time the queue went idle was: 1560480743724. If these numbers are the same your activity might be hogging the event queue.
at android.support.test.runner.MonitoringInstrumentation.startActivitySync(MonitoringInstrumentation.java:446)
at android.support.test.rule.ActivityTestRule.launchActivity(ActivityTestRule.java:354)
at android.support.test.rule.ActivityTestRule$ActivityStatement.evaluate(ActivityTestRule.java:525)
at android.support.test.rule.GrantPermissionRule$RequestPermissionStatement.evaluate(GrantPermissionRule.java:129)
at org.junit.rules.RunRules.evaluate(RunRules.java:20)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at android.support.test.runner.AndroidJUnit4.run(AndroidJUnit4.java:101)
at org.junit.runners.Suite.runChild(Suite.java:128)
at org.junit.runners.Suite.runChild(Suite.java:27)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
at android.support.test.internal.runner.TestExecutor.execute(TestExecutor.java:56)
at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:384)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1939)

百度说需要关闭测试Appd的动画效果,但是去开发者模式关闭动画之后还是不行。根据日志提示直接点击错误,跳转到源码显示如下:

 try {
      return startedActivity.get(START_ACTIVITY_TIMEOUT_SECONDS, TimeUnit.SECONDS);
    } catch (TimeoutException te) {
      dumpThreadStateToOutputs("ThreadState-startActivityTimeout.txt");
      startedActivity.cancel(true);
      throw new RuntimeException(
          String.format(
              "Could not launch intent %s within %s seconds."
                  + " Perhaps the main thread has not gone idle within a reasonable amount of "
                  + "time? There could be an animation or something constantly repainting the "
                  + "screen. Or the activity is doing network calls on creation? See the "
                  + "threaddump logs. For your reference the last time the event queue was idle "
                  + "before your activity launch request was %s and now the last time the queue "
                  + "went idle was: %s. If these numbers are the same your activity might be "
                  + "hogging the event queue.",
              intent,
              START_ACTIVITY_TIMEOUT_SECONDS,
              lastIdleTimeBeforeLaunch,
              mLastIdleTime.get()));
    } catch (ExecutionException ee) {
      throw new RuntimeException("Could not launch activity", ee.getCause());
    } catch (InterruptedException ie) {
      Thread.currentThread().interrupt();
      throw new RuntimeException("interrupted", ie);
    }

这里我们可以发现只是线程超时了,但是我的App里面的代码并没有做耗时的操作,所以具体该怎么改呢?

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值