实战自动化测试Espresso和Ui automator(二)

版权声明:本文为博主原创文章,未经博主允许不得转载。

这篇文章,是接着 实战自动化测试Espresso和Ui automator(一)来进行记录的,由于时间的限制,和阅读的习惯,我不喜欢,把一篇文章,写的又臭又长,所以拆成了两部分。

UI automator的测试依赖已经在上篇文章加入了,所以不在贴出了。而测试的目的,也与上一次的Espresso测试的目的是一样的,3个。

UI automator的使用:

1.获取UiDevice实例,模拟对Device的一系列的操作

2.通过uiDevice.findObject方法,创建一个UiObject实例,用来描述如何搜索、选定UI元素

3.写test代码,模拟用户的交互,进行检测判断。

这里写图片描述

这里特别的就是,红框中模拟的一系列的对Device的操作。

这里写图片描述

UiDevice的解释:

UiDevice代表设备状态。在测试时,可以调用UiDevice实例的方法来检查不同属性的状态,如当前的屏幕旋转方向或展示大小。测试代码还能使用UiDevice实例来执行设备级的操作,如强制设备横竖屏,按压d-pad硬件按钮,或按压主屏幕键和菜单键。具体看Api。在文本后面会附上。

实现3个测试目的的测试方法:

    @Test
    public void testChangeText_sameActivity() {
        //点击button的操作,执行输入文本,
        uiDevice.findObject(By.res(APPLICATION_PACKAGE, "main_bt1"))
                .click();
        try {
            uiDevice.sleep();
        } catch (RemoteException e) {
            e.printStackTrace();
        }
        //uiDevice.waitForIdle(6000);//空虚时间6秒

        uiDevice.findObject(By.res(APPLICATION_PACKAGE, "main_edit"))
                .setText("代码输入的额");


        //检测文本的显示内容
        UiObject2 changedMain_EditText = uiDevice.wait  //uidevice.wait 设备等待500毫秒
                (Until.findObject(By.res(APPLICATION_PACKAGE, "main_edit"))//通过Until工具查找到,main_eidt
                        , 2000);
        assertThat(changedMain_EditText.getText(), is("代码输入的额"));


    }
     //多个@Test *******

执行成功

这里写图片描述

执行失败

这里写图片描述

附上官方的Api,他的作用,不用说,上面的wait()方法和Uiobject所提供的方法,都可以查看,不懂上面,有很详细的说明。

https://developer.android.com/training/testing/ui-testing/uiautomator-testing.html#build

以下为该篇文章Ui automator测试的全部代码:

package xiaozhang.testuiautomator;

import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.os.RemoteException;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;
import android.support.test.uiautomator.By;
import android.support.test.uiautomator.UiDevice;
import android.support.test.uiautomator.UiObject2;
import android.support.test.uiautomator.Until;
import android.test.suitebuilder.annotation.LargeTest;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.junit.Assert.assertThat;

/**
 * Created by zhang on 2016/6/4.
 * 使用Ui automator来测试 MainActivity
 *
 */
@RunWith(AndroidJUnit4.class)
@LargeTest
public class UiautomatorMainActivityTest {
    private UiDevice uiDevice;
    private static final int LAUNCH_TIMEOUT = 5000;//运行的时间
    private static final String APPLICATION_PACKAGE
            = "xiaozhang.testuiautomator";
   // @Before代替setUp方法,有多个依次执行   @After 代替tearDown方法   //uiautomatorviewer  自动化界面分析工具
    @Before
    public void startUiautomatorMainActivityHomeScreen() {

        //初始化UiDevice实例
        uiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());

        //从主屏幕
        uiDevice.pressHome();

        //等待运行
        final String launcherPackage = getLauncherPackageName();
        assertThat(launcherPackage, notNullValue());
        uiDevice.wait(Until.hasObject(By.pkg(launcherPackage).depth(0)), LAUNCH_TIMEOUT);

        //启动测试应用
        Context context = InstrumentationRegistry.getContext();//获取上下文
        final Intent intent = context.getPackageManager()
                .getLaunchIntentForPackage("xiaozhang.testuiautomator");
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
        context.startActivity(intent);

        //等待应用程序出现
        uiDevice.wait(//等待5000秒
                Until.hasObject(By.pkg("xiaozhang.testuiautomator")//找到满足条件的包,取第一个
                .depth(0)), LAUNCH_TIMEOUT);


    }




    @Test
    public void testChangeText_sameActivity() {
        //点击button的操作,执行输入文本,
        uiDevice.findObject(By.res(APPLICATION_PACKAGE, "main_bt1"))
                .click();
        try {
            uiDevice.sleep();
        } catch (RemoteException e) {
            e.printStackTrace();
        }
        //uiDevice.waitForIdle(6000);//空虚时间6秒

        uiDevice.findObject(By.res(APPLICATION_PACKAGE, "main_edit"))
                .setText("代码输入的额");


        //检测文本的显示内容
        UiObject2 changedMain_EditText = uiDevice.wait  //uidevice.wait 设备等待500毫秒
                (Until.findObject(By.res(APPLICATION_PACKAGE, "main_edit"))//通过Until工具查找到,main_eidt
                        , 2000);
        assertThat(changedMain_EditText.getText(), is("代码输入的额"));


    }

    @Test //检测测试条件是不是为空
    public void checkPreconditions() {
        assertThat(uiDevice, notNullValue());
    }


    @After
    public void finishUiautomatorMainActivityHomeScreen() {
        uiDevice = null;

    }

    /**
     * 获取运行的包
     *
     * @return
     */
    private String getLauncherPackageName() {
        //创建启动intent
        final Intent intent = new Intent(Intent.ACTION_MAIN);
        intent.addCategory(Intent.CATEGORY_HOME);

        //使用manage获取运行的包名
        PackageManager pm = InstrumentationRegistry.getContext().getPackageManager();
        ResolveInfo resolveInfo = pm.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY);

        return resolveInfo.activityInfo.packageName;
    }

}

测试的主界面:
package xiaozhang.testuiautomator;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

/**
 * Created by zhang on 2016/6/4.
 */
public class UIautomatorMainActivity extends Activity implements View.OnClickListener {
    private Button main_bt1;
    private EditText main_edit;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.act_uiautomator_main_layout);
        main_bt1= (Button) findViewById(R.id.main_bt1);
        main_bt1.setOnClickListener(this);
        main_edit= (EditText) findViewById(R.id.main_edit);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.main_bt1:
                main_edit.setText("这是点击按钮,输入的文字!");

                break;

        }
    }
}

布局文件:
<?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">

    <Button
        android:id="@+id/main_bt1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="测试" />

    <EditText
        android:id="@+id/main_edit"
        android:layout_width="match_parent"
        android:layout_height="300dp"
        android:gravity="start"
        android:hint="内容" />


</LinearLayout>

最后献丑,附上两篇文章的github地址,希望不喜欢的跳过,就算,也是对自己的一种成长吧,记录自己的,做自己的事。另外自己还在研究用Dagger2来模拟测试数据,毕竟这才是学习的重点,希望赶快搞懂它.

地址:https://github.com/zr940326/TestEspressoAndUiautomator

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荣•厚德载物

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值