的Android咖啡试验手机和平板电脑

的Android咖啡试验手机和平板电脑

问题描述:

我的设置: - 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

三个选项,所有这些都可以通过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