Android 在eclipse项目上使用ant运行单元测试
好的,我花了三天的时间整理网络,试图找出如何在eclipse项目的命令行中使用ant运行一些单元测试 我可以通过“运行方式”->“Android JUnit测试”在Eclipse中运行测试 我现在想要的是能够通过命令行运行测试。就这样 我似乎找不到任何不是在2010年编写的指南,但我尝试遵循它们,尽管如此,我还是在我的项目中安装了ant并创建了一个build.xml文件,我从指南中复制了这个文件。因为我只能猜测构建文件中发生了什么(以前从未与ant合作过),所以当一个问题出现时,我非常担心 目前,当我尝试运行它时,它会显示“package android.app不存在”(我使用的是Activity类),对于项目的“/libs”文件夹中包含的库jar文件也是如此 很明显,我在某个地方遗漏了某种路径声明,但我尝试的方法似乎都不管用 编辑(添加代码): 这是MockTester.java-Android 在eclipse项目上使用ant运行单元测试,android,eclipse,unit-testing,ant,Android,Eclipse,Unit Testing,Ant,好的,我花了三天的时间整理网络,试图找出如何在eclipse项目的命令行中使用ant运行一些单元测试 我可以通过“运行方式”->“Android JUnit测试”在Eclipse中运行测试 我现在想要的是能够通过命令行运行测试。就这样 我似乎找不到任何不是在2010年编写的指南,但我尝试遵循它们,尽管如此,我还是在我的项目中安装了ant并创建了一个build.xml文件,我从指南中复制了这个文件。因为我只能猜测构建文件中发生了什么(以前从未与ant合作过),所以当一个问题出现时,我非常担心 目前
package com.android.mocksdktester;
import static org.junit.Assert.*;
import android.app.Activity;
import android.test.AndroidTestCase;
import com.mock.android.lib.*;
public class MockTester extends AndroidTestCase
{
Activity mActivity;
MockFeature mFeature;
public MockTester()
{
}
public void testExists()
{
String test = null;
assertNull(test);
}
}
正如你所看到的,没有太多的事情发生。
这是我得到的build.xml文件,正如我提到的,我只能猜测它在做什么
<?xml version="1.0"?>
<!-- to save as "build.xml" -->
<project name="Mock Unit Tests" default="run" basedir=".">
<path id="junit_classpath">
<pathelement location="C:\eclipse\plugins\org.junit_4.8.2.v4_8_2_v20110321-1705\junit.jar"/>
</path>
<!-- Library Project Here -->
<fileset dir="libs" includes="*.jar"/>
<!-- build all classes in this directory -->
<!-- To run this: use "ant build" -->
<!-- need to include junit.jar in the classpath -->
<target name="build">
<javac srcdir="${basedir}"/>
<echo message="Build done" />
</target>
<!-- Test and build all files -->
<!-- To run this: use "ant" (default) or "ant run" -->
<target name="run" depends="build">
<java taskname="Test" classname="MockTester" fork="true" failonerror="true" />
<echo message="Unit Tests done" />
</target>
<!-- delete all class files -->
<!-- To run this: use "ant clean" -->
<target name="clean">
<delete>
<fileset dir="${basedir}" includes="*.class" />
</delete>
<echo message="clean done" />
</target>
</project>
它抱怨过去没有看到junit,但我设法解决了这个问题。我只是不知道当它缺少Android相关的类和项目中包含的jar文件时该怎么办(尽管我读到这是一个bug)
错误:
build:
[javac] C:\<my workspace>\mock\mock_sdk_android\trunk\source\MockSDKTest\build.xml:16: warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds
[javac] Compiling 3 source files
[javac] C:\<my workspace>\mock\mock_sdk_android\trunk\source\MockSDKTest\src\com\android\mocksdktester\MockTester.java:14:error: package android.app does not exist
[javac] import android.app.Activity;
[javac] ^
[javac] C:\<my workspace>\mock\mock_sdk_android\trunk\source\MockSDKTest\src\com\android\mocksdktester\MockTester.java:15:error: package android.test does not exist
[javac] import android.test.AndroidTestCase;
[javac] ^
[javac] C:\<my workspace>\mock\mock_sdk_android\trunk\source\MockSDKTest\src\com\android\mocksdktester\MockTester.java:18:error: package com.mock.android.lib does not exist
[javac] import com.mock.android.lib.*;
[javac] ^
[javac] C:\<my workspace>\mock\mock_sdk_android\trunk\source\MockSDKTest\src\com\android\mocksdktester\MockTester.java:20:error: cannot find symbol
[javac] public class MockTester extends AndroidTestCase
[javac] ^
[javac] symbol: class AndroidTestCase
[javac] C:\<my workspace>\mock\mock_sdk_android\trunk\source\MockSDKTest\src\com\android\mocksdktester\MockTester.java:22:error: cannot find symbol
[javac] Activity mActivity;
[javac] ^
[javac] symbol: class Activity
[javac] location: class MockTester
[javac] C:\<my workspace>\mock\mock_sdk_android\trunk\source\MockSDKTest\src\com\android\mocksdktester\MockTester.java:23:error: cannot find symbol
[javac] MockFeature mFeature;
[javac] ^
[javac] symbol: class MockFeature
[javac] location: class MockTester
[javac] 6 errors
BUILD FAILED
构建:
[javac]C:\\mock\mock\u sdk\u android\trunk\source\MockSDKTest\build.xml:16:警告:未设置“includeantruntime”,默认为build.sysclasspath=last;对于可重复的生成,将设置为false
[javac]编译3个源文件
[javac]C:\\mock\mock\u sdk\u android\trunk\source\MockSDKTest\src\com\android\MockSDKTest\MockTester.java:14:错误:包android.app不存在
[javac]导入android.app.Activity;
[javac]^
[javac]C:\\mock\mock\u sdk\u android\trunk\source\MockSDKTest\src\com\android\MockSDKTest\MockTester.java:15:错误:包android.test不存在
[javac]导入android.test.AndroidTestCase;
[javac]^
[javac]C:\\mock\mock\u sdk\u android\trunk\source\MockSDKTest\src\com\android\MockSDKTest\MockTester.java:18:错误:包com.mock.android.lib不存在
[javac]导入com.mock.android.lib.*;
[javac]^
[javac]C:\\mock\mock\u sdk\u android\trunk\source\MockSDKTest\src\com\android\MockSDKTest\MockTester.java:20:错误:找不到符号
[javac]公共类MockTester扩展了AndroidTestCase
[javac]^
[javac]符号:类AndroidTestCase
[javac]C:\\mock\mock\u sdk\u android\trunk\source\MockSDKTest\src\com\android\MockSDKTest\MockTester.java:22:错误:找不到符号
[javac]活动能力;
[javac]^
[javac]符号:类活动
[javac]位置:类MockTester
[javac]C:\\mock\mock\u sdk\u android\trunk\source\MockSDKTest\src\com\android\MockSDKTest\MockTester.java:23:错误:找不到符号
[javac]MockFeature mFeature;
[javac]^
[javac]符号:类MockFeature
[javac]位置:类MockTester
[javac]6个错误
构建失败
谢谢没有解释你做了什么或失败了什么?你的项目是如何组织的 Ant使用该任务执行JUnit测试。您必须确保在类路径中有JUnit jar 通常,这是一个两步过程:
- 编译单元测试
- 运行
执行测试。格式化程序将指定测试的格式化方式。您可以创建一个XML输出,然后对其运行XSLT转换
测试时,可以使用
或
子任务到
任务来实际运行测试,然后使用
格式化测试以获得可读的输出
我不是在构建Android应用程序,但下面是我的Junit测试示例:
<property name="target.dir" value="${basedir}/target"/>
<property name="main.destdir" value="${target.dir}/classes"/>
<property name="test.srcdir" value="${basedir}/src/test/java"/>
<property name="test.destdir" value="${target.dir}/test-classes"/>
<!-- Path for all jars required for compiling your actual source -->
<path id="main.classpath">
<fileset dir="${basedir}/lib"/>
<path>
<!-- Includes JUnit.jar and the main.classpath jars too -->
<path id="test.classpath">
<fileset dir="${basedir}/test-lib"/>
<fileset dir="${basedir}/lib"/>
</path>
<mkdir dir="${test.destdir}"/>
<!-- Compile tests -->
<javac destdir="${test.destdir}"
fork="false"/>
<src path="${test.srcdir}"/>
<classpath refid="test.classpath"/>
<classpath refid="${main.destdir}"/>
谢谢你的帮助,大卫。实际上,我决定不再尝试使用ant,因为我真正想做的就是通过命令行运行单元测试,这可以使用adb shell中的am instrument
命令来完成(我通过查看android开发文档agian发现了这一点)
所以,我不确定我在这里做的是对的,因为虽然我找到了我真正想要的答案,但这并不是我所问问题的答案,那就是如何通过ant通过命令行运行测试
我的特定命令如下所示:adb shell am instrument-w com.android.mocksdktest.test/andro
id.test.InstrumentationTestRunner
在我开始工作之前,我有几次机会
在测试开始之前,您需要确保您正在测试的应用程序和测试应用程序都已安装在模拟器/设备上
我从命令行创建了测试项目,然后将该项目导入eclipse。我看到包名与我试图测试的应用程序包的名称相同,我认为这是错误的,所以我将其更改为其他名称,结果它坏了。所以,不要这样做:P(除非你知道如何改变它,而不是破坏它)
在最长的一段时间里,我试图运行adb shell am instrument-w com.android.mocksdktest/andro
id.test.InstrumentationTestRunner
。我没有在包名的末尾添加.test
,从我所知道的情况来看,没有迹象表明我需要它。文档上说,“安卓pa
<!-- Execute all classfiles you've compiled in test-classes directory -->
<junit fork="true"
maxmemory="128m"
includeAntRuntime="true">
<classpath>
<pathelement path="${main.destdir}"/>
<pathelement path="${test.destdir}"/>
</classpath>
<classpath refid="test.classpath"/>
<formatter type="plain"/>
<batchtest
todir="${junit.batchtest.todir}">
<fileset dir="${test.destdir}"/>
</batchtest>
</junit>