无法用ant构建android测试项目

时间:2012-11-27 10:42:57

标签: java android ant

我有一个示例Android应用程序,使用Eclipse创建,有一个Activity。 我运行此命令来为这个项目构建ant构建文件:

android create project --target 8 --name SampleApp --path ./SampleApp --activity MainActivity --package com.example.sampleapp

运行“ant debug”成功构建项目并创建apk文件:

-post-build:

debug:

BUILD SUCCESSFUL
Total time: 1 second

现在,我想创建一个Android测试项目。我运行这个命令:

android create test-project -m ../SampleApp -n SampleAppTest -p SampleAppTest

这成功创建了包含构建文件的SampleAppTest目录。我有一个类,src / com / example / sampleapp / MainActivityTest.java:

package com.example.sampleapp;

import android.test.ActivityInstrumentationTestCase2;

public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActivity> {

    public MainActivityTest() {
        super("com.example.sampleapp", MainActivity.class);
    }

}

我想建立这个项目。在这里找到的教程http://developer.android.com/tools/testing/testing_otheride.html#RunTestsAnt中,它说我应该可以进行“蚂蚁运行测试”。不幸的是,这个目标不存在:

$ ant run-tests
Buildfile: /Users/cmuraru/Work/androidtest/SampleAppTest/build.xml

BUILD FAILED
Target "run-tests" does not exist in the project "SampleAppTest". 

Total time: 0 seconds

如果我尝试“ant debug”,我在编译时收到错误,说明找不到MainActivity类(来自SampleApp)。

-compile:
    [javac] Compiling 2 source files to /Users/cmuraru/Work/androidtest/build/test/classes
    [javac] /Users/cmuraru/Work/androidtest/SampleAppTest/src/com/example/sampleapp/MainActivityTest.java:15: cannot find symbol
    [javac] symbol: class MainActivity
    [javac] public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActivity> {
    [javac]                                                                        ^
    [javac] /Users/cmuraru/Work/androidtest/SampleAppTest/src/com/example/sampleapp/MainActivityTest.java:18: cannot find symbol
    [javac] symbol  : class MainActivity
    [javac] location: class com.example.sampleapp.MainActivityTest
    [javac]         super("com.example.sampleapp", MainActivity.class);
    [javac]                                        ^
    [javac] 2 errors

BUILD FAILED
/Users/cmuraru/Work/android-sdk-macosx/tools/ant/build.xml:705: The following error occurred while executing this line:
/Users/cmuraru/Work/android-sdk-macosx/tools/ant/build.xml:718: Compile failed; see the compiler error output for details.

Total time: 1 second

尝试“蚂蚁测试”时,它也会失败:

test:
     [echo] Running tests ...
     [exec] INSTRUMENTATION_STATUS: id=ActivityManagerService
     [exec] INSTRUMENTATION_STATUS: Error=Unable to find instrumentation info for: ComponentInfo{com.example.sampleapp.tests/android.test.InstrumentationTestRunner}
     [exec] INSTRUMENTATION_STATUS_CODE: -1
     [exec] android.util.AndroidException: INSTRUMENTATION_FAILED: com.example.sampleapp.tests/android.test.InstrumentationTestRunner
     [exec]     at com.android.commands.am.Am.runInstrument(Am.java:616)
     [exec]     at com.android.commands.am.Am.run(Am.java:118)
     [exec]     at com.android.commands.am.Am.main(Am.java:81)
     [exec]     at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
     [exec]     at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:237)
     [exec]     at dalvik.system.NativeStart.main(Native Method)

我在这里错过了什么/做错了什么?任何帮助都很高兴。

2 个答案:

答案 0 :(得分:2)

好的,我发现了这个问题。 我没有提到在ant.properties中,我已将out.dir位置更改为“../build”。因此,编译器在构建SampleAppTest时不知道从哪里获取SampleApp的类文件。所以一个解决方案是删除ant.properties中的out.dir条目,但我不想这样做。我必须找到一种方法告诉编译器在哪里获取这些类。我发现的解决方案是覆盖build.xml中的“-compile”目标,如下所示:

<property name="SampleApp.build.location" value="../build"/>
    <target name="-compile" depends="-build-setup, -pre-build, -code-gen, -pre-compile">
        <do-only-if-manifest-hasCode elseText="hasCode = false. Skipping...">
            <!-- merge the project's own classpath and the tested project's classpath -->
            <path id="project.javac.classpath">
                <path refid="project.all.jars.path" />
                <path refid="tested.project.classpath" />
            </path>
            <javac encoding="${java.encoding}"
                    source="${java.source}" target="${java.target}"
                    debug="true" extdirs="" includeantruntime="false"
                    destdir="${out.classes.absolute.dir}"
                    bootclasspathref="project.target.class.path"
                    verbose="${verbose}"
                    classpathref="project.javac.classpath"
                    fork="${need.javac.fork}">
                <src path="${source.absolute.dir}" />
                <src path="${gen.absolute.dir}" />
                <compilerarg line="${java.compilerargs}" />
                <classpath>
                    <!-- steff: we changed one line here !-->
                    <fileset dir="${SampleApp.build.location}/classes" includes="*"/>
                </classpath>
            </javac>

            <!-- if the project is instrumented, intrument the classes -->
            <if condition="${build.is.instrumented}">
                <then>
                    <echo level="info">Instrumenting classes from ${out.absolute.dir}/classes...</echo>

                    <!-- build the filter to remove R, Manifest, BuildConfig -->
                    <getemmafilter
                            appPackage="${project.app.package}"
                            libraryPackagesRefId="project.library.packages"
                            filterOut="emma.default.filter"/>

                    <!-- define where the .em file is going. This may have been
                         setup already if this is a library -->
                    <property name="emma.coverage.absolute.file" location="${out.absolute.dir}/coverage.em" />

                    <!-- It only instruments class files, not any external libs -->
                    <emma enabled="true">
                        <instr verbosity="${verbosity}"
                               mode="overwrite"
                               instrpath="${out.absolute.dir}/classes"
                               outdir="${out.absolute.dir}/classes"
                               metadatafile="${emma.coverage.absolute.file}">
                            <filter excludes="${emma.default.filter}" />
                            <filter value="${emma.filter}" />
                        </instr>
                    </emma>
                </then>
            </if>

            <!-- if the project is a library then we generate a jar file -->
            <if condition="${project.is.library}">
                <then>
                    <echo level="info">Creating library output jar file...</echo>
                    <property name="out.library.jar.file" location="${out.absolute.dir}/classes.jar" />
                    <if>
                        <condition>
                            <length string="${android.package.excludes}" trim="true" when="greater" length="0" />
                        </condition>
                        <then>
                            <echo level="info">Custom jar packaging exclusion: ${android.package.excludes}</echo>
                        </then>
                    </if>

                    <propertybyreplace name="project.app.package.path" input="${project.app.package}" replace="." with="/" />

                    <jar destfile="${out.library.jar.file}">
                        <fileset dir="${out.classes.absolute.dir}"
                                includes="**/*.class"
                                excludes="${project.app.package.path}/R.class ${project.app.package.path}/R$*.class ${project.app.package.path}/BuildConfig.class"/>
                        <fileset dir="${source.absolute.dir}" excludes="**/*.java ${android.package.excludes}" />
                    </jar>
                </then>
            </if>

        </do-only-if-manifest-hasCode>
    </target>

答案 1 :(得分:0)

不是手动更新ant.properties,而是有办法实现。 从命令行,运行以下命令:

android update test-project -m <project path> -p <test project path>

运行此命令后,您可以直接从测试项目运行ant debug。 注意:如果它给出了与JUnit相关的错误,请在测试项目libs文件夹中添加Junit jar文件。