写在开头:Android UI 自动化测试推荐网易的Airtest,也是谷歌推荐的,操作简单,而且基于图像识别根据用户操作界面自动生成Python测试代码
JUnit单元测试
testImplementation 'junit:junit:4.12'
image.png
image.png
使用gradle命令进行单元测试gradle test,还可以通过gradle testDebugUnitTest,或者是gradle testReleaseUnitTest,分别运行 debug 和 release 版本的 unit testing
Espresso
黑盒白盒测试区别如下:黑盒测试:已知产品的功能设计规格,可以进行测试证明每个实现了的功能是否符合要求。白盒测试:已知产品的内部工作过程,可以通过测试证明每种内部操作是否符合设计规格要求,所有内部成分是否以经过检查。
Espresso是官方默认引入的,我们先看一下这个白盒测试工具
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
发个牢骚,看英文文档好费劲,只能用翻译插件一点一点翻译,效率很低,效果还不如看一些相关中文博客,但是毕竟官网全面系统,而且很多技术文档都是英文。希望自己坚持看英文文档,提高英文水平。
当我根据文档书写代码的时候,发现找不到onView方法,双击Shift,发现该方法在Espresso.onView
image.png
然后执行测试报错java.lang.RuntimeException: No activities found. Did you forget to launch the activity by calling getActivity() or startActivitySync or similar?
解决方法
@get:Rule
var mActivityRule = ActivityTestRule(MainActivity::class.java)
简单介绍一下Rule
一个JUnit Rule就是一个实现了TestRule的类,这些类的作用类似于@Before、@After,是用来在每个测试方法的执行前后执行一些代码的一个方法
@RunWith(AndroidJUnit4::class)
class ExampleInstrumentedTest {
@get:Rule
var mActivityRule = ActivityTestRule(MainActivity::class.java)
@Test
fun useA() {
//EditText输入文字
onView(withId(R.id.et)).perform(replaceText("刘德华"))
val btn = onView(withId(R.id.btn))
println("-------------------$btn")
//验证更新按钮是否显示
btn.check(matches(isDisplayed()))
//点击更新按钮
btn.perform(click())
}
}
这里记录一个遇到的问题:输入中文的时候,由于键盘上没有中文,所以要用replaceText而不是typeText,否则会报错误i.e. current IME does not understand how to translate the string into key events). As a workaround, you can use replaceText action to set the text directly in the EditText field.
单页面测试使用Espresso,多页面测试使用 UI Automator
3.UI Automator
测试录屏.gif
参考官方文档
在 Android 应用模块的 build.gradle 文件中,您必须设置对 UI Automator 库的依赖项引用
dependencies {
...
androidTestImplementation 'androidx.test.uiautomator:uiautomator:2.2.0'
}
示例代码
private const val PACKAGE_NAME = "club.guozengjie.jetpack"
private const val LAUNCH_TIMEOUT = 5000L
@RunWith(AndroidJUnit4::class)
@SdkSuppress(minSdkVersion = 18)
class UIAutomatorTest {
private lateinit var device: UiDevice
@Before
fun startMainActivityFromHomeScreen() {
device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
device.pressHome()
// Wait for launcher
val launcherPackage: String = device.launcherPackageName
assertThat(launcherPackage, notNullValue())
device.wait(
Until.hasObject(By.pkg(launcherPackage).depth(0)),
LAUNCH_TIMEOUT
)
// Launch the app
val context = ApplicationProvider.getApplicationContext()
val intent = context.packageManager.getLaunchIntentForPackage(
PACKAGE_NAME
)?.apply {
// Clear out any previous instances
addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
}
context.startActivity(intent)
// Wait for the app to appear
device.wait(
Until.hasObject(By.pkg(PACKAGE_NAME).depth(0)),
LAUNCH_TIMEOUT
)
}
@Test
fun aaa() {
// Type text and then press the button.
device.findObject(
By.res(
PACKAGE_NAME,
"et"
)
).text = "文川雪"
device.findObject(
By.res(
PACKAGE_NAME,
"btn"
)
).click()
device.waitForIdle()
device.findObject(By.res(PACKAGE_NAME, "tv")).click()
}
}
Airtest
Airtest是一款由网易研发并开源的自动化测试框架,官网
官网有详细的文档,这里就不记录了。只想对Airtest说一个字:牛。强烈推荐
SoloPi
SoloPi是一个无线化、非侵入式的Android自动化工具,公测版拥有录制回放、性能测试、一机多控三项主要功能,能为测试开发人员节省宝贵时间。