Есть ли способ написать модульный тест для целевого API


Я нахожусь в процессе написания андроидных инструментальных тестов в области Роболектрических пользовательских теней.

В идеале, мы хотим написать код, который является гибким во всех версиях Android SDK, однако я нахожусь в ситуации крайнего случая, когда мне нужно написать отдельный модульный тест для метода, который работает только Marshmallow.

Мне также нужно написать модульный тест, который работает только для Lollipop и under из-за различий в зависимостях операционной системы (т. е. Ява.яз..Noclassdeffounderror'S)

Есть ли в любом случае я могу сделать это через JUnit4-подобные аннотации или что-то подобное тому, что делает Robolectric, где он может игнорировать запуск тестов, если SDK не подходит?

Я не хочу писать такой код:

// MarshmallowWidgetTest.java
@Test
public void testPrintName()
{
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
    {
        // ...asserts...
    }
}

// LollipopWidgetTest.java
@Test
public void testPrintName()
{
    if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP)
    {
        // ...asserts...
    }
}
1 6

1 ответ:

Я не очень хорошо знаком с модульным тестированием или Robolectric, но поскольку на момент написания мной модульных тестов не было поддержки API 23, я использовал эту конфигурацию:

@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 21) //this guy
public class MainActivityTest {

    MainActivity_ activity = Robolectric.setupActivity(MainActivity_.class);

}

Итак, как вы видите, есть аннотация, которую вы можете использовать для своих тестовых классов.


Правка:

Извините, что я сосредоточился только на Robolectric тестовом фреймворке, а не на главной проблеме.

Для аннотирования тестов инструментария для конкретного API я бы использовал:

1. Класс с @Before аннотация

Создайте класс с аннотацией @Before, где он будет проверять API тестируемых устройств. Если это не так, то тесты в этом методе провалятся. Используйте метод fail();.

2. Используйте @SdkSuppress аннотацию

Указывает, что для выполнения определенного теста или класса требуется минимальный уровень API.

Тест(Ы) будет пропущен при выполнении на платформах android ниже указанного уровня.

От: http://developer.android.com/reference/android/support/test/filters/SdkSuppress.html

Поэтому, если вы установите @SdkSuppress(minSdkVersion=23), он будет работать только на устройствах Android Marshmallow, а если @@SdkSuppress(minSdkVersion=20), он будет работать только на устройствах с более высоким API 5.0.

Читайте также: http://www.vogella.com/tutorials/AndroidTesting/article.html

3. Создайте свою собственную аннотацию, например @SdkOnly

Может быть, эта статья будет полезна: http://help.testdroid.com/customer/portal/articles/1256803-using-annotations-in-android-instrumentation-tests

4. Создайте наборы для ваших специфических тестов инструментирования

Для этой цели вы бы использовали аннотации @RunWith() и Suites.SuiteClasses().

Чтобы организовать выполнение инструментальных модульных тестов, вы можете сгруппируйте коллекцию тестовых классов в класс Test suite и запустите их тесты вместе. Наборы тестов могут быть вложенными; ваш тест люкс может группироваться другие наборы тестов и запускать все их компонентные тестовые классы вместе.

Набор тестов содержится в тестовом пакете, аналогичном основному пакет приложения. По соглашению, имя пакета набора тестов обычно заканчивается на этом .суффикс сюиты (например, ком.образец.андроид.тестирование.мой пример.комплект).

Чтобы создать набор тестов для модульных тестов, импортируйте JUnit RunWith и еще Suite занятия. В свой набор тестов добавьте @RunWith(Suite.class) и аннотации @Suite.SuitClasses(). В @Suite.SuiteClasses() аннотация, перечислите отдельные классы тестов или наборы тестов как аргументы.

В следующем примере показано, как можно реализовать набор тестов называется UnitTestSuite, что группирует и запускает CalculatorInstrumentationTest и CalculatorAddParameterizedTest тест занятия вместе.

import com.example.android.testing.mysample.CalculatorAddParameterizedTest;
import com.example.android.testing.mysample.CalculatorInstrumentationTest;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;

// Runs all unit tests.
@RunWith(Suite.class)
@Suite.SuiteClasses({CalculatorInstrumentationTest.class,
        CalculatorAddParameterizedTest.class})
public class UnitTestSuite {}

Из: http://developer.android.com/training/testing/unit-testing/instrumented-unit-tests.html

5. Полезный ресурсы

Надеюсь, что это поможет