继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

分享Android单测中遇到的一些典型问题

乔Joan
关注TA
已关注
手记 40
粉丝 51
获赞 91

一.解决端口占用问题


        The connection to adb is down, and a severeerror has occured.这个问题可能许多新手朋友会在Android studio连接真机跑单元测试时会遇到按照提示一般我们会检查ADB的路径是否正确会试着重启你的Android studio。最后你会在DOS下执行adb kill-server接着你会看到DOS的报错信息

https://img4.mukewang.com/5c0a259b00018a2306440078.jpg

       可能会有朋友会怀疑是手机助手一类的软件占用了ADB的端口但当你尝试在任务管理器中找adb.exe时会发现根本找不到。其实我们完全不必理会是谁占用的只需要知道你的ADB使用了什么端口并把使用该端口的进程杀死。以下是最常用的一种方法

·adb.exe使用的端口是5037查看5037端口被谁占用了Window+R--CMD到命令行输入 netstat -aon|findstr "5037"找到正在占用该端口的进程如下图

https://img4.mukewang.com/5c0a25ee00019a1306800216.jpg

·我们从上面根本就看不出5037端口被谁占用我们需要根据后面的PID28844来查找占用该端口的应用程序输入 tasklist|findstr "2748" ,这时候你会看到占用的进程xxx.exe

·结束该进程输入taskkill /f /t /im xxx.exe在重新连接手机这时候你会发现程序运行起来了


二.使用一些测试框架如robolectri等常遇到"method ID not in [0, 0xffff]: 65536"


       当你跑你的case出现这个报错极有可能是你引入使用的框架各种包且在case中引用了不恰当的方法,导致App中所引用的方法已经超过了最大数65536个方法如果你又不得不使用这些方法你可以这样做


1.build.gradle中这样设置defaultConfig

https://img3.mukewang.com/5c0a26030001f71510080149.jpg

2.引入依赖compile 'com.android.support:multidex:1.0.0'

3.如果你没有重写application

https://img1.mukewang.com/5c0a26240001cadb05440136.jpg

如果你重写了application

https://img1.mukewang.com/5c0a262e000197c004560155.jpg

三解决依赖冲突


单元测试中经常看到这样的错误

https://img2.mukewang.com/5c0a264300017de509800062.jpg

其实就是你的APP的module中com.android.support:support-annotations这个依赖冲突了app里的版本和Test app的版本不一致


查看我的依赖存在这些内容

androidTestImplementation'com.android.support.test:runner:1.0.2'

androidTestImplementation'com.android.support.test.espresso:espresso-core:3.0.2'

发现两个依赖里面都自带了com.android.support:support-annotations依赖并且版本是27.1.1的因此我们需要做的就是把这里面的27.1.1的com.android.support:support-annotations换成26.1.0的版本

 

       延伸出去我们知道Androidstudio用项目构建工具gradle构建项目的时候由于添加的第三方项目依赖中极有可能出现有多个项目同时依赖了某个库的情况极有可能就出现一些引用了重复包的问题那么我们怎么更好解决包冲突问题呢提供一种简单的检查方法:


       在Android studio中选择project后在左侧项目列表中展开external libraries这里面是gradle为你自动下载好的jar包依次点击展开依赖的项目并在其中的classes.jar下找到重复的包手动delete最后留下一个即可


https://img.mukewang.com/5c0a265700018e0c07160259.jpg

四.运行testng.xml失败


       在写单测的时候使用了testng但是运行时总报错Cannot find class in classpath:com.ht.myapplication.ExampleUnitTest或者empty test suite你搜索了各种方法不能解决你检查了一切问题肯定不是自己使用有问题甚至相同代码拷贝到别的机器就能运行这有可能是编辑器出了原因不明的问题或则是你设置编译方式不对。其实就是运行testng.Xml时没有编译对应的java文件可到.class文件中查看每次运行时是否编译生成了了最新的.class文件


源代码代码.class路径是:

Androidworkspace你的module name uildintermediatesclasses estdebugcomhtmyapplication

测试代码.class路径是:

Androidworkspace你的module name uildintermediatesjavacdebugUnitTestcompileDebugUnitTestJavaWithJavacclassescomstudyhuangtianapp_1


       如果你看到这两个文件中的.Class文件是空的或者生成时间不是你本次编译后运行的时间你只需要重新编译再运行testng.xml你就会发现成功了

 

五.如何隔离Native方法


       单元测试中用到native方法case运行失败robolectric也不支持加载so文件这时候我们只要使用依赖隔离就可以可以直接用Mockito框架mock native方法

运行如下单测报错java.lang.UnsatisfiedLinkError:com.test.unit.Model.nativeMethod()

https://img1.mukewang.com/5c0a266f0001091a06240297.jpg

      思考一下java查找native方法的过程。调用native方法nativeMethod()后jvm会去找C++层com_test_unit_Model.cpp再找com_test_unit_Model_nativeMethod()方法并调用。在APP运行过程我们会把cpp编译成so文件然后让APP加载到dalvik虚拟机。但在单元测试中没有加载对应的so文件也没有编译cpp。那么我们可以直接用Mockito框架mocknative方法。按如下修改便可以运行通过

https://img1.mukewang.com/5c0a276000013fb606200333.jpg


打开App,阅读手记
2人推荐
发表评论
随时随地看视频慕课网APP