Android Studio中的单元测试(二)Android测试

一、概述:

上一篇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();
        }
    }
}

测试的目的是连续输入预设的工程名称,观察打印结果。运行打印结果如下:

可以看到,预设输入和我们预期的执行结果一致。

五、DEMO下载地址

点击下载

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值