2014-10-07 63 views
17

我的設置: - Android應用程序與手機和平板電腦版本 - 我使用的Android咖啡對UI的測試(目前僅適用於手機的版本,與buildagent電話)的Android咖啡試驗手機和平板電腦

什麼我想要做的: - 現在我想要Espresso區分手機和平板電腦的測試 - 所以測試A應該只能通過平板電腦執行,測試B只能通過手機執行並且測試C都需要執行 - 測試應該是通過gradle任務執行

+0

U是否使用Android Studio? – Xcihnegn 2015-05-18 06:27:03

+1

如果有'@ Phone'和'@ Tablet'或'@DeviceConfig(smallestWidth = 480)'這樣的註釋,那麼這樣會很酷,這樣您就可以使用這些註釋來註釋測試方法,並且取決於您的設備類型,執行或不執行特定的測試方法。這個目前還不存在,但是很高興能夠......只是說... – 2015-05-20 11:10:02

回答

16

三個選項,所有這些都可以通過gradlew connectedAndroidTest或cust OM gradle這個任務:

1.使用org.junit.Assume

Assumptions with assume - junit-team/junit Wiki - Github

的與失敗的假設默認的JUnit運行測試對待作爲被忽略。自定義選手可能會有不同的表現。

不幸的是,android.support.test.runner.AndroidJUnit4com.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

這種方法可以很容易地修改,以實現下面的選項3中的isScreenSw600dp()方法。


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 2016-11-17 13:23:50

+0

我正在運行runner 0.5和espresso 2.2.2,失敗的假設被標記爲忽​​略,至少在android studio runner中。 – 2017-02-10 11:10:50