我的設置: - Android應用程序與手機和平板電腦版本 - 我使用的Android咖啡對UI的測試(目前僅適用於手機的版本,與buildagent電話)的Android咖啡試驗手機和平板電腦
什麼我想要做的: - 現在我想要Espresso區分手機和平板電腦的測試 - 所以測試A應該只能通過平板電腦執行,測試B只能通過手機執行並且測試C都需要執行 - 測試應該是通過gradle任務執行
我的設置: - Android應用程序與手機和平板電腦版本 - 我使用的Android咖啡對UI的測試(目前僅適用於手機的版本,與buildagent電話)的Android咖啡試驗手機和平板電腦
什麼我想要做的: - 現在我想要Espresso區分手機和平板電腦的測試 - 所以測試A應該只能通過平板電腦執行,測試B只能通過手機執行並且測試C都需要執行 - 測試應該是通過gradle任務執行
三個選項,所有這些都可以通過gradlew connectedAndroidTest
或cust OM gradle這個任務:
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
}
從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()
方法。
這是最優雅的選擇,特別是因爲完全忽略如通過測試,將上報,但它很容易實現。下面是一個完整的示例測試課程,以幫助您入門:
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;
}
}
仍然將'com.android.support.test:runner:0.5'的假設視爲失敗的測試。 – JJD 2016-11-17 13:23:50
我正在運行runner 0.5和espresso 2.2.2,失敗的假設被標記爲忽略,至少在android studio runner中。 – 2017-02-10 11:10:50
U是否使用Android Studio? – Xcihnegn 2015-05-18 06:27:03
如果有'@ Phone'和'@ Tablet'或'@DeviceConfig(smallestWidth = 480)'這樣的註釋,那麼這樣會很酷,這樣您就可以使用這些註釋來註釋測試方法,並且取決於您的設備類型,執行或不執行特定的測試方法。這個目前還不存在,但是很高興能夠......只是說... – 2015-05-20 11:10:02