IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android 仪器化单元测试(instrumented unit tests) Androidx kotlin版本 -> 正文阅读

[移动开发]Android 仪器化单元测试(instrumented unit tests) Androidx kotlin版本

前言

近期需要进行单元测试,测试内容需要真机环境,所以需要使用instrumented unit tests,用来在跑在真机上进行测试。

blog用于记录。

简介

仪器化单元测试(instrumented unit tests)是在物理设备和模拟器上运行的测试,它们可以利用 Android 框架 API 和支持 API,例如 AndroidX API 、Android framework API 、Android supporting API 等。 仪器化测试比本地单元测试提供更高的保真度,但运行速度要慢得多。

环境配置

  • 如果工程src目录下不存在androidTest/java目录,则需要进行创建该目录,创建步骤如下图所示:
    在这里插入图片描述

?

  • 配置build.gradle依赖

    dependencies {
        androidTestImplementation 'androidx.test:runner:1.4.0'
        androidTestImplementation 'androidx.test:rules:1.4.0'
    }
    
    android {
        defaultConfig {
            testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        }
    }
    

测试样例

测试代码

本例子参考google官方网站。因为官网里面很多类没有给到,所以进行了一波补充完善。????????点击可前往官网

以下示例显示了如何编写仪器单元测试来验证 Parcelable接口是否被 LogHistory类正确实现:🙆?♀?

import android.os.Parcel
import android.os.Parcelable
import android.os.Parcelable.Creator
import androidx.test.runner.AndroidJUnit4
import org.junit.Assert
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith

const val TEST_STRING = "This is a string"
const val TEST_LONG = 12345678L

// @RunWith is required only if you use a mix of JUnit3 and JUnit4.
@RunWith(AndroidJUnit4::class)
class LogHistoryAndroidUnitTest {
    private lateinit var logHistory: LogHistory

    @Before
    fun createLogHistory() {
        logHistory = LogHistory(TEST_STRING, TEST_LONG)
    }

    @Test
    fun logHistory_ParcelableWriteRead() {
        val parcel = Parcel.obtain()
        logHistory.apply {
            // 写数据
            writeToParcel(parcel, describeContents())
        }

        // 完成写入后,置包裹以进行读取。
        parcel.setDataPosition(0)

        // 读取数据
        val createdFromParcel: LogHistory = LogHistory.CREATOR.createFromParcel(parcel)
        // 验证数据的正确性
        Assert.assertTrue("error TEST_STRING", createdFromParcel.strValue == TEST_STRING)
        Assert.assertTrue("error TEST_LONG", createdFromParcel.longValue == TEST_LONG)
    }
}

class LogHistory(val strValue: String = "", val longValue: Long = 0L) : Parcelable {
    constructor(source: Parcel) : this(source.readString() ?: "", source.readLong())

    companion object {
        val CREATOR: Creator<LogHistory> = object : Creator<LogHistory> {
            override fun createFromParcel(source: Parcel?): LogHistory = LogHistory(source!!)

            override fun newArray(size: Int): Array<LogHistory> = Array(size) { LogHistory() }
        }
    }

    override fun describeContents(): Int = 0

    override fun writeToParcel(dest: Parcel?, flags: Int) {
        dest!!.writeString(strValue)
        dest.writeLong(longValue)
    }
}

运行

  1. 确保已经链接手机
  2. 点击下图2所示的箭头
  3. 点击run在真机上运行

结果

? 通过测试结果可以清晰看到状态passed,代表测试成功。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2jjQOJw0-1639124297064)(E:\Documentation\My_Learn_Documentation_Git\android\pic_android\run_result.png)]

? 那如果把Assert.assertTrue("error TEST_LONG", createdFromParcel.longValue == TEST_LONG)改为Assert.assertTrue("error TEST_LONG", createdFromParcel.longValue == 0L呢?
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mltP6P50-1639124297064)(E:\Documentation\My_Learn_Documentation_Git\android\pic_android\run_error.png)]

? 可以看到巨大的failed,还可以点开错误日志,看到报错的信息!!!

一键测试所有

以上的测试只能一个一个的点,如果我写好了一堆单元测试,想要一键测试,应该怎么做呢?😮

引入

下面引入@Suite.SuiteClasses

  • 将需要进行一键测试类上方增加@Suite.SuiteClasses注解
  • 新建类的入口,引入需要一键执行的类,并且需要新增@RunWith(Suite::class)与@Suite.SuiteClasses(Class...)注解

举个🌰

  • 我们有两个类都写了单元测试,如下所示:

    @RunWith(AndroidJUnit4::class)
    @Suite.SuiteClasses
    class CalculatorInstrumentationTest {
        @Test
        fun test() {
            Log.i("CalculatorTest", "CalculatorInstrumentationTest")
        }
    }
    @RunWith(AndroidJUnit4::class)
    @Suite.SuiteClasses
    class CalculatorAddParameterizedTest {
        @Test
        fun test(){
            Log.i("CalculatorTest","CalculatorAddParameterizedTest")
        }
    }
    

    需要在这些类上面新增@Suite.SuiteClasses注解

  • 写测试入口

    @RunWith(Suite::class)
    @Suite.SuiteClasses(
        CalculatorInstrumentationTest::class,
        CalculatorAddParameterizedTest::class
    )
    class UnitTestSuite
    

    注意:此时@RunWith里面的值是Suite::class,使用@Suite.SuiteClasses注解将需要一起执行的类,加入进来即可。

    此时在AS里面class UnitTestSuite对应的左侧会存在执行的按钮,点击执行即可。

结果

此时查看结果,如下所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QGtwU0nE-1639124297065)(E:\Documentation\My_Learn_Documentation_Git\android\pic_android\all_run_result.png)]

可以看到,我们在两个类的两个测试方法均进行了执行,且是passed状态!!!🦾

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-12-11 15:50:25  更:2021-12-11 15:52:28 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 7:53:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码