Android自动化测试

写在开头:Android UI 自动化测试推荐网易的Airtest,也是谷歌推荐的,操作简单,而且基于图像识别根据用户操作界面自动生成Python测试代码

JUnit单元测试

参考https://www.jianshu.com/p/c8ac3976bda2

 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'

官方文档 https://developer.android.google.cn/training/testing/espresso
https://blog.csdn.net/lyabc123456/article/details/89875578

发个牢骚,看英文文档好费劲,只能用翻译插件一点一点翻译,效率很低,效果还不如看一些相关中文博客,但是毕竟官网全面系统,而且很多技术文档都是英文。希望自己坚持看英文文档,提高英文水平。

当我根据文档书写代码的时候,发现找不到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自动化工具,公测版拥有录制回放、性能测试、一机多控三项主要功能,能为测试开发人员节省宝贵时间。

https://github.com/alipay/SoloPi

你可能感兴趣的:(Android自动化测试)