10

我想在用测试夹具替换它之前备份我的应用程序的数据库。由于 Android 的限制,我被迫使用 Junit3,并且我想实现 @BeforeClass 和 @AfterClass 的等效行为。

更新:现在有一个工具 ( Junit4Android ) 可以在 Android 上获得对 Junit4 的支持。这有点麻烦,但应该可以。

为了实现 @BeforeClass 等效项,我一直在使用静态变量并在第一次运行时像这样初始化它,但我需要能够在运行所有测试后恢复数据库。我想不出一种方法来检测最后一次测试何时运行(因为我相信无法保证测试执行的顺序。)

public class MyTest extends ActivityInstrumentationTestCase2<MainActivity> {
    private static boolean firstRun = true;

    @Override
    protected void setUp() {
        if(firstRun) {
            firstRun = false;
            setUpDatabaseFixture();
        }
    }
    ...
}
4

4 回答 4

8

junit网站

在套件中包装了 setUp 和 tearDown 方法。如果您想运行单个 YourTestClass 测试用例,这是针对这种情况的。

public static Test suite() {
    return new TestSetup(new TestSuite(YourTestClass.class)) {

        protected void setUp() throws Exception {
            System.out.println(" Global setUp ");
        }
        protected void tearDown() throws Exception {
            System.out.println(" Global tearDown ");
        }
    };
}

如果您只想为所有测试用例运行一个 setUp 和 tearDown,请创建一个套件并将 testClass 添加到它并在 TestSetup 构造函数中传递套件对象。但我认为这并没有太多用处,并且在某种程度上它是违反 JUnit 理念。

于 2011-08-26T17:57:48.180 回答
1

最近,我也在寻找类似的解决方案。幸运的是,在我的情况下,在最后一个测试运行后 JVM 退出之后。所以我能够通过添加一个 JVM 关闭钩子来实现这一点。

// Restore database after running all tests
Runtime.getRuntime().addShutdownHook(new Thread() {
    public void run() {
        restoreDatabase();
    }
});

希望这可以帮助。

于 2011-08-26T18:12:54.977 回答
0

我建议避免这种依赖关系,因为你需要知道测试运行的顺序。如果您只需要恢复一个被替换的真实数据库,setUpDatabaseFixture()那么您的解决方案可能来自RenamingDelegatingContext的使用。无论如何,如果您无法避免知道上次测试的运行时间,您可以使用以下内容:

...

private static final int NUMBER_OF_TESTS = 5; // count your tests here
private static int sTestsRun = 0;

...

protected void tearDown() throws Exception {
    super.tearDown();
    sTestsRun += countTestCases();

    if ( sTestsRun >= NUMBER_OF_TESTS ) {
        android.util.Log.d("tearDow", "*** Last test run ***");
    }
}
于 2011-08-29T03:01:14.257 回答
0

这不是(优雅地处理数据,因此您不必担心恢复它)使用模拟对象进行测试的目的是什么?Android支持模拟

我问一个问题,因为我从来没有嘲笑过 Android。


根据我的经验和这篇博客文章,当 Android 测试被制成一个套件并由InstrumentationTestRunner运行时- ActivityInstrumentationTestCase2是 ActivityTestCase 的扩展,InstrumentationTestCase的扩展- 它们按字母顺序使用android.test.suitebuilder.TestGrouping.SORT_BY_FULLY_QUALIFIED_NAME,所以你可以恢复你DB 的方法是测试名称中字母表中的最低值,例如:

// underscore is low in the alphabet
public void test___________Restore() { 
    ... 
}

笔记:

您必须注意继承的测试,因为它们不会按此顺序运行。解决方案是覆盖所有继承的测试并简单地从覆盖中调用 super()。这将再次让所有内容按字母顺序执行。

例子:

// Reusable class w only one time setup and finish. 
// Abstract so it is not run by itself.
public abstract class Parent extends InstrumentationTestCase {
    @LargeTest
    public void test_001_Setup() { ... }

    @LargeTest
    public void test_____Finish() { ... }
}

/*-----------------------------------------------------------------------------*/

// These will run in order shown due to naming.
// Inherited tests would not run in order shown w/o the use of overrides & supers
public class Child extends Parent {
    @LargeTest
    public void test_001_Setup() { super.test_001_Setup(); }

    @SmallTest
    public void test_002_MainViewIsVisible() { ... }

    ...

    @LargeTest
    public void test_____Finish() { super.test_____Finish(); }
}
于 2011-11-22T17:58:14.030 回答