【问题标题】:How do I create Android test suite which only runs specified tests in one or more classes?如何创建仅在一个或多个类中运行指定测试的 Android 测试套件?
【发布时间】:2012-12-23 10:27:56
【问题描述】:

有人能解释一下如何在 Android 中使用 JUnit 在测试套件中组织测试吗?我发现几乎所有示例都不起作用,我想知道我没有得到什么。

我用一个包含几个测试的 AndroidTestCase 类和一个包含包中所有测试的测试套件做了一个小例子。这有效(显然):

包含测试的测试用例类:

public class ArithmeticsTest extends AndroidTestCase {
    SomeClass sctest;

    protected void setUp () throws Exception {
        sctest = new SomeClass();       
        super.setUp();
    }


    /* Test the SomeClass.addNumbers (int, int) method: */
    public void testAddNumbers () {
        assertEquals(9, sctest.addNumbers(3, 6));
    }

    /* Test the SomeClass.addNumbers (int, int) method: */
    public void testSubtractNumbers () {
        assertEquals(2, sctest.subtractNumbers(6, 4));
    }


    protected void tearDown () throws Exception {
        super.tearDown();
    }
}

包含包中所有测试的测试套件类:

import junit.framework.Test;
import android.test.suitebuilder.TestSuiteBuilder;

public class ProjectTestSuite_AllTests {
    public static Test suite () {
        return new TestSuiteBuilder(ProjectTestSuite_AllTests.class)
            .includeAllPackagesUnderHere()
            .build();
    }
}

如前所述,这是可行的。但是,如果我有很多测试用例,两个类都有几个测试,而其他类有其他测试(组织不同类型的测试很有意义,imo),那么我想创建包含特定测试的测试套件类等,因此它们可以独占运行。

我看过这方面的例子,但我没有让任何人工作。有没有人有一个很好的例子?也就是说,一个新的测试套件,其中包括来自一个或多个测试用例类的特定测试用例。

更新:

以下两个例子有效:

运行包中的所有测试:

public static Test suite () {
    return new TestSuiteBuilder(ProjectTestSuite_AllTests.class)
    .includeAllPackagesUnderHere()
    .build();
}

在特定的测试类(AndroidTestCase 类)中运行所有测试:

public static Test suite () {
    Class testClass = ArithmeticsTests.class;
    TestSuite suite = new TestSuite(testClass);

    return suite;
}

但是,这不起作用:

public static Test suite () {
    TestSuite suite= new TestSuite();
    suite.addTest(new ArithmeticsTest("testAddNumbers"));
    suite.addTest(new ArithmeticsTest("testSubtractNumbers"));

    return suite;
}

最后一个(非工作)示例来自 developer.android.com。尝试此操作时遇到的错误是:

构造函数 ArithmeticsTests(String) 未定义

这很奇怪,因为我没有尝试访问构造函数,而是在测试用例类 (testAddNumbers) 中命名特定的测试方法。

1 月 11 日更新:

这是包含几个测试的测试用例类:

public class ArithmeticsTests extends AndroidTestCase {
    SomeClass sctest;

    protected void setUp () throws Exception {
        sctest = new SomeClass();
        super.setUp();
    }

    public void testAddNumbers () {
        assertEquals(9, sctest.addNumbers(3, 6));
    }

    public void testSubtractNumbers () {
        assertEquals(2, sctest.subtractNumbers(6, 4));
    }

    protected void tearDown () throws Exception {
        super.tearDown();
    }
}

这是我尝试在其中包含(f.ex.)上述类中的一个测试的测试套件类:

public class ProjectTestSuite_SomeTests {

    public static Test suite () {
        // This does not work:
        TestSuite suite= new TestSuite();
        suite.addTest(new ArithmeticsTests("testAddNumbers"));
        return suite;
    }
}

上面的 addTest 行导致了这个错误:

构造函数 ArithmeticsTests(String) 未定义

这是我在此示例中尝试测试的 SomeClass 文件:

public class SomeClass {

    int     classInt;
    String  classString;
    Item    item;

    public SomeClass () {}

    public SomeClass (int ci, String cs) {
        this.classInt    = ci;
        this.classString = cs;
    }

    public int addNumbers (int num1, int num2) {
        return num1+num2;
    }

    public int subtractNumbers (int num1, int num2) {
        return num1-num2;
    }
}

【问题讨论】:

  • 另外,这个问题的主题似乎在每次中间编辑时都飘忽不定。我想说,从“请帮助,我无法运行 Android 测试,也找不到任何教程”开始,然后在十分钟后开始谈论完全不同的事情,这是不公平的。经验丰富的开发人员也会首先尝试解释被问到的问题。
  • 编辑?我根本没有编辑问题。但是,我会尝试对其进行编辑以使其更清晰。但是看着它,我并没有立即看到问题在哪里不清楚?我要问以下问题:如何创建不运行包中的所有测试,但准确指定要运行一个或多个类中的哪些测试的测试套件?
  • 我只是简单地更改了标题,假设是真诚的。
  • 啊,所以标题是问题所在。谢谢:-)

标签: android eclipse junit testcase test-suite


【解决方案1】:

要只运行测试函数的子集,使您的 suite 方法如下所示:

public static Test suite () {
    final TestSuite suite = new TestSuite();
    suite.addTest(TestSuite.createTest(ArithmeticsTests.class, "testAddNumbers"));
    suite.addTest(TestSuite.createTest(ArithmeticsTests.class, "testSubtractNumbers"));
    // add some more tests here or comment out one of the lines above
    // if you want to skip a particular test
    return suite;
}

createTest 方法似乎没有很好的文档记录,但它对我有用: http://developer.android.com/reference/junit/framework/TestSuite.html#createTest(java.lang.Class, java.lang.String)

【讨论】:

    【解决方案2】:

    AFAIK 的问题是 AndroidTestCase 类只有一个构造函数 - AndroidTestCase()

    仅 JUnit 的 TestCase 类支持使用字符串指定测试用例,AndroidTestCase() 不支持。这就是你面临这个问题的原因。

    【讨论】:

      【解决方案3】:

      我找到了一种解决方法来实现您想要的。

      看看这个:Android TestSuite: Include all TestCases except some explicitly defined

      【讨论】:

        猜你喜欢
        • 2016-02-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-06
        • 1970-01-01
        • 1970-01-01
        • 2019-11-24
        相关资源
        最近更新 更多