版权声明:本文为博主原创文章,未经博主允许不得转载。
作为项目的3.0,必须要求加入自动化测试,而自己又有意来学习,单元测试。所以才有了这篇总结的文章,实战自动化测试。感觉这东西是慢慢领悟的,我也只是记录,自己尝试的一点心得,方便以后自己的查阅。
在安卓studio中,支持的测试库,主要有下面的常用3类。
我看得主要是后面两类,内部测试(Espresso)和跨应用的测试(Ui automator)。
以下是他们在安卓studio中的依赖:
1. 在build.gradle(Module.app) dependencies {*} 中添加
defaultConfig {
applicationId "xiaozhang.testuiautomator"
minSdkVersion 19
targetSdkVersion 23
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" //必须添加的
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.3.0'
//测试
androidTestCompile 'com.android.support:support-annotations:23.3.0'
androidTestCompile 'com.android.support.test:runner:0.4.1'
androidTestCompile 'com.android.support.test:rules:0.4.1'
androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.1'//跨界测试
androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.1'//内部测试
}
2.在build.gradle(Project) dependencies{*} 中添加apt
dependencies {
………………
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' //必须添加的
}
在添加依赖后,我们先来看一看单元测试的概念
单元测试的概念,就是验证代码正确的另一段代码。
所以不管我们用的哪一种工具,都只是在编写代码来判断与验证我们的代码的正确性,而这也是单元测试的目的。
每一个测试类,都会经历这样一个流程:从开始到结束
而在自动化测试中,现在不用setUp和tearDown与test的方法开头了,但是大致的流程都不会变。
好了现在我们,正式开始!
我现在的目的是,1.通过代码摸牛点击测试按钮,看我们的显示代码会不会正常的,在文本框上显示我设置的文本。
public void onClick(View v) {
switch (v.getId()) {
case R.id.main_bt1:
main_edit.setText("这是点击按钮,输入的文字!");
break;
}
2.对EdiText执行模拟的输入文本操作。 3.代码检测控件是不是正确显示了我操作的,文本内容
Espresso的使用:
1.找元素。 2.操作元素 3.检查结果
执行成功
执行失败
附上,官方使用的api,可以查阅像withId()这样的方法说明。
https://developer.android.com/reference/android/support/test/espresso/Espresso.html
以下为该篇文章Espresso的全部代码:
package xiaozhang.testuiautomator;
import android.support.test.rule.ActivityTestRule;
import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.LargeTest;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import static android.support.test.espresso.Espresso.onView;
import static android.support.test.espresso.action.ViewActions.click;
import static android.support.test.espresso.action.ViewActions.closeSoftKeyboard;
import static android.support.test.espresso.action.ViewActions.replaceText;
import static android.support.test.espresso.assertion.ViewAssertions.matches;
import static android.support.test.espresso.matcher.ViewMatchers.withId;
import static android.support.test.espresso.matcher.ViewMatchers.withText;
/**
* Created by zhang on 2016/6/4.
* 使用Espresson测试 MainActivity
*/
@RunWith(AndroidJUnit4.class)
@LargeTest
public class EspressoMainActivityTest {
//为MainActivity提供依赖
@Rule
public ActivityTestRule<UIautomatorMainActivity> mMainActivityRule = new ActivityTestRule<UIautomatorMainActivity>(
UIautomatorMainActivity.class);
//进行测试
@Test
public void changeText_sameActvity(){
//@点击button的操作,%执行输入文本,
//@
onView(withId(R.id.main_bt1)).
//1.onView()找元素 { withId()按id查询 WithText()按显示内容查询 }
perform(click());
//2.perform() 操作元素 {click() 点击, replaceText(text)替换文本, closeSoftKeyboard()关闭软键盘}
//%
onView(withId(R.id.main_edit)).
perform(replaceText("代码输入的"),closeSoftKeyboard()); //typeText()输入文本
//!检测文本的显示内容
//!
onView(withId(R.id.main_edit)).//check()检测结果
check(matches(withText("代码输入的")));
}
//多个@Test *******
}
测试主界面:
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>