从命令行运行android单元测试?

从命令行运行android单元测试?,android,unit-testing,shell,Android,Unit Testing,Shell,我正试图在android平台上运行单元测试。例如,我想对电子邮件应用程序运行测试。我打开/apps/Email/tests/AndroidManifest.xml文件,查找元素,并查看包属性,即com.android.Email.tests,在元素中,我查看android:name属性,即android.test.InstrumentationTestRunner。现在我打开控制台,然后运行 $ . build/envsetup.sh $ lunch 1 $ adb shell am instr

我正试图在android平台上运行单元测试。例如,我想对电子邮件应用程序运行测试。我打开
/apps/Email/tests/AndroidManifest.xml
文件,查找
元素,并查看
属性,即
com.android.Email.tests
,在
元素中,我查看
android:name
属性,即
android.test.InstrumentationTestRunner
。现在我打开控制台,然后运行

$ . build/envsetup.sh
$ lunch 1
$ adb shell am instrument -w com.android.email.tests/android.test.InstrumentationTestRunner
但这是失败的:

INSTRUMENTATION_STATUS: id=ActivityManagerService
android.util.AndroidException: INSTRUMENTATION_FAILED: com.android.email.tests/android.test.InstrumentationTestRunner
INSTRUMENTATION_STATUS: Error=Unable to find instrumentation info for: ComponentInfo{com.android.email.tests/android.test.InstrumentationTestRunner}

所以。。我做错了什么?

您可能需要首先使用
android create test project
命令设置测试项目。查看Android开发站点上的这个页面:了解更多信息。我使用此方法启用了ant的命令行测试。

我实际上忘记了在我的设备/模拟器上构建和安装测试包。发现在做了以下工作之后:

$ adb shell
# cd data/packages
# ls
没有
com.android.email.tests
包。

在这种情况下,我收到了“找不到检测信息”错误:我用一个src包名称定义了我的测试项目,该名称与被测试项目的名称相同。例如,这两个项目的源代码都在com.mycompany.android包中。这个并行src包设置在Eclipse中运行良好,但在模拟器上,似乎测试apk正在覆盖appapk

修复:我将测试项目的src包更改为test.mycompany.android

请注意,在任何一种情况下,测试项目的Android清单都定义了:

请运行 python开发/testrunner/runtest.py电子邮件

然后您将看到它的工作原理:)

基本上你没有安装com.android.email.tests包

您可以看到可用于检测的内容

pm list instrumentation
你应该看到

检测:com.android.email.tests/android.test.InstrumentationTestRunner (target=com.android.email)

什么时候做

pm list packages
软件包:com.android.email

软件包:com.android.email.tests

我的问题是这个标签:

 <instrumentation
    android:name="android.test.InstrumentationTestRunner"
    android:label="Tests for app.under.test.package"
    android:targetPackage="app.under.test.package" />

首先,我的
android:name
属性错误,然后目标包错误(以上是正确的解决方案)

模拟器上没有安装测试包 我遇到了完全相同的问题,并且意识到模拟器上没有安装测试包,这就是@marekdef所说的

我没有使用生成的测试文件中的命令,而是使用了以下命令:

ant debug install test
*我在
/tests
中有我的测试项目,因此以下命令是我在项目主页目录中使用的命令:

(cd tests && ant debug install test;)

希望对您有所帮助。

对于gradle用户,您可以使用以下任务:

$ gradle :project:installDebug :project:installDebugAndroidTest

我有这个
run_all_test.sh
脚本来运行所有单元和仪器化测试:

#!/bin/bash
./gradlew --no-daemon clean test connectedCheck --stacktrace;
if [ $? -eq 0 ]
then
    echo "tests are successful"
else
    echo "tests FAILED"
    exit 1
fi
说明:

  • 测试->执行所有单元测试

  • connectedCheck->执行所有仪表化测试

您可以从这里开始,根据您的需要,按照此处的文档进行定制:

使用gradlew从命令行运行所有测试

JUnit测试(UnitTest后缀)


我刚刚发现eclipse运行并不关心manifest元素是定义package=“pkg of project under test”(这是eclipse在创建新的Android测试项目时插入的值)还是package=“pkg of test project”。为什么我会注意到这一点?好的,eclipse构建似乎关心这个值。当我将第一个活动添加到测试项目并编辑测试清单来描述它时,eclipse开始抱怨在编译我的测试活动时找不到R。将测试项目的包更改为pkg解决了这个问题。应该是
adb shell pm list instrumentation
Yes这些是您在adb shell中执行的命令。Python不在android中,但曾经在测试android的框架中为我工作,我被用于eclipse来创建测试构建,谢谢@科斯波尔很高兴这有帮助!
./gradlew test
./gradlew :<moduleName>:test<variantName>UnitTest
./gradlew connectedAndroidTest
./gradlew :<moduleName>:connected<variantName>AndroidTest
//Unit
./gradlew :<moduleName>:assemble<variantName>UnitTest

//functional
./gradlew :<moduleName>:assemble<variantName>AndroidTest