Android提升开发测试效率,程序员应该多干了什么?

一、前言
Android提升开发测试效率,程序员应该多干了些什么?
什么?
当你听到要多干些什么,要多写些代码时候,估计就会头疼了,我业务上的需求都还写不完呢。还要多加提高开发测试的需求。
别急!!!先看完下面:
当我们在Android里面工作了很多年时候,肯定不只做了一个App,也肯定不只在一家公司呆过,也肯定不只是做手机上App开发,我汇总一下遇到的那些问题,然后可以怎么做才能提高开发效率。
-
测试人员
: 你这个界面提示报错了,或者报错网路异常了,然儿网络正常的,你排查一下,然儿当你连接上调试线排查时候,却发现原来是服务器在编译期间,报错500了等。
这不浪费你时间吗?
怎么让测试人员自己知道等一会儿呢,这样才不浪费表情
-
一般一套系统的环境包含4个环境:
1)线上环境
2)线上模拟环境(QA环境)
3)测试环境(Stage)
4)开发环境(Develop)
测试人员
: 给我打一个xxxx环境的包吧,我要用,帮我安装一个xxxx环境的包吧,
联调人员
: 你先连接我本地服务器试试
每次都这样,这不浪费你时间吗?
-
当Android设备是手机时候,新来台设备,新来测试机,怎么安装app?
普通搞法:
找个调试线,运行代码安装(大多数情况下只能运行debug包)。或者蓝牙传过去,那如果新来设备比较多呢,你手上开发的App不只这一个,有多个呢?
怎么快捷方便?
-
当Android 设备不是手机时候,如果是收银机,收银秤,或者车机机器,或者智能家居,电视TV,或者大屏广告屏等,反正比较大,不好放,又比较重不容易拿,或者一个人都搬不动。
总不可能每次都花费很大力气抱到电脑旁边,插上数据线运行安装吧,或者电脑抱过去 ,无线ADB调试有些第一次还必须插线才行。
这TMD太浪费时间了,怎么快捷方便?
-
业务数据排查问题时,偶尔会以登录的账号维度排查,当有些数据不是以登录账号为维度,而是以设备唯一序列号为维度,怎么好方便排查呢,总不会把那台机器抱过来吧。
有什么方法可以快捷方便?
-
如果是Android收银机设备的机器,里面有频繁支付功能。某一台测试机上面大多数情况下安装了测试环境的包,测试环境支付实际不扣钱的。突然那天去测试发现,已支付,原来里面是正式环境,把钱给扣了,然后得想办法把相关钱退回来。
有什么方法避免大家这样误操作?
-
打包发布,拒绝原始单个单个打,各渠道包配置好,一键打,系统更新包打好task配置好自动上传,在线打包等。
我们试想:
在一个公司,做一个app,肯定会遇到上面这些低效问题,
当在一个公司,做了多个app,还是会遇到这些低效问题,
当在下一家公司,或者下下一家公司,还是会有这些低效问题。
怎么避免这些低效的沟通,或者做了很多低效重复的工作呢
且看下面分解:
二、网络异常精细处理
将网路异常精细化,让开发测试人员,在碰到简单的异常时候,立马就知道原因。不用每一次都去调试找原因。
比如:当服务器编译期间报错500了,立马就知道,不用调试找原因
比如:联调阶段当服务器数据结构变了忘了告诉客户端,提示:数据错误,json解析错误,这边可以立马知道原因
等等
ini
<string name="ehttpio_msg">服务器开小差,请重试</string>
<string name="emobilenetuseless_msg">当前网络不可用</string>
<string name="enetworkio_msg">网络连接异常</string>
<string name="enotfoundmethods_msg">没有找到反射方法</string>
<string name="ehttpprotocol_msg">网络连接异常</string>
<string name="exmlparser_msg">XML解析出错</string>
<string name="exmlio_msg">XML通讯错误</string>
<string name="eclassnotfound_msg">没有找到反射类</string>
<string name="eillegalaccess_msg">反射调用时指针出错</string>
<string name="esecurity_msg">反射安全出错</string>
<string name="econnecttimeout_msg">请求超时,请重试</string>
<string name="eparamhasnull_msg">反射方法中有传入为null的参数</string>
<string name="eparamuninvalid_msg">反射方法中传入参数不合法</string>
<string name="HostBaseUrlError">请求地址错误</string>
<string name="failed_to_connect_to">无法连接到服务器</string>
<string name="JsonSyntaxException">数据错误,json解析错误</string>
<string name="ehttp_request_fail400">服务器异常400</string>
<string name="ehttp_request_fail403">请求ip被封了</string>
<string name="ehttp_request_fail404">服务器异常404</string>
<string name="ehttp_request_fail405">服务器异常405</string>
<string name="ehttp_request_fail502">服务器异常502</string>
<string name="ehttp_request_fail503">服务器异常503</string>
<string name="ehttp_request_fail504">服务器异常504</string>
<string name="ehttp_request_fail500">服务器异常500</string>
<string name="ehttp_request_fail401">服务器异常401</string>
<string name="ehttp_eunknownhost_msg">host地址配置错误异常</string>
<string name="ehttp_unknownservice_msg">网络连接异常</string>
<string name="ehttp_unsupportedencoding_msg">通信编码出错</string>
<string name="ehttp_requestsslhandshakeexception">证书校验异常</string>
<string name="enotdefine_msg">未知错误异常</string>
三、切换环境,切换序列号可配置
- 可开发一个界面,自己设计,控制在打测试包的时候,登录之前有入口可以进来,更严格的可以通过ASM字节码插桩, 只有测试包
Debug
时候才会有代码进入该控制界面,正式包Release包时候没有那些代码
- 可以控制切换http,https, 切换设备序列号,切换环境地址,让其可选可填,可控制测试模式,和正式模式,当测试模式时候所有选择保存才会有效。
- 所有切换配置
可以存入MMKV,或者FastKV,或者SP,DataStore
等,本地存储。

特别注意:
1)如果涉及到数据库时候:需要分别配置测试Debug包的数据库名,和Release包的数据库名,两个名字要分开,
2)数据库里面表字段要加一个字段来区分环境(存入值:建议就用切换环境的地址)
。这样当测试包切换环境时候,查询的数据库时要带上当前环境值去匹配,才能和当前环境下数据能够对得上。 如下:

- 当切换环境,切换序列号等设置好,保存后,让其App 3秒后自动重启:
ini
val intent = baseContext.packageManager.getLaunchIntentForPackage(baseContext.packageName)
val restartIntent = PendingIntent.getActivity(applicationContext, 0, intent, PendingIntent.FLAG_ONE_SHOT or PendingIntent.FLAG_IMMUTABLE)
val mgr = getSystemService(ALARM_SERVICE) as AlarmManager
mgr[AlarmManager.RTC, System.currentTimeMillis() + 3000] = restartIntent
ActivityManager.exitApplication()// 退出app
- 上面内容:甚至你可以封装好成一个包,以后做1个app,第2个app,第3个app,都可以一键接入,甚至来到其他公司,都可以说服大家这样做。毕竟方便嘛,同时也可以控制只有Debug包才接入它。Release包没有的。
四、测试包正式包区分,测试包各个环境提醒
当在测试包 Debug 包的时候,可以多写个TextView在头部展示环境(覆盖在其他上面也无所谓),这样在测试包时候,大家可以放心看到,不会出现以为不付钱时候而实际支付到生产环境了。
注意:Release打包时候没有这块内容!!!
五、下载工具
自己写个下载器,同时也可以学习
,
- 断点续传,
- 单文件多个线程同时下载,
- 多个文件同时下载,
- 自定义下载进度按钮
- 自己电脑本地搭建好服务器。配置好json,让其客户端读取该json,json内容就是配置的要下载的文件地址,可以是本地电脑里面的,也可以是线上的地址
- 注意要连接同一个网,让其保持在同一个局域网内。
- 让该下载器可以手动输入IP地址,可以手写个键盘:因为局域网内部ip可能变化。
不要嫌弃麻烦,当你有很多个app需要下载安装,当你在任何一家公司都可能有这些安装问题,你只需要把这个下载器安装到设备,或者测试机里面,把本地服务器打开,然后一切都变得很轻松。我前言里面提到的那些麻烦全部迎刃而解
- 甚至可以本地电脑局域网准备一份,服务器里面准备一份。当本地服务没有开,可以下载线上的,当自己不在公司,当请假了,测试人员,想要那个包,完全可以自己玩游戏一样的。
这个工具大多数情况只有自己和测试人员用,不外用。
- 注意,本地gradle打包,可以配置好task任务,在打包完直接copy到,本地服务器文件地址。
如下图:我N年前学习写断点续传下载,自己设计的有点不美观,但是当时写好的工具一直用到现在,经历了几家公司了,是真的方便。


六、自动化打包上传
- 各渠道包配置好,一键打,
- 系统更新包打好task配置好自动上传,一键搞定
- 在线打包等
这个我不具体介绍了,网上很多资料。
七、总结
本文重点介绍了:
Android提升开发测试效率,程序员应该多干了些什么?
- 网络异常精细处理
- 切换环境,切换序列号可配置
- 测试包正式包区分,测试包各个环境提醒
- 下载工具
- 自动化打包上传