Android 单元测试初体验(二)-断言

@[TOC](Android 单元测试初体验(二)-断言)


在这里插入图片描述

前言

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

这是官网 https://junit.org/junit4/

前一篇Android 单元测试初体验。


一、单元测试是什么?

安卓的单元测试是一种针对应用程序中的最小可测试单元——即单个函数、方法或逻辑模块——进行测试的策略。它专注于验证每个独立单元的特定功能和行为,以确保代码的正确性。

单元测试的目的是提高代码质量,减少bug,提高软件可靠性,同时降低维护成本。它是最为基础的测试形式,能够快速反馈问题,定位错误,并且在开发周期中尽早发现并解决问题,从而避免问题随着时间的推移而变得更加复杂。

虽然单元测试可能看起来很麻烦,但它的价值是无可替代的。通过单元测试,开发人员可以:

  1. 验证每个单元的功能是否符合预期;
  2. 检测代码中的潜在错误和漏洞;
  3. 确保代码在各种条件下都能正常运行;
  4. 提高代码的可读性和可维护性;
  5. 为代码重构提供安全保障。

在安卓开发中,由于其环境复杂性和多样性,单元测试尤为重要。通过单元测试,开发者可以更加自信地修改和优化代码,同时确保用户在使用应用程序时能够获得稳定、可靠的性能。虽然初始的投入可能会让人们觉得麻烦,但随着时间的推移,你会发现它在提高开发效率和保障应用程序质量方面具有巨大的优势。虽然单元测试可能会增加一些开发的初始工作量,但它能够为提高软件质量、减少后期维护成本提供强有力的支持。对于安卓开发来说,学会如何有效地进行单元测试,将是非常重要的一步。

二、断言

1.addition_isCorrect

我们新建一个项目,单元测试代码是这样的
代码如下(示例):

class ExampleUnitTest {
    @Test
    fun addition_isCorrect() {
        assertEquals(4, 2 + 2)
    }
}

方法名就和我们开发时不一样,这个规范是

驼峰命名操作( a d d i t i o n ) + 下划线 + 驼峰命名结果 ( i s C o r r e c t ) = a d d i t i o n i s C o r r e c t 驼峰命名操作(addition)+下划线 +驼峰命名结果(isCorrect) = addition_isCorrect 驼峰命名操作(addition+下划线+驼峰命名结果(isCorrect)=additionisCorrect
翻译过来就是加法正确。

那么我们就可以显而易见的知道assertEquals这个方法的意思,断言两个长度相等。如果不是,则抛出AssertionError。
参数:
第一个值为预期的值,第二个值为实际的值,那么这个代码就可以这样解释

assertEquals(4, 2 + 2)

2 + 2 = 4 2+2 =4 2+2=4

2.其他常用断言

代码如下(示例):

    @Test
    fun otherTest_isOK() {
        assert(true)
        assertTrue(true)
        assertFalse(false)
        assertNotNull(Object())
        assertNotEquals(4, 1 + 1)
        assertArrayEquals(emptyArray(), emptyArray())
        var a = Object()
        var b = a
        assertSame(a, b)

        var c = Object()
        var d = Object()
        assertNotSame(c, d)
    }

为了方便,我们直接写在一起,并命名为otherTest_isOK

  • @Test:这是JUnit测试框架的注解,用于标记函数为一个单元测试函数。
  • fun otherTest_isOK() {...}:这是函数定义,函数名为otherTest_isOK,并且没有返回值(因为它的返回类型被推断为Unit,而Unit是没有值的)。

接下来是这个函数中的各个断言:

  1. assert(true):这是使用JUnit框架的断言方法,用于检查条件是否为真。在这里,断言条件为true,所以断言会通过。
  2. assertTrue(true):这也是一个断言方法,同样用于检查条件是否为真。在这里,断言条件为true,所以断言会通过。
  3. assertFalse(false):这是另一个断言方法,用于检查条件是否为假。在这里,断言条件为false,所以断言会通过。
  4. assertNotNull(Object()):这个断言检查提供的对象是否非空。由于创建了一个新的对象(尽管它是空的),断言将通过。
  5. assertNotEquals(4, 1 + 1):这个断言检查两个值是否不相等。在这个例子中,4和2不相等,所以断言将通过。
  6. assertArrayEquals(emptyArray(), emptyArray()):这个断言检查两个数组是否相等。由于两个数组都是空的,断言将通过。
  7. var a = Object() var b = a:这里创建了两个对象引用,它们引用的是同一个对象。assertSame(a, b)断言这两个引用指向的是同一个对象,因此断言将通过。
  8. var c = Object() var d = Object():这里创建了两个不同的对象。assertNotSame(c, d)断言这两个引用指向的是不同的对象,因此断言将通过。

总的来说,这个测试函数中的所有断言都通过了,所以函数名称为otherTest_isOK是非常合适的。这个函数没有对函数的返回值进行任何断言,因为函数本身也没有返回值。


总结

本文简单介绍了安卓单元测试中的断言,包括常用的assertEquals、assertTrue、assertFalse等方法,以及用法示例。单元测试是提高代码质量、减少bug的重要手段,掌握断言方法非常有助于编写有效的单元测试用例。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/194600.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

人工智能与供应链行业融合:预测算法的通用化与实战化

前言 「作者主页」:雪碧有白泡泡 「个人网站」:雪碧的个人网站 让我们一起深入探索人工智能与供应链的融合,以及预测算法在实际应用中的价值!🔍🚀 文章目录 前言供应链预测算法的基本流程统计学习模型与机…

Gitea和Jenkins安装

Gitea Gitea:https://dl.gitea.com/gitea/1.21.0/ Jenkins:https://www.jenkins.io/download/ 数据库配置 可以参考官方文档-https://docs.gitea.cn/1.20/installation/database-prep,这里以MySQL作为讲解 MySQL 在数据库实例上&#xf…

LeetCode-面试题08.01 三步问题 C/C++实现 超详细思路及过程[E]

🎈归属专栏:深夜咖啡配算法 🚗个人主页:Jammingpro 🐟记录一句:摆了一个周末了,不能摆了,努力起来!! 文章目录 LeetCode-面试题08.01 三步问题🚗题…

SpringBoot : ch08 自动配置原理

前言 在现代的Java开发中,Spring Boot已经成为了一个备受欢迎的框架。它以其简化开发流程、提高效率和强大的功能而闻名,使得开发人员能够更加专注于业务逻辑的实现而不必过多地关注配置问题。 然而,你是否曾经好奇过Spring Boot是如何做到…

C++11线程以及线程同步

C11中提供的线程类std::thread,基于此类创建一个新的线程相对简单,只需要提供线程函数和线程对象即可 一.命名空间 this_thread C11 添加一个关于线程的命名空间std::this_pthread ,此命名空间中提供四个公共的成员函数; 1.1 get_id() 调用命名空间s…

识别验证码

背景 需求是要爬取某网站的数据, 已有账号密码, 但这个网站需要登录, 登录需要输入验证码 验证码样式如下 调研了Tesseract框架, 识别效果不佳. 后来使用ddddocr, 能正确识别. https://github.com/sml2h3/ddddocr 代码如下 def ocr():response requests.get(http://xxx/get…

【JavaScript】封装自己的JavaScript公共工具函数,并上传到npm中 进行下载

js公共方法封装方式都有哪些 全局函数 function greet(name) {console.log("Hello, " name "!"); }greet("Alice"); // 调用全局函数对象字面量 var utils {add: function(a, b) {return a b;},subtract: function(a, b) {return a - b;}…

使用opencv实现图片相似度检测

1.为什么学这个,我对图像处理非常感兴趣,我联想到海尔的指纹识别门锁是如何进行检测的,我在想不应该呀,单片机性能这么差,应该是使用了训练后的数据去检测图片的,如果我要实现草莓检测,知道它是不是草莓,我觉得单纯使用图片处理是不够的,我考虑过使用指纹模块来接触草莓从而实现…

芯片制程中温度的几种表示方法

在众多影响芯片制程的因素中,温度控制被视为一项至关重要的技术。温度是比较一种物质相对于另一种物质是冷还是热的衡量标准,它会影响到芯片的性能、可靠性以及最终产量。在不同的制程步骤中,温度扮演着各种各样的角色。但是在评价制程温度高…

振弦式轴力计和振弦采集仪组成的安全监测解决方案

振弦式轴力计和振弦采集仪组成的安全监测解决方案 振弦式轴力计和振弦采集仪是一种常用的结构安全监测工具,可以用于评估建筑物、桥梁、隧道或其他结构的结构健康状态和安全性能。这种监测方案较为先进、精确,并且能够监测长期的结构反应,因此…

Git指定分支或文件回退到指定版本

文章目录 一、分支回滚1.1、使用 git reset 命令1.2、使用 git revert 命令1.3、使用 git checkout 命令 二、文件回滚2.1、回滚未提交文件2.2、回滚已提交文件2.2.1、首先查看文件的历史版本2.2.2、找到你想要还原的版本2.2.3、将文件还原到你想要还原的版本2.2.4、提交代码 三…

便利高效双赢:无人机油气管道巡检全面升级

我国庞大的油气管道网络,包括原油、成品和天然气管道,因为地理区域广泛、建设年代久远、安全事故频发等现实因素,对管道的安全巡护与管理提出了更高的需求。在这一背景下,传统的人工巡护方式显然已经难以满足对高、精、准的要求。…

s_v_web_id或fp协议过签名,dy滑块

某音s_web_id或fp协议过签名 ‘h5_sdk_version’, ‘2.36.0’ "search_impr":{"entity_id":"1135137973613200"},"link_item_list":null,"user_permissions":null,"offline_info_list":null,"is_cf":…

计算机组成原理-页式存储器

文章目录 页式存储虚拟地址vs实地址页表:逻辑页->主存块号地址交换过程地址交换过程(增加TLB)总结 页式存储 把程序分散式地放到主存的不同块的地方 虚拟地址vs实地址 操作系统将逻辑地址映射到主存块中的物理地址,对应的物…

新疆大学与优艾智合机器人成立联合创新实验室

11月22日至24日,第五届中国工业互联网大赛新疆赛站决赛在新疆维吾尔自治区昌吉回族自治州昌吉市举行。在大赛中崭露头角的优秀解决方案,将为绿色工厂、绿色园区、绿色供应链等建设提供新的动能,促进工业绿色发展。 作为大赛的成果延伸&#…

unity UGUI中获取点击位置处的URL链接

需求是&#xff0c;我们在一个text组件中像写网页那样写入链接&#xff0c;然后点击这个链接&#xff0c;就能访问配置的网页啥的。比如&#xff1a; <a href"hello">链接文本</a></summary> 最终的效果如下&#xff1a; 图中&#xff0c;image区…

智能优化算法应用:基于蜻蜓算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于蜻蜓算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于蜻蜓算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.蜻蜓算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

Docker Compose;docker-compose;docker compose

(一) Docker Compose | 菜鸟教程 --> --> --> -->

Spine深入学习———— 渲染

数据有了之后&#xff0c;就开始渲染 渲染相关 绘制顺序 骨架的绘制顺序就是一个插槽列表&#xff0c;在插槽列表中上方的附件在下方之上绘制&#xff0c;绘制顺序可以在层级树中的骨架下查看。 基础流程 渲染实现 以下按照cocos2dx的实现来 &#xff08;cocos2dx 3.7 spin…

内部类, Comparable接口, Comparator接口, Cloneable接口 ---java

目录 一. 内部类 1.1 静态内部类 1.2 实例内部类 1.3匿名内部类 二. 接口的使用实例 2.1 Comparable接口 2.2 Comparator接口 ---比较器 2.3 Cloneable接口 深拷贝浅拷贝 一. 内部类 当一个事物的内部&#xff0c;还有一个部分需要一个完整的结构进行描述&#xff0…