官网关于该命令的详解:点击查看
1 Instrument是什么?
instrument为am命令的一个子命令。用于启动一个Instrumentation测试。首先连接手机或者模拟器,通过adb shell命令,进入shell层进行操作。
2 命令格式及参数解读(来自官网)
格式:instrument [options] component
目标 component
是表单 test_package/runner_class,在UiAutomator2.0中,目标
component
为:测试包名/android.support.test.runner.AndroidJUnitRunner(即运行器固定:AndroidJUnitRunner类是一个JUnit测试运行器,允许运行JUnit 3或JUnit 4测试类在 Android 设备上,包括那些使用Espresso和UI Automator框架。)
各项参数:
-r
:以原始形式输出测试结果;该选项通常是在性能测试时与[-e perf true]
一起使用。-e name value
:提供了以键值对形式存在的过滤器和参数。例如:-e testFile <filePath>(运行文件中指定的用例);-e package <packageName>(运行这个包中的所有用例)…… 有十几种。-p file
:将分析数据写入file
。-w
:测试运行器需要使用此选项。-w <test_package_name>/<runner_class> :<test_package_name>和<runner_class>在测试工程的AndroidManifest.xml中查找,作用是保持adb shell打开直至测试完成。--no-window-animation
:运行时关闭窗口动画。--user user_id | current
:指定仪器在哪个用户中运行;如果未指定,则在当前用户中运行。
3 怎么运行手机中现有的instrumentation, 并输出详细结果,同时将profiling性能数据写到本地文件中?
- 先列出手机中已安装的instrumentation:adb shell pm list instrumentation
- adb shell am instrument XXX
4 命令的具体使用,比如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文件中配置的参数。
5 使用Instrument命令传递调试参数
使用命令传递调试参数可以使我们的测试代码更灵活的测试需要测试的数据与格式,对于同一种场景不同格式的参数今天代码复用。
使用命令将参数传递过去也非常简单:
adb shell am instrument -w -m -e testPathName androidTest -e testFileName test_mp3.mp3 -e targetName 你好.mp3 -e targetFilePath '/sdcard/androidTest/copyPath/test_mp3.mp3' -e debug false -e class class com.letv.leview.setproxy#testDemo com.le.tcauto.uitest.test/android.support.test.runner.AndroidJUnitRunner
代码中接收参数(google已经帮我们放入bundle中):
Bundle extras = InstrumentationRegistry.getArguments();
if (extras != null) {
testPathName = extras.getString("testPathName");
testFileName = extras.getString("testFileName");
targetPathName = extras.getString("targetPathName");
targetFilePath = extras.getString("targetFilePath");
}
注意:当传递参数是路径的时候需要加引号:-e targetFilePath '/sdcard/androidTest/copyPath/test_mp3.mp3' ,在调试过程中如调试失败,看下参数传递是否需要注意格式
6 开始容易写错?
AS ——Select Run/Debug —— Configuration ——Edit Configuration ——配置 ——OK
运行完成,下方会显示该命令,然后copy过来。