Android咖啡testing手机和平板电脑

我的设置: – Android手机和平板电脑版本的应用程序 – 我正在使用Android咖啡进行用户界面testing(现在只用于手机版本,手机在buildagent)

我想要做什么: – 现在我想让Espresso区分手机和平板电脑的testing – 所以testingA应该只能通过平板电脑来执行,testingB只能通过手机来执行,而testingC也要执行 – testing应该可以通过gradle任务

Solutions Collecting From Web of "Android咖啡testing手机和平板电脑"

三个选项,所有这些都可以通过gradlew connectedAndroidTest或自定义gradle任务执行:

1.使用org.junit.Assume

假设假设 – junit-team / junit维基 – Github :

默认的JUnit运行者将忽略的失败假设对待testing。 自定义运动员可能会有不同的performance。

不幸的是, android.support.test.runner.AndroidJUnit4com.android.support.test:runner:0.2 )runner将失败的假设视为失败的testing。

一旦此行为得到解决,以下方法将isScreenSw600dp()请参阅下面的选项3 isScreenSw600dp()源):

仅电话:class级中的所有testing方法

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

具体的testing方法

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

2.使用自定义JUnit规则

从JUnit规则到有条件地忽略testing :

这导致我们创build一个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规则有条件地忽略testing用例 。

可以轻松修改此方法以实现下面的选项3中的isScreenSw600dp()方法。


3.在testing方法中使用条件

这是最不优雅的select,特别是因为完全跳过的testing将被报告为已通过,但实现起来非常容易。 下面是一个完整的示例testing课程,让你开始:

 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; } }