为每个测试套件InstrumentationTestCase Android运行setUp()和tearDown()方法

时间:2014-07-22 16:51:35

标签: android testing automated-tests android-instrumentation

我正在实施一个测试自动化工具,我有一个扩展InstrumentationTestCase的类。例如:

public class BaseTests extends InstrumentationTestCase {

    @Override
    protected void setUp() throws Exception {
        super.setUp();
        Log.d(TAG, "setUp()");
    }

    @Override
    protected void tearDown() throws Exception {
        super.tearDown();
        Log.d(TAG, "tearDown()");
    }

    public void test_one() {
        Log.d(TAG, "test_one()");
    }

    public void test_two() {
        Log.d(TAG, "test_two()");
    }
}

当我运行BaseTests的测试时,setUp()方法被调用2次。执行test_one()之前的一次和test_two()之后的另一次。 tearDown()会发生同样的情况,在执行两个方法中的每个方法后都会调用它。

我想在这里做的是只调用一次setUp()和tearDown()方法来执行所有BaseTests测试。所以方法调用的顺序如下:

1)setUp()

2)test_one()

3)test_two()

4)tearDown()

有没有办法做这样的事情?

2 个答案:

答案 0 :(得分:2)

我使用以下方法解决了这个问题:

@BeforeClass
public static void setUpBeforeClass() throws Exception {
}

@AfterClass
public static void tearDownAfterClass() throws Exception {
}

而不是setUp()和tearDown()。 所以在你的情况下,它将是:

import org.junit.AfterClass;
import org.junit.BeforeClass;
public class BaseTests extends InstrumentationTestCase {

@BeforeClass
protected static void setUp() throws Exception { 
    //do your setUp
    Log.d(TAG, "setUp()");
}

@AfterClass
protected static void tearDown() throws Exception {
    //do your tearDown
    Log.d(TAG, "tearDown()");
}

public void test_one() {
    Log.d(TAG, "test_one()");
}

public void test_two() {
    Log.d(TAG, "test_two()");
}
}

注释@BeforeClass和@AfterClass确保它分别在测试运行之前和之后运行一次

答案 1 :(得分:0)

我最终遵循@beforeClass和@afterClass的想法。

但是我无法使用注释本身。相反,我在基类上实现了它们(通过使用计数器),我的测试套件继承自这个基类。

以下是我自己建立的链接:

https://android.googlesource.com/platform/frameworks/base/+/9db3d07b9620b4269ab33f78604a36327e536ce1/test-runner/android/test/PerformanceTestBase.java

我希望这可以帮助别人!