2012-11-27 31 views
2

我有一個示例Android應用程序,使用Eclipse創建,有一個Activity。 我跑這個命令來構建該項目的Ant構建文件:無法與螞蟻構建android測試項目

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

運行「蟻調試」成功生成項目,並創建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 

如果我嘗試編譯時,指出在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

好的,我發現了這個問題。 我沒有提到,在ant.properties中,我已將out.dir位置更改爲「../build」。因此,編譯器在構建SampleAppTest時不知道獲取SampleApp的類文件的位置。因此,一種解決方案是刪除ant.properties中的out.dir條目,但我不想那樣做。我必須找到一種方法告訴編譯器在哪裏獲得這些類。我發現的解決方案是重寫「-compile」目標的build.xml像這樣:

<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> 
+0

請將此標記爲答案。 – shkschneider

+0

需要等待2天才能這樣做。 –

0

不是手工更新ant.properties的是有辦法做到這一點。 命令行,運行以下命令:

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

運行此命令後,您可以直接從測試項目運行ant調試。 注意:如果它給與JUnit相關的錯誤,請在測試項目libs文件夾中添加Junit jar文件。