Как я могу получить эквивалент @BeforeClass и @AfterClass в Junit3? - PullRequest
10 голосов
/ 26 августа 2011

Я хочу создать резервную копию базы данных моего приложения, прежде чем заменить ее тестовым прибором.Я вынужден использовать Junit3 из-за ограничений Android, и я хочу реализовать эквивалентное поведение @BeforeClass и @ AfterClass.

ОБНОВЛЕНИЕ: теперь есть инструмент ( Junit4Android ) чтобы получить поддержку Junit4 на Android.Это немного круто, но должно работать.

Чтобы получить эквивалент @BeforeClass, я использовал статическую переменную и инициализировал ее во время первого запуска, как это, но мне нужно иметь возможностьвосстановить базу данных после выполнения всех тестов.Я не могу придумать способ определения, когда последний тест был выполнен (так как я считаю, что нет порядка порядка выполнения теста.)

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

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

Ответы [ 4 ]

8 голосов
/ 26 августа 2011

с сайта 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 для всех testcase, создайте набор, добавьте в него testClass и передайте набор Объект в конструкторе TestSetup. Но я думаю, что не так много использования за это и в некотором смысле это нарушает философию JUnit.

1 голос
/ 22 ноября 2011

Разве это не (элегантно работать с данными, поэтому вам не нужно беспокоиться о его восстановлении), для чего тестирование с фиктивными объектами ? Android поддерживает насмешку .

Я задаю вопрос, поскольку я никогда не издевался над Android.


По моему опыту и из этого сообщения в блоге , когда тесты Android превращаются в набор и запускаются InstrumentationTestRunner - ActivityInstrumentationTestCase2 является расширением ActivityTestCase , которое является расширением InstrumentationTestCase - они упорядочены в алфавитном порядке с использованием android.test.suitebuilder.TestGrouping.SORT_BY_FULLY_QUALIFIED_NAME, так что вы можете просто восстановить свою БД с помощью метода, который является низким в алфавите из названий ваших тестов, например:

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

Примечание:

Вы должны обратить внимание на унаследованные тесты, так как они не будут выполняться в этом порядке. Решение состоит в том, чтобы переопределить все унаследованные тесты и просто вызвать super () из переопределения. Это снова будет выполнять все в алфавитном порядке.

* +1040 * Пример: * * тысяча сорок один
// 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(); }
}
1 голос
/ 26 августа 2011

Недавно я тоже искал подобное решение. К счастью, в моем случае после выхода JVM после запуска последнего теста. Так что я смог добиться этого, добавив хук отключения JVM.

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

надеюсь, это поможет.

0 голосов
/ 29 августа 2011

Я бы предложил избегать такого рода зависимостей, когда вам нужно знать порядок, в котором выполняются тесты. Если все, что вам нужно, это восстановить реальную базу данных, которая была заменена на 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 ***");
    }
}
...