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

转载请标明出处:https://blog.csdn.net/u013254166/article/details/80619299
本文出自: 【rhino博客】

一、概述:

上一篇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下载地址

点击下载

猜你喜欢

转载自blog.csdn.net/u013254166/article/details/80619299
今日推荐