版权声明:本文为博主原创文章,未经博主允许不得转载。
这篇文章,是接着 实战自动化测试Espresso和Ui automator(一)来进行记录的,由于时间的限制,和阅读的习惯,我不喜欢,把一篇文章,写的又臭又长,所以拆成了两部分。
UI automator的测试依赖已经在上篇文章加入了,所以不在贴出了。而测试的目的,也与上一次的Espresso测试的目的是一样的,3个。
UI automator的使用:
1.获取UiDevice实例,模拟对Device的一系列的操作
2.通过uiDevice.findObject方法,创建一个UiObject实例,用来描述如何搜索、选定UI元素
3.写test代码,模拟用户的交互,进行检测判断。
![这里写图片描述](https://img-blog.csdn.net/20160604230008131)
这里特别的就是,红框中模拟的一系列的对Device的操作。
![这里写图片描述](https://img-blog.csdn.net/20160604230652240)
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)
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 *******
执行成功
![这里写图片描述](https://img-blog.csdn.net/20160604231634144)
执行失败
![这里写图片描述](https://img-blog.csdn.net/20160604231704910)
附上官方的Api,他的作用,不用说,上面的wait()方法和Uiobject所提供的方法,都可以查看,不懂上面,有很详细的说明。
以下为该篇文章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
@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)
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
}
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
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来模拟测试数据,毕竟这才是学习的重点,希望赶快搞懂它.