Android 端测试app
参考:
测试官方文档:
https://developer.android.com/training/testing?hl=zh-cn
附带app打包发布:
https://blog.csdn.net/qq_38436214/article/details/112288954
测试示例:【注意 引入包,context获取接口变更】
https://blog.csdn.net/wq6ylg08/article/details/91347989
--------------------------------------------------------------------------------------------
前期数据处理
1、读取json:https://codeantenna.com/a/VARoqkgFJo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | // 序列化数据 // ========================== public class MapBean implements Serializable { public static final int TYPE_PARENT= 0 ; //父类 public static final int TYPE_CHILD= 1 ; //子类 private int viewType; //类型 private String caption; //标题 private List<MapBean> childList; //定义一个装载多个子类的列表 public MapBean(String caption, int viewType){ //表示获得的消息类型 this .caption=caption; this .viewType=viewType; } public int getViewType(){ return viewType; } public String getCaption(){ return caption; } //折叠展开列表 public void setChildList(List<MapBean> childList){ this .childList=childList; } public List<MapBean> getChildList(){ return childList; } } // --------------------------------------- public class MainActivity extends AppCompatActivity { private List<MapBean> mapBeanList; //定义全局列表 protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); initMaps(); } private void initMaps() { // 解析Json数据 StringBuilder newstringBuilder = new StringBuilder(); InputStream inputStream = null ; try { inputStream = getResources().getAssets().open( "MapBean.json" ); InputStreamReader isr = new InputStreamReader(inputStream); BufferedReader reader = new BufferedReader(isr); String jsonLine; while ((jsonLine = reader.readLine()) != null ) { newstringBuilder.append(jsonLine); } reader.close(); isr.close(); inputStream.close(); } catch (IOException e) { e.printStackTrace(); } String str = newstringBuilder .toString(); Gson gson = new Gson(); Type MapBeanListType = new TypeToken<ArrayList<MapBean>>(){}.getType(); mapBeanList=gson.fromJson(str, MapBeanListType); } |
2、查找元素 Uiselector :https://www.cnblogs.com/jianXu/p/5158396.html
Uiobject2: https://blog.csdn.net/mqqzt/article/details/49981207
---------------------------------------------------------------------------------------------
测试思路
1、构建测试app1,即TestRunner
2、构建启动测试app2,用与调用1中的测试类及用例
2.1 启动方式:2中的app调用1中的测试用例,如
am instrument [options] component : 【AndroidJUnitRunner类是一个JUnit测试运行器,允许运行JUnit 3或JUnit 4测试类在 Android 设备上,包括那些使用Espresso和UI Automator框架。】
===》 怎么运行手机中现有的instrumentation, 并输出详细结果,同时将profiling性能数据写到本地文件中?
- 先列出手机中已安装的instrumentation:adb shell pm list instrumentation
- adb shell am instrument XXX
====》 命令的具体使用,比如com.le.tcauto.uitest.test是包含所有测试代码的应用的包名:(来自:http://blog.csdn.net/swordgirl2011/article/details/50881390)
- 运行所有的用例: adb shell am instrument -w com.le.tcauto.uitest.test/android.support.test.runner.AndroidJUnitRunner
- 运行一个类中的所有用例: adb shell am instrument -w -r -e class com.letv.leview.setproxy com.le.tcauto.uitest.test/android.support.test.runner.AndroidJUnitRunner
- 运行类中的某个方法:adb shell am instrument -w -r -e debug false -e class com.letv.leview.setproxy#testDemo com.le.tcauto.uitest.test/android.support.test.runner.AndroidJUnitRunner
- 运行多个类的所有用例:adb shell am instrument -w -r -e debug false -e class com.letv.leview.setproxy,com.letv.leview.resetdate com.le.tcauto.uitest.test/android.support.test.runner.AndroidJUnitRunner
- 运行所有测试用例除了指定的类:adb shell am instrument -w -r -e notClass com.letv.leview.setproxy com.le.tcauto.uitest.test/android.support.test.runner.AndroidJUnitRunner
- 运行所有测试除了指定的用例:adb shell am instrument -w -r -e debug false -e class com.letv.leview.setproxy#testDemo com.le.tcauto.uitest.test/android.support.test.runner.AndroidJUnitRunner
- 运行文件中的所列的用例:adb shell am instrument -w -e testFile /sdcard/tmp/testFile.txt com.android.foo/com.android.test.runner.AndroidJUnitRunner 文件制定的 格式为:com.android.foo.FooClaseName#testMethodName
- 运行指定测试切片的用例:adb shell am instrument -w -e numShards 4 -e shardIndex 1 com.android.foo/android.support.test.runner.AndroidJUnitRunner
- 运行指定注解的测试用例:adb shell am instrument -w -e annotation com.android.foo.MyAnnotation com.android.foo/android.support.test.runner.AndroidJUnitRunner。如果使用多个选项,则运行的用例为两者的交集,比如:“-e size large -e annotation com.android.foo.MyAnnotation”,将只运行同时含LargeTest和MyAnnotation注解的用例。
- 运行没有指定注解的用例:adb shell am instrument -w -e notAnnotation com.android.foo.MyAnnotation com.android.foo/android.support.test.runner.AndroidJUnitRunner,指定多个注解,用“,”隔开,e.g. adb shell am instrument -w -e notAnnotation com.android.foo.MyAnnotation,com.android.foo.AnotherAnnotation com.android.foo/android.support.test.runner.AndroidJUnitRunner
- 以上所有参数也可以通过<meta-data>标签配置在AndroidManifest文件,比如 <meta-data android:name="listener" android:value="com.foo.Listener"/>,通过shell命令 传入的参数将覆盖AndroidManifest文件中配置的参数。
解析参考:https://blog.csdn.net/Liu_Liu_Q/article/details/79700683
https://developer.android.com/studio/command-line/adb.html?hl=zh-cn#am
2.2 运行app2需要获取
1)系统签名,gradle中配置
2)manifest中配置userid
操作参考:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <? xml version="1.0" encoding="utf-8"?> < manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:sharedUserId="android.uid.system" package="com.test.starttest"> < uses-permission android:name="android.permission.INTERNET"/> < uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <!-- 在SDCard中创建与删除文件权限 --> < uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" tools:ignore="ProtectedPermissions" /> <!-- 往SDCard写入数据权限 --> < uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:ignore="ScopedStorage" /> < application 。。。。 </application> </ manifest > |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?