安卓自动化测试:Jenkin构建后运行自动化出现IllegalAccessError错误;低电量时、停止运行自动化测试用例
Jenkin构建后运行自动化出现IllegalAccessError错误
某次jenkins构建时,出现如下错误:
com.android.xsltest.testcase.OtherInfoAdd:INSTRUMENTATION_RESULT: shortMsg=java.lang.IllegalAccessError
INSTRUMENTATION_RESULT: longMsg=java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation
因为出错误之前,多个版本都是自动化运行成功,且从失败到成功,并未改过对应的代码,所以以为是构建问题,于是重新运行构建。
不过,多次构建后,仍是出现同样的问题。而且都是在保存病历的患者信息页出现的,而且即使只输入姓名,也会出现同样的问题。而且,使用eclipse直接运行自动化,就没有出现这个问题。
经过google查找,发现是由于测试应用和被测的病历夹都包含了同样的包引起的,而pinyin4j-2.5.0.jar确实在两个应用中都在使用。
从前记得eclipse中,只要把包含的包取消选中,就可以解决该问题了。但是jenkins构建使用gradle进行构建,所以只能修改build.gralde的内容。而需要修改的位置是:
dependencies {
compilefileTree(dir: 'tests/libs', include:
'*.jar')
compilefileTree(dir: 'app/misc', include:
'cafe.jar')
compile fileTree(dir: 'app/libs', include:'pinyin4j-2.5.0.jar')
}
通过查找到的信息,按里面的说明,尝试把 compile fileTree(dir: 'app/libs',include: 'pinyin4j-2.5.0.jar') 修改为以下几种,分别进行尝试:
compile 'com.belerweb:pinyin4j:2.5.0'
androidTestCompile('com.belerweb:pinyin4j:2.5.0') { exclude group:'com.belerweb' }
androidTestCompile('com.belerweb:pinyin4j:2.5.0') { exclude group:'net.sourceforge.pinyin4j' }
provided 'com.belerweb:pinyin4j:2.5.0'
运行后发现,基本都提示找不到对应的包。后来,经过多次查找,找到如下文档:
“How to use provided scope for jar file inGradle build?”
http://stackoverflow.com/questions/18738888/how-to-use-provided-scope-for-jar-file-in-gradle-build
通过改为如下内容,jenkins构建后的安卓自动化运行正常。
dependencies {
compilefileTree(dir: 'tests/libs', include:
'*.jar')
compilefileTree(dir: 'app/misc', include:
'cafe.jar')
providedfiles('app/libs/pinyin4j-2.5.0.jar')
}
低电量时、停止运行自动化测试用例
有一次,打算在家里看看安卓自动化的运行情况。发现所有的构建都是失败,似乎手机没有启动,不过,这怎么可能呢?一直连接着电脑的usb充电啊。周一到单位看了下,确实未启动,手机的关机了,而且电量比较低。又有几次,坐在电脑前,就看到了低电。之所以之前未发现,是因为每天仅有几次构建和自动化,其他时间都在充电;而这次,构建间隔30分钟左右,几乎结束上次构建,就开始了下次构建,电量一直在降低。
考虑了两个想法,一个是加大usb口的充电电流,一个是在低电时,基本不运行用例。
对于第二种方式,使用如下函数获得整数的电量值,然后与指定值比较,低于则不运行用例操作。
public
static
int getBatteryInfo(Context
context) {
IntentFilterifilter =
new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
IntentbatteryStatus =
context.registerReceiver(null,
ifilter);
int
status =
batteryStatus.getIntExtra("level", 0);
return
status;
}
尝试后,定期30分钟执行的用例,如果低电的话,几分钟就运行完了,剩余的时间可以充电,而电量满足需求时,则正常运行用例。
该函数返回的是100以内的整数,我们设定的是5或10,如果低电,则留出尽量多的时间充电,而不是用完电,导致关机,而无法测试
第一种方式,购买了有电源的usb hub集线器,一共4个口。发现也能解决电量低的问题。
为了看手机的充电电流,也查找了相关命令,但未详细研究原因和结果。知道的内容如下,供以后参考。
shell@hlte:/ $ dumpsys battery
Current Battery Service state:
ACpowered: false
USBpowered: true
Wireless powered: false
status: 2
health: 2
present: true
level: 61
scale: 100
voltage: 3977
temperature: 303
technology: Li-ion
LEDCharging: true
LEDLow Battery: false
current now: 450
Dormant Settings: false
Dormant Disable LED Settings: true
Dormant Always Settings: true
Adaptive Fast Charging Settings: true
SUPPORT_LOG_BATTERY_USAGE: false
Adb相关命令: http://imsardine.simplbug.com/note/android/adb/commands/commands.html#shell
Adb中的dumpsys命令:
http://imsardine.simplbug.com/note/android/adb/commands/dumpsys.html
电池、电压等相关数据放在手机的/sys/class/power_supply目录,大概看了下,需要时再详细了解。