一、概述:
上一篇Android Studio中的单元测试(一)Java测试运行在JVM虚拟机,本次则需要运行在Android设备或者模拟器上的测试。主要用于测试: 单元(Android SDK层引用关系的相关的单元测试)、UI、应用组件集成测试(Service、Content Provider等)。
二、配置
我们需要在app目录gradle中添加依赖。
android {
...
defaultConfig {
...
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
}
dependencies {
...
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
androidTestImplementation 'com.android.support.test:rules:1.0.2'
}
三、Espresso常用方法介绍
1.onView
用于获取某个控件对象,即ViewInteraction。有两个方法来以获取对象,如下:
- withText:通过文本来获取对象,如:ViewInteraction save = onView(withText(“保存”)) ;
- withId:通过id来获取对象,如:ViewInteraction save = onView(withId(R.id.save)) ;
2.对于ViewInteraction控件的操作
(1)perform
使用方式是onView(…).perform() 。也可以执行多个操作在一个perform中如:perform(click(),clearText()) 。所有的操作都有一个前提 ———— 就是要执行的view必须在当前界面上显示出来(有且可见)。
方法名 | 含义 |
---|---|
click() | 点击view |
clearText() | 清除文本内容 |
swipeLeft() | 从右往左滑 |
swipeRight() | 从左往右滑 |
swipeDown() | 从上往下滑 |
swipeUp() | 从下往上滑 |
click() | 点击view |
closeSoftKeyboard() | 关闭软键盘 |
pressBack() | 按下物理返回键 |
doubleClick() | 双击 |
longClick() | 长按 |
scrollTo() | 滚动 |
replaceText() | 替换文本 |
openLinkWithText() | 打开指定超链 |
(2)check
使用check()方法来检查View是否符合我们的期望,使用方式onView(…).check() ,如下:
onView(…).check(matches(withText(“hello”))) // 检查view中是否含有文本“hello”
四、使用实例
这个例子来源于实际开发中,目的是检验新建工程的时候工程名称是否包含电压等级。如:四川500KV变电项目。详细代码参见MainActivity.java代码如下:
public class MainActivity extends AppCompatActivity {
public ActivityMainBinding mBinding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String url = getIntent().getStringExtra("url");
Log.d("RHINO", "url: " + url);
mBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
mBinding.save.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String projectName = mBinding.edit.getText().toString();
if (isProjectNameValid(projectName)) {
Log.d("RHINO", "正确的工程名称: " + projectName);
mBinding.project.append(TextUtils.isEmpty(projectName)
? ""
: projectName + "\n");
} else {
Log.e("RHINO", "工程名称错误: " + projectName);
Toast.makeText(getApplicationContext(),
"无效工程名称,名称需要包含电压等级,如:四川500KV变电项目",
Toast.LENGTH_SHORT).show();
}
}
});
}
/**
* 工程名称是否有效,必须包含电压等级,如:四川500KV变电项目
*
* @param name 工程名称
* @return true 有效
*/
private boolean isProjectNameValid(@NonNull String name) {
String lowName = name.toLowerCase();
String kvRegex = ".*[0-9]+kv.*";
String vRegex = ".*[0-9]+v.*";
return Pattern.compile(kvRegex).matcher(lowName).matches()
|| Pattern.compile(vRegex).matcher(lowName).matches();
}
}
上面的代码很简单,这里就不赘述了,每次点击保存都会给出打印和提示,我们针对MainActivity写个测试用例MainActivityInstrumentedTest.java如下:
public class MainActivityInstrumentedTest {
@Rule
public ActivityTestRule<MainActivity> mActivityTestRule
= new ActivityTestRule<MainActivity>(MainActivity.class) {
@Override
protected Intent getActivityIntent() {
Intent intent = new Intent();
intent.putExtra("url", "http://www.baidu.com");
return intent;
}
@Override
protected void beforeActivityLaunched() {
super.beforeActivityLaunched();
Log.d("RHINO", "beforeActivityLaunched");
}
@Override
protected void afterActivityLaunched() {
super.afterActivityLaunched();
Log.d("RHINO", "afterActivityLaunched");
}
@Override
protected void afterActivityFinished() {
super.afterActivityFinished();
Log.d("RHINO", "afterActivityFinished");
}
};
@Before
public void setUp() throws Exception {
Log.d("RHINO", "setUp");
delay(1000);
}
@After
public void tearDown() throws Exception {
delay(10000);
Log.d("RHINO", "tearDown");
}
@Test
public void emptyTest() {
Log.d("RHINO", "emptyTest");
}
@Test
public void testProjectName() {
Log.d("RHINO", "testProjectName");
testProjectName("四川100变电项目");
testProjectName("四川100KV变电项目");
testProjectName("四川100Kv变电项目");
testProjectName("100kv四川变电项目");
testProjectName("四川变电项目100kV");
testProjectName("四川V变电项目");
testProjectName("四川100V变电项目");
testProjectName("100v四川变电项目");
}
private void testProjectName(String name) {
delay(1000);
onView(withId(R.id.edit)).perform(replaceText(name), closeSoftKeyboard());
onView(withText("保存")).perform(click());
}
private void delay(long millis) {
try {
Thread.sleep(millis);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
测试的目的是连续输入预设的工程名称,观察打印结果。运行打印结果如下:
可以看到,预设输入和我们预期的执行结果一致。