欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Espresso的入门及使用

程序员文章站 2022-03-03 19:01:44
Espresso的入门及使用什么是Espresso?Espresso API文档使用依赖配置实例展示什么是Espresso?Espresso? 咦?它不是一个咖啡的名字吗?怎么就变成测试的名称了呢?哦~~,原来是这样——设计者的意图是想实现“喝杯咖啡的功夫”就可以等待自动测试完成。它可以实现UI自动化测试。在我们日常生活中的,大家肯定想用代码解决任何事情,能不用手操作就不用手,而利用Espresso可以减轻人手操作,自动为你实现。Espresso API文档使用Espresso 面向认为自动化测试...

什么是Espresso?

Espresso? 咦?它不是一个咖啡的名字吗?怎么就变成测试的名称了呢?
哦~~,原来是这样——设计者的意图是想实现“喝杯咖啡的功夫”就可以等待自动测试完成。它可以实现UI自动化测试。在我们日常生活中的,大家肯定想用代码解决任何事情,能不用手操作就不用手,而利用Espresso可以减轻人手操作,自动为你实现。

Espresso API文档使用

Espresso 面向认为自动化测试是开发生命周期不可或缺的一部分的开发者。虽然 Espresso 可用于黑盒测试,但熟悉被测代码库的人员可以开启它的全部功能。

官方的API文档https://developer.android.google.cn/training/testing/espresso

依赖配置

在 build gradle (Moudle app)的dependencies里添加依赖

    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test:rules:1.0.2'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
    androidTestImplementation "com.android.support.test.espresso:espresso-contrib:3.0.2"
    androidTestImplementation "com.android.support.test.espresso:espresso-idling-resource:3.0.2"
    androidTestImplementation "com.android.support.test.espresso:espresso-intents:3.0.2"

在 build gradle (Moudle app)的defaultConfig里添加依赖

testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

那么恭喜你依赖配置完成咯~~~~~

实例展示

环境配置好了,接下来通过一个实例来讲一下Espresso到底怎么用。我们这次对一个登陆跳转界面进行测试。

Step 1、先创一个LoginActivity。在activity_login.xml文件里

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="账号:">
        </TextView>

        <EditText
            android:id="@+id/et_account"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="请输入账号">
        </EditText>
    </LinearLayout>

    <LinearLayout
        android:layout_marginTop="20dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="密码:">
        </TextView>

        <EditText
            android:id="@+id/et_password"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="请输入密码">
        </EditText>
    </LinearLayout>
    <Button
        android:id="@+id/btn_login"
        android:layout_marginTop="20dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="登录">
    </Button>
</LinearLayout>

在LoginActivity里

package com.example.fourdemo;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class LoginActivity extends AppCompatActivity {
    private EditText et_account;
    private EditText et_password;
    private Button btn_login;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        et_account =findViewById(R.id.et_account);
        et_password =findViewById(R.id.et_password);
        btn_login =findViewById(R.id.btn_login);
        btn_login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                accountLogin();
            }
        });
    }

    private void accountLogin(){
        String account = et_account.getText().toString();
        String password = et_password.getText().toString();
        if (TextUtils.isEmpty(account)) {
            Toast.makeText(this, "用户名为空", Toast.LENGTH_SHORT).show();
            return;
        }
        if (TextUtils.isEmpty(password)) {
            Toast.makeText(this, "密码为空", Toast.LENGTH_SHORT).show();
            return;
        }
        if (password.length() < 6) {
            Toast.makeText(this, "密码长度小于6", Toast.LENGTH_SHORT).show();
            return;
        }
        if(account.equals("admin") && password.equals("123456")){
            Intent intent = new Intent(LoginActivity.this,JumpActivity.class);
            startActivity(intent);
            finish();
        }else {
            Toast.makeText(LoginActivity.this,"账号或密码错误",Toast.LENGTH_SHORT).show();
        }
    }
}

Step 2、创建SecondActivity,用于跳转,为了方便其跳转显示内容,在其对应的xml文件添加一个textview,用于文字显示,这里我就不写啦。

Step 3、在LoginActivity点Go To Test ,不会的可以查看我之前写的博客https://blog.csdn.net/weixin_45552475/article/details/107481416

创建完成,我们就要写测试代码了,我先把代码贴出来,后面再详细讲解。

package com.example.fourdemo;

import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.LargeTest;
import androidx.test.rule.ActivityTestRule;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import static androidx.test.espresso.Espresso.onView;
import static androidx.test.espresso.action.ViewActions.clearText;
import static androidx.test.espresso.action.ViewActions.click;
import static androidx.test.espresso.action.ViewActions.closeSoftKeyboard;
import static androidx.test.espresso.action.ViewActions.typeText;
import static androidx.test.espresso.assertion.ViewAssertions.matches;
import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
import static androidx.test.espresso.matcher.ViewMatchers.withId;
import static androidx.test.espresso.matcher.ViewMatchers.withText;
import static org.junit.Assert.*;

@RunWith(AndroidJUnit4.class)
@LargeTest//允许测试需要较大消耗
public class LoginActivityTest {

    //指定测试的目标Activity页面
    @Rule
    public ActivityTestRule mActivityTestRule = new ActivityTestRule<>(LoginActivity.class);

    @Test
    public void testLogin() {
        //验证是否显示
        onView(withId(R.id.btn_login)).check(matches(isDisplayed()));

        //不输入任何内容,直接点击登录按钮
        onView(withId(R.id.btn_login)).perform(click());
        //onView(allOf(withId(R.id.btn_login), isDisplayed())).perform(click());

        //只输入用户名
        onView(withId(R.id.et_account)).perform(typeText("admin"), closeSoftKeyboard());
        onView(withId(R.id.btn_login)).perform(click());
        onView(withId(R.id.et_account)).perform(clearText());

        //同时输入用户名和密码,但是密码格式不正确
        onView(withId(R.id.et_account)).perform(typeText("admin"));
        onView(withId(R.id.et_password)).perform(typeText("123"), closeSoftKeyboard());
        onView(withId(R.id.btn_login)).perform(click());
        onView(withId(R.id.et_account)).perform(clearText());
        onView(withId(R.id.et_password)).perform(clearText());

        //输入正确的用户名和密码
        onView(withId(R.id.et_account)).perform(typeText("admin"));
        onView(withId(R.id.et_password)).perform(typeText("123456"), closeSoftKeyboard());
        onView(withId(R.id.btn_login)).perform(click());
    }
}
  • 首先@RunWith(AndroidJUnit4.class),意思是基于JUnit 4进行测试的。@LargeTest//允许测试需要较大消耗

  • 在LoginActivityTest 类里面,我们首先肯定要指定测试的目标是哪个activity界面, @Rule public ActivityTestRule mActivityTestRule = new ActivityTestRule<>(LoginActivity.class);

  • 接下来就是定义一个testLogin()的方法用来测试,在方法里面通过id找到btn_login,用onView(withId(R.id.btn_login)).check(matches(isDisplayed()));检测元素是否可见。

  • 在对Edittext进行文本设置的时候,使用 onView(withId(R.id.edit_name)).perform(typeText("admin"), closeSoftKeyboard());,让其自动打出admin,不过这里有一点需要重视一下。如果你想输入中文目前还做不到通过键盘的方式输入(因为Espresso不知道哪些按键可以输出你要的文字),所以中文只能用replaceText的方法:onView(withId(R.id.edit_name)).perform(replaceText("管理"));

  • 然后就是清理Edittext
    onView(withId(R.id.edit_name)).perform(clearText());

  • 接下来编写代码同时输入用户名和密码,但是密码格式不正确、输入正确的用户名和密码。就可以根据自己的要求对其进行测试了。run 一下LoginActivityTest。

  • 运行结果:系统就可以自动打开模拟器,然后根据你自己设置的代码行为,进行测试啦!!!下面过程都是自动的哦,不需要手动。

Espresso的入门及使用

控制台显示为
Espresso的入门及使用

注解:Espresso 由以下三个基础部分组成:

ViewMatchers 在当前View层级去匹配指定的View
ViewActions 执行Views的某些行为
ViewAssertions 检查Views的某些状态

获取View:

  • onView(withId(R.id.my_view))——根据id匹配
  • onView(withText(“Hello World!”))——根据文本匹配

执行View的行为:

  • 点击——onView(…).perform(click());
  • 输入文本——onView(…).perform(typeText(“Hello World”), closeSoftKeyboard());
  • 滑动(使屏幕外的view显示) 点击——onView(…).perform(scrollTo(), click());
  • 清除文本——onView(…).perform(clearText());

检验View内容:

  • 检验View的本文内容是否匹配“Hello World!”——onView(…).check(matches(withText(“Hello World!”)));
  • 检验View的内容是否包含“Hello World!”——onView(…).check(matches(withText(containsString(“Hello World!”))));
  • 检验View是否显示——onView(…).check(matches(isDisplayed()));
  • 检验View是否隐藏——onView(…).check(matches(not(isDisplayed())));

本文地址:https://blog.csdn.net/weixin_45552475/article/details/107529036