美文网首页
Android自动化测试

Android自动化测试

作者: EmpathyBasic | 来源:发表于2020-02-28 12:33 被阅读0次

    写在开头: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<Context>()
            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自动化测试

          本文链接:https://www.haomeiwen.com/subject/uihfictx.html