的Android咖啡试验手机和平板电脑
我的设置: - Android应用程序与手机和平板电脑版本 - 我使用的Android咖啡对UI的测试(目前仅适用于手机的版本,与buildagent电话)的Android咖啡试验手机和平板电脑
什么我想要做的: - 现在我想要Espresso区分手机和平板电脑的测试 - 所以测试A应该只能通过平板电脑执行,测试B只能通过手机执行并且测试C都需要执行 - 测试应该是通过gradle任务执行
三个选项,所有这些都可以通过gradlew connectedAndroidTest
或cust OM 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。
这种方法可以很容易地修改,以实现下面的选项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;
}
}
仍然将'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