0

好的,所以我现在花了 3 天时间梳理网络,试图弄清楚如何从命令行为我的 Eclipse 项目运行一些单元测试。

我可以通过“Run As”->“Android JUnit Test”在 Eclipse 中运行测试

我现在想要的是能够通过命令行运行测试。而已。

我似乎找不到任何不是在 2010 年编写的指南,但尽管如此,我仍然尝试遵循它们,我已经安装了 ant 并在我的项目中创建了一个 build.xml 文件,我从中复制粘贴了指引。因为我只能猜测构建文件中发生了什么(以前从未使用过 ant),所以当问题出现时,我几乎是 SOL。

目前,当我尝试运行它时,它说“包 android.app 不存在”(我正在使用 Activity 类),对于我包含在项目的“/libs”文件夹中的库 jar 文件也是如此。

似乎很清楚,我在某处缺少某种路径声明,但我尝试的任何方法似乎都不起作用。

编辑(添加代码):这是 MockTester.java -

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 文件时该怎么办(尽管我已经读过这是一个错误)。

错误:

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

谢谢

4

2 回答 2

0

没有解释你做了什么或什么失败了?你的项目是如何组织的?

Ant 使用该<junit>任务来执行您的 JUnit 测试。您必须确保您的类路径中有 JUnit jar <junit>

通常,这是一个两步过程:

  • 编译你的单元测试。
  • 运行<junit>以执行您的测试。这formatter将指定您希望如何格式化测试。您可以创建一个 XML 输出,然后对其运行 XSLT 转换。

当您运行<junit>测试时,您使用任务的<test><batchtest><junit>任务来实际运行测试,然后使用<formatter>格式化您的测试以获得可读的输出。

我不是在构建 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}"/>

<!-- 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>
于 2012-10-16T01:28:31.117 回答
0

谢谢你的帮助大卫。实际上,我决定放弃尝试使用 ant,因为我真正想做的是通过命令行运行单元测试,这可以使用am instrumentadb shell 中的命令来完成(我通过查看 android dev docs agian 找到了)。

所以,我不确定我在这里做的是否正确,因为虽然我找到了我真正想要的答案,但这并不是我提出的问题的答案,即如何通过命令运行测试通过蚂蚁线。

我的特定命令如下所示:adb shell am instrument -w com.android.mocksdktester.test/andro id.test.InstrumentationTestRunner

在我开始工作之前,我遇到了一些问题。

  1. 在测试开始之前,您需要确保在您的模拟器/设备上安装了您正在测试的应用程序测试应用程序。

  2. 我从命令行按照http://developer.android.com/tools/testing/testing_otheride.html创建了测试项目,然后将项目导入到 Eclipse 中。我看到包名与我尝试测试的应用程序的包名相同,我认为这是错误的,所以我将其更改为其他名称,结果它坏了。所以,不要那样做:P(除非你知道如何改变它而不破坏它)。

  3. 我试图跑步的时间最长adb shell am instrument -w com.android.mocksdktester/andro id.test.InstrumentationTestRunner。我没有.test在包名称的末尾,而且据我所知,没有迹象表明我需要它。文档说"The Android package name of the test package."这是com.android.mocksdktester. 我想将其添加.test到末尾的唯一原因是因为我adb shell pm list instrumentation从另一个问题中找到了该命令,我认为该命令列出了当前在您的模拟器/设备上的所有仪器包,并且列表中的一项是

    仪器:com.android.mocksdktester.test/android.test.InstrumentationTestRunner(目标=com.android.mocksdktester)。

于 2012-10-17T17:06:18.940 回答