我有一个示例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)
我在这里错过了什么/做错了什么?任何帮助都很高兴。
答案 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文件。