2014-10-07 3 views
17

Моя установка: - Android App с телефона и Tablet Version - Я использую Android Эспрессо для UI-тестов (в настоящее время только для телефона версии, с телефоном в buildagent)Android Эспрессо Тесты для телефона и планшета

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

+0

Есть ли U, использующий Android Studio? – Xcihnegn

+1

Было бы здорово, если бы были какие-то аннотации, такие как '@ Phone' и' @ Tablet', или '@DeviceConfig (smallestWidth = 480)', так что вы можете аннотировать свои методы тестирования этими аннотациями и в зависимости от типа вашего устройства , для выполнения или отсутствия конкретного метода тестирования. Это еще не существует, но было бы неплохо иметь ... просто говоря ... –

ответ

16

Три варианта, все из которых выполняются через gradlew connectedAndroidTest или cust О.М. Gradle задача:

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

Assumptions with assume - junit-team/junit Wiki - Github От:

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

К сожалению, 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 Правила

От A JUnit Rule to Conditionally Ignore Tests:

Это привело нас к созданию 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 rule to conditionally ignore test cases.

Этот подход может быть легко модифицирован для реализации метода 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; 
    } 
} 
+0

По-прежнему с 'com.android.support.test: runner: 0.5' предположения рассматриваются как неудачные тесты. – JJD

+0

Я бегущий бегун 0.5 и espresso 2.2.2, а неудачные предположения отмечены как проигнорированные, по крайней мере, в бегуне студии Android. –

 Смежные вопросы

  • Нет связанных вопросов^_^