Android 单元测试,从小白到入门开始

Android 仪器化单元测试(instrumented unit tests) Androidx kotlin版本 android仪器化单元测试全面详解,全新kotlin androidx版本。 快速上手不迷路。 阅读详情
AI摘要

本文旨在帮助Android开发者从零开始了解和实践单元测试,涵盖测试金字塔、为什么要写单测、何时写UI测试、单测与重构的关系、TDD概念、单测框架的选择(如JUnit、Mockito、Robolectric)以及如何开始编写单测代码。同时,介绍了如何设计测试用例、统计覆盖率的方法,并提供了具体的测试代码示例。通过本文,开发者可以掌握单测的基础知识和实施步骤,提升代码质量。

目录

1 引言

1.1  背景

1.2 术语和缩略语

2 闲谈单测

2.1 说说我理解的单测

2.1.1 对测试金字塔的理解

2.1.2 为什么要做单测?

2.1.3 需要写 UI 测试吗?

2.1.4 单测与重构

2.1.5 TDD

2.1.6 单测写在哪?

2.1.7 单测三段式

2.1.8 一个简单的测试例子

2.2 单测针对于哪些代码进行 

2.3 测试用例该如何设计

2.3.1 确保原因与影响清晰

 2.3.2 只验证有状态变化的函数调用

2.3.3 测试函数名应该有描述性

2.4 单测框架

3 如何开始单测?

3.1 项目中引入单测框架

3.2 参考单测模板代码和优秀文章

Mockito使用

Robolectric使用

单测介绍

3.3 编写单测代码

3.4 单元测试代码分析

4 如何统计覆盖率?

4.1 统计覆盖率

4.2 覆盖率统计 AS 中以及导出 HTML 文件的差异

5 总结

6 参考


1 引言

1.1  背景

        随着 Android 应用越来越壮大,对应代码量显著增加,代码逻辑也日趋复杂,此时需要采取一定的行动去保证代码质量,减少逻辑漏洞等,于是严格地执行单元测试编写任务,将单元测试落实到平常开发和维护任务当中去,就是很重要的一环,不可忽视。

        然而,很多应用开发者之前并未编写过单元测试代码,那么如果有一篇通俗易懂并带有操作步骤的文章,能帮助应用开发者完成从单元测试小白到入门的过渡,就再好不过了,于是本文就是在此情况写就的,如有不好之处,请多多包涵,谢谢。

1.2 术语和缩略语

缩略语/术语

全 称

说 明

Module模块本文指 Android Studio 项目中包涵的多个模块其中之一
TDDTest-Driven Development测试驱动开发,在开发功能代码之前,先编写单元测试用例代码,测试代码确定需要编写什么产品代码。
单测Android Unit Test本文为了行文方便,使用单测表示 Android 单元测试。
测开Test Development Engineer测试开发工程师,本文主要指进行白盒测试的测开。

2 闲谈单测

2.1 说说我理解的单测

2.1.1 对测试金字塔的理解

        本文所指的单测,是金字塔最底层占70%的小型测试(单测) Unit tests,不包括最顶层占10%的大型测试(UI 测试) UI Tests,对于中间层20%的集成测试(集测),需看情况去做。

        另外,集成测试更多是指验证一整个执行流程,而单测验证某个行为或逻辑,可以这么理解:集成测试验证执行流程时,会走单测验证过的某个行为或逻辑,即:单测可能是集成测试的一部分(不完全正确,但可以这么理解)。

        比如,Android 中需要在 Activity 显示一张网络图片,单测需验证网络请求图片是否成功,集测需验证从打开 Activity 到显示图片这一过程是否都按预期在执行,UI 测试验证 Activity 显示的图片是否如预期一样。

2.1.2 为什么要做单测?

        除了引言中背景提到的单测必要性之外,还有如下2点理由。

(1)一种代码验证,提高对代码的自信度

        当我们对类函数代码做了修改或者重构,只需要再跑一遍单元测试

        如果通过,说明我们的修改不会对函数原有的行为造成影响

        如果测试不通过,说明我们的修改与原有行为不一致,要么修改代码,要么修改测试。

(2)驱动代码重构设计,代码重构质量的验证

        刚开始,已有的代码可能基本没有办法写单测,会形成重构驱动,重构的过程会让代码逐渐具备良好的可测性

        如果可以针对代码方便快速地,在无需做任何配置工作的情况下,编写一系列互相独立且稳定运行的测试,那么该代码就具备了可测性

        具备可测性的代码必然是经过了良好设计的,形成可测性代码的过程,也就是编码技能提升的过程。

2.1.3 需要写 UI 测试吗?

        Android 应用从广义来说,属于大前端,也就意味着 UI 变动会很频繁。且对于 UI 问题,应用开发者是很容易就能发现的,一般也比较容易解决。那么,针对 UI 进行测试其实是需要的,但没那么必要,可以不用写 UI 测试。

        不用写 UI 测试,除了上述提到的 2 个理由,另外还有这 2 个理由:Espresso 单测比较简单;测开会做 UI 测试。将重心放在单测上才是王道。

2.1.4 单测与重构

        在没有进行合理的代码解耦前,就马上的进行单测编写,最终导致的有可能是编写不下去、用例难以维护、阅读性差等。

        根本的原因其实是代码的耦合度过高,功能类与协作类之间是强引用关系(这里是指架构设计上的说法,非内存引用),当需要模拟协作类的一些返回结果来进行测试时,无法替换或者模拟(Mock)。层级间、功能类间以接口的形式访问是一个较优的单测方式。     

        没写过单测的童鞋可能不知道,其实重构也是单测的一部分,切记不要在本就不优雅的代码上写单测,请先重构。单测为代码质量保驾护航,重构提升代码质量和自我编程能力。

2.1.5 TDD

        项目如果走的敏捷开发,会涉及到测试驱动开发这一设计方法论,但说实话,在写代码前先写好测试代码,这对开发者能力要求很高,且目前国内开发环境其实对这块的理解并不如理想之见,暂无需考虑。

2.1.6 单测写在哪?

        首先,我们暂不写 UI 测试,只做单测,那么只需要在 src/test/java/包名/ 下写即可,一般来说可以不用在 src/androidTest/java/包名/ 下写单测代码。

        其次,针对于 Android 应用,你可以在每个 Module 下都为其编写单测代码,然后统计各个 Module 的覆盖率,最后求一个平均覆盖率,即为整个应用的覆盖率。但,我们知道这其实是比较麻烦的,每次统计时都需要去计算每个 Module 的覆盖率然后求平均,当然如果用 jacoco 可以优雅自动统计的话就另当别论。

        所以,为了方便统计单测覆盖率,本文暂推荐在指定 Module 的 src/test/java/包名/ 下写所有 Module 的单测代码,这个指定 Module 可以是 app 模块,也可以是新建的专为写单测的 unit_test 模块。

2.1.7 单测三段式

        经典的单测三段式:模拟前提、执行语句、断言结果。有时会把这三者的部分或全部合在一起,如:Assert.assertEquals(4, 2+2),就把三者融合在一起。

2.1.8 一个简单的测试例子

        我们代码中经常会有日期工具类,下面是对有效日期判断的方法进行的测试例子。

(1)有效日期判断的源码

object DateUtils {
    fun getValidDate(milliseconds: Long): Long {
        var validDate = milliseconds
        val timeInMillis = Calendar.getInstance(Locale.US).timeInMillis
        if (milliseconds <= 0L || milliseconds > timeInMillis) {
            validDate = timeInMillis
        }
        return validDate
    }
}

(2)测试代码

@Test
fun testGetValidData() {
    // 1、模拟前提
    val currentTimeMillis1 = System.currentTimeMillis()
    // 2、执行语句
    val validDate1 = DateUtils.getValidDate(-1)
    // 3、断言结果
    Assert.assertTrue(validDate1 in (currentTimeMillis1 - 1000)..(currentTimeMillis1 + 1000))

    val currentTimeMillis2 = System.currentTimeMillis()
    val validDate2 = DateUtils.getValidDate(0)
    Assert.assertTrue(validDate2 in (currentTimeMillis2 - 1000)..(currentTimeMillis2 + 1000))

    val currentTimeMillis3 = System.currentTimeMillis()
    val validDate3 = DateUtils.getValidDate(currentTimeMillis3 + 100000)
    Assert.assertTrue(validDate3 in (currentTimeMillis3 - 1000)..(currentTimeMillis3 + 1000))

    val milliseconds4 = System.currentTimeMillis() - 100000
    val validDate4 = DateUtils.getValidDate(milliseconds4)
    Assert.assertEquals(milliseconds4, validDate4)
}

2.2 单测针对于哪些代码进行 

        单测是指对软件中的最小可测试单元进行检查和验证,要以类功能作为测试目标的单个或者一连串的函数测试,也就是说,单测可以是对某个类的具体函数的功能、内部逻辑进行验证。

        而针对代码复杂性和依赖性,有如下图的原则描述可参考:

  • 复杂依赖少:适合写单测
  • 复杂依赖多:重构减少依赖,变成复杂依赖少,然后写单测
  • 简单依赖少:看情况写
  • 简单依赖多:不用重构,不用单测

       这里对代码简单依赖多的情况多提一嘴,对它们写单测意义并不大,不要为了提高单测覆盖率,而花费很多时间和精力去写单测,这样得不偿失。

2.3 测试用例该如何设计

2.3.1 确保原因与影响清晰

        模拟前提条件和测试断言之间相隔了200行,这很难知道这断言是否正确,可读性差

         确保模拟前提与验证结果相近,查看问题时能快速定位

 2.3.2 只验证有状态变化的函数调用

        对函数执行过程中验证不带来状态发生改变的函数是无意义的,例如isUserActive、getPermission、isVAlidPermission等都是对程序没有发生状态变化的,

        验证是否这类函数是否执行,只会增加后续代码修改带来的不稳定。

        正确应该只验证addPermission是否执行 

2.3.3 测试函数名应该有描述性

        测试函数名应该具备可直接理解该测试用例的意图和验证结果,如下这种写法,很难让人知道测试目的是为了验证三次输入错误。

        正确应该命名为:should_LockOutUser_when_ThreeInvalidLoginAttempts 

        should_期望结果_when_测试场景。确保测试用例名字中包括被测试的场景和期望的输出。

2.4 单测框架

    Junit4 + Mockito(powerMock)+ robolectric

    简单单测 + 模拟难以实例化的类 + 实现 Android 框架(更多内容请参考相应框架学习)

3 如何开始单测?

3.1 项目中引入单测框架

        单测依赖介绍如下:

// JUnit4:本地单元测试
    'junit:junit:4.13.2',
    'androidx.test:core:1.4.0',
// Robolectric:本地单元测试依赖 Android 框架
    'org.robolectric:robolectric:4.4',
// Mockito:本地单元测试模拟框架
    "org.mockito:mockito-core:3.12.4",
// mock final类时出现错误:Mockito cannot mock/spy because : - final class,增加如下模拟框架
    'org.mockito:mockito-inline:3.12.4',
// PowerMock:Mockito的一种扩展(以实现完成对private/static/final方法的Mock)
    'org.powermock:powermock-module-junit4:2.0.9',
    'org.powermock:powermock-api-mockito2:2.0.9'

        比如在 app Module 的 build.gradle 的 dependencies 下,依赖 JUnit4 如下:testImplementation 'junit:junit:4.13.2'

        UI 测试暂不做,但为了区分依赖,也罗列如下:

// AndroidJUnitRunner and JUnit Rules:插桩单元测试
    'androidx.test:runner:1.4.0',
    'androidx.test:rules:1.4.0',
// runner 和 rules 的扩展包:@RunWith(AndroidJUnit4.class) 在此扩展包的 runners 下
    'androidx.test.ext:junit:1.1.3',
// Espresso:Android 界面测试
    'androidx.test.espresso:espresso-core:3.4.0'

        依赖 espresso 如下:androidTestImplementation ‘androidx.test.espresso:espresso-core:3.4.0'

        UI 测试时需在defaultConfig中添加:testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

defaultConfig {
    testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}

        UI 测试覆盖率统计开关打开:testCoverageEnabled true

android {
    buildTypes {
        debug {
            testCoverageEnabled true
        }
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

        单测可以访问编译版本的资源:includeAndroidResources = true

android {
    testOptions {
        unitTests {
            includeAndroidResources = true
        }
    }
}

3.2 参考单测模板代码和优秀文章

Mockito使用

        Mockito是一套模拟框架,允许模拟公有、非静态类的公有函数,提供函数返回模拟、函数调用验证、参数匹配等功能。

Mockito的使用 - 简书

Robolectric使用

Robolectric使用教程 - HansChen - 博客园

Android单元测试之Robolectric - 简书

Android单元测试框架Robolectric的学习使用_川峰的博客-优快云博客_robolectric

单测介绍

https://segmentfault.com/a/1190000006811141

Android单元测试只看这一篇就够了 - 简书

3.3 编写单测代码

        其实编写单测和写代码是一样的,只是使用不同工具完成功能或测试。具体操作的话,在 app/src/test/java/包名/ 下创建和代码一样的包结构,然后新建测试文件,编写单测代码即可。有如下注意事项:

  • 测试文件命名:一般是文件名加上Test后缀,比如针对 TimeUtils.kt 这个文件测试,那么测试文件可命名为TimeUtilsTest。
  • 测试文件存放路径:细心的童鞋应该看到了,上一条的 TimeUtils.kt 这个文件是 kotlin 语言编写的,那么测试文件应该放在与 kotlin 相关的目录下,简单来说就是在包名和包结构中添加一层 kotlin 文件夹,即:app/src/test/java/包名/kotlin/ 。为保持统一测试代码也建议用 kotlin 书写。
  • 测试方法命名:期望输出_测试场景,如 fiveMethodsShouldBeInvoked_WhenInitData

3.4 单元测试代码分析

        为了给应用开发者一个直观的印象,这里还是决定贴出一份单测代码,如有不足之处,还请海涵:

@Config(shadows = [ShadowLog::class, MockCA::class, MockDoExerciseApi::class, MockPortalApi::class], sdk = [23], application = BaseTestApplication::class)
class ProfilePresenterTest : BaseTestRobolectricClass() {
 
    @Spy
    lateinit var v: ProfileContract.V
 
    lateinit var p: ProfilePresenter
 
    @Before
    fun setUp() {
        MockitoAnnotations.openMocks(this)
        p = spy(ProfilePresenter::class.java)
        p.attachToView(v)
    }
 
    /**
     * 命名规则:期望输出_测试场景
     */
    @Test
    fun fiveMethodsShouldBeInvoked_WhenInitData() {
        p.initData()
        verify(v).updateWeight("")
        verify(v, never()).finishActivity()
        verify(v, atLeastOnce()).updateHeight("")
        verify(v, atLeast(1)).updateExerciseGoal("")
        verify(v, times(1)).updateExerciseFrequency("")
        verify(v, atMost(1)).updateExerciseTime("")
        // 检查是否所有的用例都涵盖了,如果没有将测试失败。放在所有的测试后面
        verifyNoMoreInteractions(v)
    }
 
    @Test
    fun finishActivityMethodShouldBeInvoked_WhenResetUserInfo() {
        PrivateAccessor.invoke<ProfilePresenter>(p, "resetUserInfo")
        verify(v).finishActivity()
    }
 
    companion object {
        private val TAG = ProfilePresenterTest::class.java.simpleName
    }
 
}
  1. 第一行的 @Config 部分可参考 Robolectric 框架
  2. 第二行继承了 BaseTestRobolectricClass 文件,它是作为单测代码的基类,稍后贴出源码
  3. @Spy 与 Mockito.spy() 方法相同,只是一个使用注解方便些
  4. fiveMethodsShouldBeInvoked_WhenInitData 为测试方法,verify 验证 initData 方法执行后,有5个方法会执行一次,never() 与 times() 等都是限定验证时方法的调用次数的
  5. 最后一个方法用到了 PrivateAccessor 类,它可以通过反射的方式支持验证私有方法和属性。

BaseTestRobolectricClass 源码参考:

@RunWith(RobolectricTestRunner::class)
@Config(shadows = [ShadowLog::class], sdk = [23], application = BaseTestApplication::class)
abstract class BaseTestRobolectricClass {
 
    protected val mContext: Context = ApplicationProvider.getApplicationContext()
 
    companion object {
        @JvmStatic
        protected val TAG: String = this::class.java.simpleName
 
        @BeforeClass
        @JvmStatic
        fun setup() {
            ShadowLog.stream = System.out
        }
    }
 
}

4 如何统计覆盖率?

4.1 统计覆盖率

        在 src/test/java 上右键选择如图 Run...,会跑整体单测代码。跑完后还会在写过单测代码的文件后显示单测覆盖率。也可导出覆盖率为 HTML 文件,但不比 AS 准确。

 

 

4.2 覆盖率统计 AS 中以及导出 HTML 文件的差异

        现象:AS中总代码行高于生成的HTML文件,所以显示的代码行覆盖率低于生成的HTML文件

        原因:见截图。可知,HTML文件代码行中,并未包含activity、fragment和view相关的代码行(不知道是因为没写UI测试导致的,或是AS导HTML时导致的)

        解决:目前开发时,以AS为准。

5 总结

        一般来说,单测初级阶段,在统计出覆盖率后,行覆盖率达到25%或更高指标时,就算差不多了。但写单测的路也不应就此停下,在维护代码过程中会涉及对单测的修改;在后面新增功能代码时也需新增单测代码。

        好了,本文到此也差不多该收尾了,希望能给单测小白一些收获或感悟,文后还附上了官方文档供参考。

6 参考

        【1】Google官方测试文档:https://developer.android.com/training/testing/fundamentals

        【2】Mockito官方文档:Mockito (Mockito 3.5.10 API)

        【3】Robolectric官方文档:Robolectric

Android单元测试学习之 Junit4,基于android的天气预报app开发 2. Junit4 =========================================================================== 2.1 什么是Junit4 Junit4是事实上的Java标准测试库,并且它是JUnit框架有史以来的最大改进,其主要目标便是利用Java5的Annotation特性简化测试用例的编写。这也说明想要使用Jnit4,得有JDK1.5以上 也就是说 Junit4是使用注解来完成测试的。 Android Studio已经自动依赖了Junit4 阅读详情

相关推荐

安卓单元测试全攻略

安卓单元测试,只看这一篇就足够啦。真正的完全解析,真正的从0到1,Junit结合Mockito与Robolectric实现从M层到V层,Jacoco扫描函数、逻辑、代码行数单元测试覆盖率100%的全面测试。你是否还在为了验证联网与未联网状态而频繁的开关WiFi开关?或者你是否还在为一个switch判断而频繁的使用debug断点setValue来观测代码的逻辑判断情况?又或者你是否还在为了校验某个UI

github_37279124的博客 663

Android单元测试全解

  自动化测试麻烦吗?说实在,麻烦!有一定的学习成本。但是,自动化测试能节省时间来打游戏!!

to_perfect的博客 1万+

Android编程单元测试实例详解(附源码)

主要介绍了Android编程单元测试,结合完整实例形式详细分析了Android单元测试的具体步骤与相关技巧,并附带完整实例代码供读者下载参考,需要的朋友可以参考下

安卓项目如何做单元测试

本文介绍: 1.安卓单元测试的基本介绍; 2.简单的单元测试例子; 3.如何基于现有项目做单元测试; 4.项目常见问题以及如何解决

分享+记录 4346

Verilog单周期CPU设计(超详细)

实验 单周期CPU一、设计目的与目标实验内容实验要求二、课程设计器材硬件平台软件平台三、 CPU逻辑设计总体方案指令模块MIPS指令格式指令处理流程数据通路总体结构图设计流程逻辑图四、模块详细设计PCAdd4PCINSTMEMDATAMEMSHIFTER32_L2SHIFTER_COMBINATIONMUX4X32MUX2X5EXT16T32MUX2X32CONUNITREGFILEALUSing...

Ace Cheney的博客 9万+

手把手教你用QEMU虚拟化华为路由器固件(附完整网络配置指南)

本文提供了一份详尽的QEMU虚拟化华为路由器固件的实战指南。从固件解包、网络桥接配置到QEMU虚拟机启动,手把手教你搭建完整的嵌入式设备沙箱环境,特别适合安全研究、逆向分析和学习嵌入式系统工作原理。

tgb3456789的博客 937

Android单元测试

概述 新建一个module的时候,Android Studio 自动帮我们生成了 test 和 androidTest 两个 sourceSet。这两个 sourceSet 对应了不同的单元测试类型,同时两个 sourceSet 声明依赖的命令也有区别,前者是 testImplementation 后者是 androidTestImplementation。 app/src ├── androidTestjava (仪器化单元测试、UI测试) ├── main/java (业务代码)

sl851938874的博客 1万+

西电2023秋季机器学习复习提纲

西电2023秋季机器学习复习提纲,希望对学弟学妹有帮助

weixin_62083045的博客 5679

安卓单元测试

CheckoutModel的loadCheckoutData单元测试2:mock Api类,指定当它的get方法在收到某些调用的时候,直接调用传入的callback的onSuccess方法,然后调用CheckoutModel的loadCheckoutData()方法,验证Otto bus的post方法得到了调用,并且参数是对的。当网络请求返回以后,更新用户界面。然而我觉得,除了这方面的作用,单元测试还能在非常大的程度上改善代码的设计,同时还能节约时间,让人工作起来更有信心、更开心,以及其他的一些好处。

qq_54431641的博客 550

从淬火实验到仿真验证:用ANSYS APDL复现钢球冷却温度变化(含动画生成教程)

本文详细介绍了如何利用ANSYS APDL进行淬火过程的瞬态热分析仿真,以复现钢球冷却温度变化。内容涵盖从实验数据校准材料参数、构建高保真模型、设置非线性瞬态求解,到提取节点温度曲线和生成温度云图动画的全流程。通过APDL命令流实现自动化,为工程研发和学术研究提供高效、可靠的仿真验证方法。

pz8901234的博客 791

obisidian插件之【templater】模板的中文说明书

Templater 是一种模板语言,可让您将变量和函数结果插入到笔记中。它还允许您执行操作这些变量和函数的 JavaScript 代码。使用 Templater,您将能够创建强大的模板来自动执行手动任务。

m0_55795604的博客 1万+

如何从零开始Android单元测试:基于awesome-android-testing的实战指南

想要构建高质量的Android应用?单元测试是确保代码质量和应用稳定性的关键!本文将为你提供一份完整的Android单元测试实战指南,基于awesome-android-testing项目中的精选工具库,帮助你从零开始掌握Android测试技能。无论你是初学者还是有经验的开发者,都能找到适合自己的测试方案。 ## 🚀 Android单元测试的重要性 单元测试是Android开发中不可或缺的一

gitblog_00596的博客 1125

AI系统架构原理与代码实战案例讲解

人工智能的概念可以追溯到上世纪50年代,图灵测试的提出标志着人工智能作为一门学科的诞生。早期的研究主要集中在符号推理、专家系统等领域,取得了一些突破,例如机器定理证明、西洋跳棋程序等。上世纪80年代,随着专家系统的兴起,人工智能进入了一个黄金时期。专家系统通过模拟人类专家的知识和经验进行推理和决策,在医疗诊断、故障诊断等领域取得了成功应用。进入90年代,由于计算能力的限制和数据量的不足,人工智能的发展陷入低谷。近年来,随着深度学习技术的突破、大数据的兴起以及计算能力的提升,人工智能迎来了第三次发展浪潮,在图

AI天才研究院 1794

单元测试(基于安卓项目)总结

负责公司的单元测试体系的搭建,大约有一两个月的时间了,从最初的框架的调研,到中期全员的培训,以及后期对几十个项目单元测试的引入和推进,也算是对安卓的单元测试有了一些初步的收获以及一些新的认知,因此写下这篇文章来进行一个记录和总结。以下的所有内容纯属个人观点,欢迎讨论。

分享+记录 1386

从询价到回款:一篇讲透 SAP SD 销售与分销的实战入门指南

摘要: SAP SD(Sales and Distribution)模块是SAP ERP中管理销售与分销的核心组件,贯穿从订单到回款(Order-to-Cash)的全流程。其核心价值在于将销售业务结构化,通过主数据(客户、物料、定价)和交易单据(订单、交货、发票)实现流程可审计、可自动化。SD模块与物流(MM)、生产(PP)、财务(FI)深度集成,涵盖定价策略、信用控制、发运管理、国际贸易等复杂场景。关键设计包括条件技术(Condition Technique)实现灵活定价,单据流(Document Flo

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 258

嵌入式工程师必学(52):储能系统ESS

能量存储系统(ESS,Energystoragesystems)存在于各种各样的尺寸、形状和技术中。储能系统的技术,即基本的储能机制,自然会影响其重要特性,包括成本、安全性、性能、可靠性和寿命。然而,尽管基础技术很重要,但一个成功的储能项目依赖于对该技术的彻底和深思熟虑的实施,以实现项目的目标。成功的实施取决于储能系统的架构和组装情况。系统的体系结构可以决定其性能和可靠性,与它所使用的技术一致,甚至与之无关。

码农17年的博客 1443

Android单元测试一:单元测试入门

1. 前言 在Android开发中,如果对一个简单的功能,每次修改代码都重新运行到设备中进行测试,会浪费大量时间,降低开发工作效率。如果使用单元测试,编写单元测试类,执行测试单元测试类就可以对某些功能进行测试,大大提升了开发工作效率。 2. 添加单元测试支持 在AndroidStudio项目中,如果是新版本的AndroidStudio中新建的,会自动添加了单元测试的支持,如果旧项目,没有添加单元测...

lixpjita39的专栏 1267

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

单元测试——Android(入门篇)

一、Android中单元测试的基础使用 ①、简单示例:(在android中测试加法) public final class MathUtils { private MathUtils(){ throw new IllegalArgumentException("该类无法实例化"); } public static int addition(int a,

chen19960724的博客 1338

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Gradle Android Test 插件 - 经典的安卓单元测试利器

Gradle Android Test 插件 - 经典的安卓单元测试利器 gradle-android-test-plugin [DEPRECATED] A Gradle plugin which enables good 'ol fashioned unit tests for Android builds. ...

gitblog_00031的博客 1106

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Android 单元测试初体验

当初在学校学安卓的时候,老师敢教学进度,翻到单元测试这一章节的时候提了两句,没有把单元测试当重点讲,只是说我们工作中几乎不会用到,果真在之前的几年工作当中我真的没有用到,工作中都没有写过单元测试,后来我自己也下意识的忽略了这一块,直到听说现在这家公司后面会要求单元测试用例覆盖率达到百分之七十。我开始慌了,单元测试什么的,国内真的不太重视,这不,抽个周末简单学习下。对于安卓的单元测试的话,现在新建一个项目可以看到都是用的Junit4,ps:涉及Compose的单元测试本文不会过多解释。

我怀里的猫的博客 1906

Android进阶 —— Android 单元测试入门

什么是单元测试? 单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。比如我们可以测试一个类,或者一个类中的一个方法。 为什么要进行单元测试? 为什么要进行单元测试?说白了就是单元测试有什么好处,其实测试的好处无非就是减少bug、提高代码质量、使代码易于维护等。 这样表达可能不太好理解,举个例子 比如我们APP启动,从初始化到启动页,再进入首页,需要很长...

dai的博客 694

安卓中的单元测试

单元测试在安卓开发里,普遍被开发者所忽略。今天就讲讲这块吧! 单元测试用的好,开发的效率其实会提高很多。 在计算机编程中,单元测试(英语:Unit Testing)又称为模块测试, 是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。在过程化编程中,一个单元就是单个程序、函数、过程等;对于面向对象编程,最小单元就是方法,包括基类(超类)、抽象类、或者派生...

weixin_45347152的博客 249

android单元测试

1、何为单元测试      作为一个第一次使用单元测试的童鞋,还是有必要了解下何为单元测试,单元测试有啥好处!     在计算机编程中,单元测试(又称为模块测试)是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。在过程化编程中,一个单元就是单个程序、函数、过程等;对于面向对象编程,最小单元就是方法,包括基类(超类)、抽象类、或者派生类(子类

henry121212的专栏 6663

分享基于安卓项目的单元测试总结

对于安卓的项目,很多点我们是不能使用原生的对象,而是需要使用Mock的对象,但是随着项目的耦合度增加,环节的增多,需要mock的对象和验证点会爆炸性的增长,导致后期的单元测试方法的成本会几何式增长。体系的搭建,大约有一两个月的时间了,从最初的框架的调研,到中期全员的培训,以及后期对几十个项目单元测试的引入和推进,也算是对安卓的单元测试有了一些初步的收获以及一些新的认知,因此写下这篇文章来进行一个记录和总结。这个很容易理解,如果新的改动影响到了方法中原有的逻辑,则老的单元测试是跑不通的。

OKC_0_Westbrook的博客 851
上一篇: Android中应用与应用通信,以及数据传递
下一篇: 一种基于模板代码匹配检测组件规范化使用的方法
Swuagg
Swuagg 新星创作者: 移动开发技术领域 新星创作者: 移动开发技术领域 领域专家: 操作系统技术领域 领域专家: 操作系统技术领域
博客等级 码龄10年 2355粉丝 153原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值