Espresso环境搭建
build.gradle (Module:app)
defaultConfig {
...
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
// App's dependencies, including test
compile "com.android.support:appcompat-v7:$rootProject.supportLibraryVersion"
compile "com.android.support:cardview-v7:$rootProject.supportLibraryVersion"
compile "com.android.support:design:$rootProject.supportLibraryVersion"
compile "com.android.support:recyclerview-v7:$rootProject.supportLibraryVersion"
compile "com.android.support:support-v4:$rootProject.supportLibraryVersion"
compile "com.android.support.test.espresso:espresso-idling-resource:$rootProject.espressoVersion"
compile "com.google.guava:guava:$rootProject.guavaVersion"
// Dependencies for local unit tests
testCompile "junit:junit:$rootProject.ext.junitVersion"
testCompile "org.mockito:mockito-all:$rootProject.ext.mockitoVersion"
testCompile "org.hamcrest:hamcrest-all:$rootProject.ext.hamcrestVersion"
// Android Testing Support Library's runner and rules
androidTestCompile "com.android.support.test:runner:$rootProject.ext.runnerVersion"
androidTestCompile "com.android.support.test:rules:$rootProject.ext.runnerVersion"
// Dependencies for Android unit tests
androidTestCompile "junit:junit:$rootProject.ext.junitVersion"
androidTestCompile "org.mockito:mockito-core:$rootProject.ext.mockitoVersion"
androidTestCompile 'com.google.dexmaker:dexmaker:1.2'
androidTestCompile 'com.google.dexmaker:dexmaker-mockito:1.2'
// Espresso UI Testing
androidTestCompile "com.android.support.test.espresso:espresso-core:$rootProject.espressoVersion"
androidTestCompile "com.android.support.test.espresso:espresso-contrib:$rootProject.espressoVersion"
androidTestCompile "com.android.support.test.espresso:espresso-intents:$rootProject.espressoVersion"
// Resolve conflicts between main and test APK:
androidTestCompile "com.android.support:support-annotations:$rootProject.supportLibraryVersion"
androidTestCompile "com.android.support:support-v4:$rootProject.supportLibraryVersion"
androidTestCompile "com.android.support:recyclerview-v7:$rootProject.supportLibraryVersion"
androidTestCompile "com.android.support:appcompat-v7:$rootProject.supportLibraryVersion"
androidTestCompile "com.android.support:design:$rootProject.supportLibraryVersion"
}
build.gradle (Module:Project)
ext {
// Sdk and tools
minSdkVersion = 15
targetSdkVersion = 25
compileSdkVersion = 25
buildToolsVersion = '25.0.2'
// App dependencies
supportLibraryVersion = '25.1.0'
guavaVersion = '18.0'
junitVersion = '4.12'
mockitoVersion = '1.10.19'
powerMockito = '1.6.2'
hamcrestVersion = '1.3'
runnerVersion = '0.5'
rulesVersion = '0.5'
espressoVersion = '2.2.2'
}
目录
Android Studio新建项目默认就有了测试目录
可以看到InstrumentedTest的代码写在androidTest目录下
在这里有一个LoginActivity, 现在编写InstrumentedTest代码
LoginActivity.java
这里面就简单来点登录的逻辑做个示范.
点击登录按钮执行下面方法:
private void login() {
String name = mEtName.getText().toString().trim();
String password = mEtPassword.getText().toString().trim();
if (TextUtils.isEmpty(name)) {
mTextInputLayoutName.setError("用户名不能为空!");
} else if (TextUtils.isEmpty(password)) {
mTextInputLayoutPassword.setError("密码不能为空!");
} else {
verifyLogin(name, password);
}
}
private void verifyLogin(final String name, final String password) {
mIdlingResource.setIdleState(false);//阻塞测试线程
final ProgressDialog pd = new ProgressDialog(this);
pd.setTitle("提示: ");
pd.setMessage("登录中, 请稍候...");
new AsyncTask<Void, Void, Void>() {
@Override
protected void onPreExecute() {
super.onPreExecute();
pd.show();
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
pd.dismiss();
if (name.equals("18812345678") && password.equals("123456")) {
Toast.makeText(LoginActivity.this, "登录成功!", Toast.LENGTH_SHORT).show();
startActivity(new Intent(LoginActivity.this, MainActivity.class));
} else {
Toast.makeText(LoginActivity.this, "用户名或密码错误!", Toast.LENGTH_SHORT).show();
}
mIdlingResource.setIdleState(true);//解除阻塞测试线程
}
@Override
protected Void doInBackground(Void... params) {
try {
Thread.sleep(3000);//模拟网络请求
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
}.execute();
}
LoginActivityTest.java
public class LoginActivityTest {
private IdlingResource mIdlingResource;
@Rule
public ActivityTestRule<LoginActivity> mActivityTestRule =
new ActivityTestRule<>(LoginActivity.class);
@Before
public void setUp() throws Exception {
Log.d("LoginActivityTest", "开始测试前");
mIdlingResource = mActivityTestRule.getActivity().getIdlingResource();
Espresso.registerIdlingResources(mIdlingResource);
}
@After
public void tearDown() throws Exception {
Log.d("LoginActivityTest", "测试完成后");
if(mIdlingResource != null)
Espresso.unregisterIdlingResources(mIdlingResource);
}
@Test
public void onCreate() throws Exception {
login("", "12345678");
login("18812345678", "");
login("18812345678", "12345678");
login("18812345678", "123456");
}
private void login(String name, String password) {
ViewInteraction viewInteractionName = onView(withId(R.id.et_name));
viewInteractionName.perform(clearText());//清除输入
viewInteractionName.perform(typeText(name),
closeSoftKeyboard());
ViewInteraction viewInteractionPassword = onView(withId(R.id.et_password));
viewInteractionPassword.perform(clearText());
viewInteractionPassword.perform(typeText(password),
closeSoftKeyboard()); //close the keyboard
onView(withId(R.id.btn_login)).perform(click());//点击登录按钮
}
}
Ctrl + Shift + T可以快速创建测试代码
点击行号右边的绿色小箭头或者右键Run就可以运行测试代码了.