Android Espresso UI测试

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就可以运行测试代码了.

这里写图片描述
这里写图片描述

运行效果

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值