Подтвердить что ты не робот

Тесты для эспрессо Android для телефона и планшета

Моя настройка: - Android-приложение с телефоном и планшетами - Я использую Android Espresso для UI-тестов (теперь только для версии телефона, с телефоном в buildagent)

Что я хочу сделать: - Теперь я хочу, чтобы Espresso различал тесты для телефона и планшета - Таким образом, тест A должен выполняться только планшетом, тест B должен выполняться только телефоном и тестом C обоих - Тесты должны выполняться с помощью задачи gradle

4b9b3361

Ответ 1

Три варианта, все из которых выполняются с помощью gradlew connectedAndroidTest или пользовательских gradle задач:

1. Используйте org.junit.Assume

Из Предположения с предположением - junit-team/junit Wiki - Github:

По умолчанию JUnit runner рассматривает тесты с ошибками, которые игнорируются. Пользовательские бегуны могут вести себя по-разному.

К сожалению, бегун android.support.test.runner.AndroidJUnit4 (com.android.support.test:runner:0.2) рассматривает неудачные предположения как неудачные тесты.

Как только это поведение будет исправлено, будет работать следующее (см. вариант 3 ниже для источника isScreenSw600dp()):

Только телефон: все методы тестирования в классе

    @Before
    public void setUp() throws Exception {
        assumeTrue(!isScreenSw600dp());
        // other setup
    }

Специальные методы тестирования

    @Test
    public void testA() {
        assumeTrue(!isScreenSw600dp());
        // test for phone only
    }

    @Test
    public void testB() {
        assumeTrue(isScreenSw600dp());
        // test for tablet only
    }

2. Используйте пользовательское правило JUnit

От Правило JUnit для условного игнорирования тестов:

Это привело нас к созданию аннотации ConditionalIgnore и соответствующему правилу, чтобы подключить его к среде исполнения JUnit. Дело простое и лучше всего объясняется с помощью примера:

public class SomeTest {
  @Rule
  public ConditionalIgnoreRule rule = new ConditionalIgnoreRule();

  @Test
  @ConditionalIgnore( condition = NotRunningOnWindows.class )
  public void testFocus() {
    // ...
  }
}

public class NotRunningOnWindows implements IgnoreCondition {
  public boolean isSatisfied() {
    return !System.getProperty( "os.name" ).startsWith( "Windows" );
  }
}

ConditionalIgnoreRule код здесь: правило JUnit для условного игнорирования тестовых примеров.

Этот подход может быть легко изменен для реализации метода isScreenSw600dp() в Варианте 3. ниже.


3. Использовать условные обозначения в методах тестирования

Это наименее элегантный вариант, особенно потому, что полностью пропущенные тесты будут передаваться как переданные, но это очень легко реализовать. Вот полный тестовый класс для запуска:

import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;
import android.test.ActivityInstrumentationTestCase2;
import android.util.DisplayMetrics;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

import static android.support.test.espresso.Espresso.onView;
import static android.support.test.espresso.assertion.ViewAssertions.matches;
import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
import static android.support.test.espresso.matcher.ViewMatchers.withId;

@RunWith(AndroidJUnit4.class)
public class DeleteMeTest extends ActivityInstrumentationTestCase2<MainActivity> {
    private MainActivity mActivity;
    private boolean mIsScreenSw600dp;

    public DeleteMeTest() {
        super(MainActivity.class);
    }

    @Before
    public void setUp() throws Exception {
        injectInstrumentation(InstrumentationRegistry.getInstrumentation());
        setActivityInitialTouchMode(false);
        mActivity = this.getActivity();
        mIsScreenSw600dp = isScreenSw600dp();
    }

    @After
    public void tearDown() throws Exception {
        mActivity.finish();
    }

    @Test
    public void testPreconditions() {
        onView(withId(R.id.your_view_here))
                .check(matches(isDisplayed()));
    }

    @Test
    public void testA() {
        if (!mIsScreenSw600dp) {
            // test for phone only
        }
    }

    @Test
    public void testB() {
        if (mIsScreenSw600dp) {
            // test for tablet only
        }
    }

    @Test
    public void testC() {
        if (mIsScreenSw600dp) {
            // test for tablet only
        } else {
            // test for phone only
        }

        // test for both phone and tablet
    }

    private boolean isScreenSw600dp() {
        DisplayMetrics displayMetrics = new DisplayMetrics();
        mActivity.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
        float widthDp = displayMetrics.widthPixels / displayMetrics.density;
        float heightDp = displayMetrics.heightPixels / displayMetrics.density;
        float screenSw = Math.min(widthDp, heightDp);
        return screenSw >= 600;
    }
}