Android 带你玩转单元测试

news2024/10/9 16:28:56

前言

为什么要用到单元测试呢,一般开发谁会写单元测试,反正我认识的人都不会做,又耗时间,效果又一般,要是在单元测试的代码里面又出BUG的话又要改半天,麻烦。
但是有的时候真的是不得不用,比如说你有一步逻辑操作,你想去判断这逻辑操作是否正确。但是运行这步操作之前有10步操作,然后这个逻辑操作的情况一共有10种(举个比较极端的栗子)。那如果你运行Debug检验每一种情况的时候,都需要每种情况先执行10步操作才能验证,那就很麻烦啊。

所以这时候你可能就会需要用到单元测试,直接对单步操作进行测试,也不用把整个项目都跑起来,直接对特定的方法进行测试。
但说句实在话,虽然开发流程中规定要进行单元测试。但这单元测试谁来做,还不是研发来做,我们代码平时都很赶,还有什么时间去写单元测试的逻辑和用例,所以我觉得仅仅对某部分base库或者重要的逻辑做测试就够了。

搭建环境

搭建环境很简单,在gradle中添加依赖

 
  1. testImplementation 'org.mockito:mockito-core:2.25.1'

  2. 复制代码

版本号肯定不是固定的,可以直接在File-Project Structure中查找这个库,这样肯定是最新版本,不过要记得把implementation变成testImplementation 。

然后我们创建相应的测试类,也很简单,以前我是手动创建的,之前get到别人的一招。
光标放到你想测的类的类名,然后alt + enter , 选择Create Test\

自动会帮你填好name,你想改也行,下面可以选before和after,就是你想在测试前和测试后做的操作的方法。再下面Member可惜选着对应的方法。
选择好之后点击OK,然后会让你选择androidTest下还是test下,默认创建android项目不是帮你创建3个文件夹嘛\

我们因为是只对某个方法做测试,所以选择test(两个文件夹的区别以后再说)。

单元测试

假如我想测一个功能,就测我以前写的那个Gson解析泛型的功能吧。

 
  1. public T getDataContent(String jsondata){

  2. Gson gson = new Gson();

  3. Type type = getClass().getGenericSuperclass();

  4. Type[] types = ((ParameterizedType) type).getActualTypeArguments();

  5. Type ty = new ParameterizedTypeImpl(BaseResponse.class, new Type[]{types[0]});

  6. BaseResponse<T> data = gson.fromJson(jsondata, ty);

  7. return data.content;

  8. }

  9. 复制代码

看看BaseResponse

 
  1. public class BaseResponse<T> {

  2. public String ret;

  3. public String msg;

  4. public T content;

  5. }

  6. 复制代码

因为这个是一个很重要的功能,每个地方的网络请求都会走这段代码,所以我要测试它,看看不同的情况是否能得到我想要的结果。

按照上面的做法生成一个测试的类和方法

 
  1. public class HttpCallBackTest {

  2. @Test

  3. public void getDataContent(){

  4. }

  5. }

  6. 复制代码

可以发现在androidstudio里面,getDataContent方法左边有个运行按钮,点击就可以单独对这个方法进行测试。

现在我们要测试这个功能,那么就需要写测试用例,假如我这边写4个测试用例看看能不能都成功解析,4个json字符串(在代码里面加了换行符所以可能有点难看)。

 
  1. String mockData = "{\n" +

  2. "\t"ret":"1",\n" +

  3. "\t"msg":"success",\n" +

  4. "\t"content":{\n" +

  5. "\t\t"id":"10000",\n" +

  6. "\t\t"sex":"男",\n" +

  7. "\t\t"age":18\n" +

  8. "\t}\n" +

  9. "}";

  10. String mockData2 = "{\n" +

  11. "\t"ret":"1",\n" +

  12. "\t"msg":"success",\n" +

  13. "\t"content":[\n" +

  14. "\t\t{\n" +

  15. "\t\t\t"id":"10000",\n" +

  16. "\t\t\t"sex":"男",\n" +

  17. "\t\t\t"age":"18"\n" +

  18. "\t\t},\n" +

  19. "\t\t{\n" +

  20. "\t\t\t"id":"10001",\n" +

  21. "\t\t\t"sex":"女",\n" +

  22. "\t\t\t"age":"16"\n" +

  23. "\t\t}\n" +

  24. "\t]\n" +

  25. "}";

  26. String mockData3 = "{\n" +

  27. "\t"ret":"1",\n" +

  28. "\t"msg":"success",\n" +

  29. "\t"content": "aaa"\n" +

  30. "}";

  31. String mockData4 = "{\n" +

  32. "\t"ret":"1",\n" +

  33. "\t"msg":"success",\n" +

  34. "\t"content": []\n" +

  35. "}";

  36. 复制代码

写个对象来接收

 
  1. public static class TestData{

  2. public String id;

  3. public String sex;

  4. public int age;

  5. }

  6. 复制代码

现在来写测试的代码
(1)第一个测试用例

 
  1. @Test

  2. public void getDataContent(){

  3. httpCallBack = new HttpCallBack<TestData>();

  4. TestData testData = (TestData) httpCallBack .getDataContent(mockData);

  5. assertEquals("10000",testData.id);

  6. assertEquals("男",testData.sex);

  7. assertEquals(18,testData.age);

  8. }

  9. 复制代码

测试用到的assertEquals方法,这个之后会详细讲。

可以看到下边会有打印 Process finished with exit code 0 说明测试通过,如果不通过会显示详细的不通过的信息。
比如说我写的 assertEquals(12,testData.age); ,错误的情况会提示

如果是代码错误的话也会报出详细的Exception信息。

(2)第二个测试用例

 
  1. @Test

  2. public void getDataContent(){

  3. httpCallBack = new HttpCallBack<Lits<TestData>>();

  4. Lits<TestData> testDatas = (Lits<TestData>) httpCallBack .getDataContent(mockData2);

  5. assertEquals("女",testDatas.get(1).sex);

  6. }

  7. 复制代码

(3)第三个测试用例

 
  1. @Test

  2. public void getDataContent(){

  3. httpCallBack = new HttpCallBack<String>();

  4. String testData = (String ) httpCallBack .getDataContent(mockData3);

  5. assertEquals("aaa",testData);

  6. }

  7. 复制代码

(4)第四个测试用例

 
  1. @Test

  2. public void getDataContent(){

  3. httpCallBack = new HttpCallBack<Lits<TestData>>();

  4. Lits<TestData> testDatas = (Lits<TestData>) httpCallBack .getDataContent(mockData4);

  5. assertEquals(0,testDatas.size());

  6. }

  7. 复制代码

4个用例如果都通过,说明我这个解析json泛型的方法基本不会有问题。
当然,可以把4种情况都写在一起,这样就只用跑一次,我这里是为了看清楚点所有分开写。
这样就是一个简单的单元测试的流程。

assert

从上面可以看出最主要判断测试正确和错误的方法是用assert(断言)。
而这些方法都是属于Assert类,大概的断言方法有这些

其中 assertThat 是一个比较高级的用法,这个以后再说,不过我个人基本是没有用过assertThat ,单单其它的几个方法基本就够用了。

补充

可能有的朋友有些时候觉得测一个类难以下手,比如还是我说的解析代码,你是这样写的。

 
  1. public void requestFinish(String jsonData){

  2. ......

  3. ......

  4. Gson gson = new Gson();

  5. Type type = getClass().getGenericSuperclass();

  6. Type[] types = ((ParameterizedType) type).getActualTypeArguments();

  7. Type ty = new ParameterizedTypeImpl(BaseResponse.class, new Type[]{types[0]});

  8. BaseResponse<T> data = gson.fromJson(jsondata, ty);

  9. // 假如用回调的方式

  10. callback.finish(data.content);

  11. ......

  12. }

  13. 复制代码

比如这样,要怎么断言,我这个方法中又不仅仅只有解析的代码,还有其他的代码,而且我这个方法是一个void方法,不像上面一样有返回值的。

其实很简单,要不然就判断这个方法的外层那个方法,要不然就像我一样单独把那块功能代码抽出来。我是建议抽出来,也符合单一职权。

总结

这是我自己旧博客的文章,现在使用单元测试会比之前更方便,当你写了一个很复杂的方法,但你想测试不同的输入会输出不同的情况,如果你不用单元测试,你就需要每次改输入的变量然后run,这种情况下使用单元测试会帮助你剩下很多的时间,具体的还要视情况而定。

感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取   

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

YOLOv10改进策略【注意力机制篇】| 2024 SCSA-CBAM 空间和通道的协同注意模块

一、本文介绍 本文记录的是基于SCSA-CBAM注意力模块的YOLOv10目标检测改进方法研究。现有注意力方法在空间-通道协同方面未充分挖掘其潜力&#xff0c;缺乏对多语义信息的充分利用来引导特征和缓解语义差异。SCSA-CBAM注意力模块构建一个空间-通道协同机制&#xff0c;使空间注…

【科研日常】2024年计算图形学与多媒体CCF A、B类会议投稿截止日期汇总

整理了2024年多媒体方向的CCFA、B类学术会议的截稿时间&#xff0c;文末附有按月份排列的表格&#xff0c;各位同学可作为投稿参考。 A类会议 ACM MM 2024 ACM Multimedia 2024 Home (acmmm.org) Apr 8, 2024 SIGGRAPH 2024 Technical Papers | SIGGRAPH 2024 Jan 23, 202…

《深度学习》循环神经网络RNN 结构及原理解析

目录 一、关于RNN 1、传统神经网络存在的问题 2、什么是循环神经网络 3、RNN特点 二、RNN基本结构 1、RNN基本结构 2、推导方式 注意&#xff1a; 3、循环的由来 4、RNN的局限性 一、关于RNN 1、传统神经网络存在的问题 无法训练出具有顺序的数据&#xff0c;模型搭…

基于卷积神经网络的书法字体识别系统,resnet50,mobilenet模型【pytorch框架+python】

更多目标检测和图像分类识别项目可看我主页其他文章 功能演示&#xff1a; 基于卷积神经网络的书法字体识别系统&#xff0c;resnet50&#xff0c;mobilenet【pytorch框架&#xff0c;python&#xff0c;tkinter】_哔哩哔哩_bilibili &#xff08;一&#xff09;简介 基于卷…

牛客——xay loves or与 __builtin_popcount的使用

xay loves or 题目描述 登录—专业IT笔试面试备考平台_牛客网 运行思路 题目要求我们计算有多少个正整数 yy 满足条件 x \text{ OR } y sx OR ys。这里的“OR”是指按位或运算。为了理解这个问题&#xff0c;我们需要考虑按位或运算的性质。 对于任意两个位 a_iai​ 和 b_…

如何用AI绘画工具生成中国风插画?Midjourney保持风格一致出图

如何运用AI绘画工具如Midjourney&#xff0c;生成符合我们特定要求的艺术作品是一门精进的技巧&#xff0c;尤其当你想生成具有鲜明特色的国风插画时&#xff0c;纯文本提示词的局限性常常使我们难以达到预期效果。然而&#xff0c;借助Midjourney的高级参数功能——特别是sref…

中航资本:招保万金全跌停!“人气王”创历史,半日成交突破600亿

狂奔的“牛”总算迎来“回头”。 今日是新股民入市第一天。依据我国结算的安排&#xff0c;关于10月1日&#xff08;周二&#xff09;至10月8日&#xff08;周二&#xff09;提交请求的新开证券账户&#xff0c;于10月9日&#xff08;周三&#xff09;起可用于买卖。 不过&am…

GIS、向量、文字检索... 火山引擎 ByteHouse 集成全场景分析能力

企业业务场景增多、规模扩大&#xff0c;对于底层数据架构来说&#xff0c;可能也会愈加复杂。 比如&#xff0c;某企业因自身业务发展&#xff0c;需要引入向量检索能力&#xff0c;但前期选型的技术架构并不能直接支持&#xff0c;只能重新引入向量数据库。这意味着&#xff…

JavaWeb - 9 - MySQL

数据库&#xff1a;DataBase(DB)&#xff0c;是存储和管理数据的仓库 数据库管理系统&#xff1a;DataBase Management System(DBMS)&#xff0c;操纵和管理数据库的大型软件 SQL&#xff1a;Structured Query Language&#xff0c;操作关系型数据库的编程语言&#xff0c;定…

经纬恒润荣获2024中国汽车供应链大会创新成果奖

2024年9月24日-26日&#xff0c;2024中国汽车供应链大会暨第三届中国新能源智能网联汽车生态大会在武汉隆重举办。本届大会以“新挑战、新对策、新机遇——推动中国汽车供应链可持续发展”为主题&#xff0c;集聚政府主管领导、行业专家、汽车及零部件企业精英和主流媒体&#…

这个 JavaScript API 比你想象中更强大!

大家好&#xff0c;我是 ConardLi。 今天&#xff0c;我们来聊聊一个可能被你忽视&#xff0c;而且非常强大的标准 JavaScript API - AbortController 。 在过去&#xff0c;大家在提到 AbortController 的时候&#xff0c;一般会举请求中断的例子&#xff0c;就连 MDN 给到的…

重学SpringBoot3-集成Redis(三)之注解缓存策略设置

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-集成Redis&#xff08;三&#xff09;之注解缓存策略设置 1. 引入 Redis 依赖2. 配置 RedisCacheManager 及自定义过期策略2.1 示例代码&#xff1a;自定…

重塑能源持续亏损近22亿:今年前五个月销量下滑,产能利用率骤降

《港湾商业观察》黄懿 9月2日&#xff0c;上海重塑能源集团股份有限公司&#xff08;下称“重塑能源”&#xff09;向港交所提交上市申请书&#xff0c;委任中国国际金融香港证券有限公司、招银国际融资有限公司及法国巴黎证券&#xff08;亚洲&#xff09;有限公司为整体协调…

Linux(不同版本系统包含Ubuntu)下安装mongodb详细教程

一、下载MongoDB 在MongoDB官网下载对应的MongoDB版本&#xff0c;可以点击以下链接快速跳转到下载页面&#xff1a; mongodb官网下载地址 注意选择和自己操作系统一致的platform,可以先查看自己的操作系统 查看操作系统详情 命令&#xff1a; uname -a 如图&#xff1a;操…

海洋大地测量基准与水下导航系列之二国外海底大地测量基准和海底观测网络发展现状(下)

2004年&#xff0c;英国、德国、法国等国家在欧洲“全球环境与安全监测’(Global Monitoring for Environment and Security,GMES)观测计划倡导下制定了“欧洲海底观测网络”(European Seafoor Observatory Network,ESONET)计划。ESONET是一个多学科的欧洲卓越网络(NoE &#x…

光路科技以技术创新为驱动,打造创新型企业新标杆

近日&#xff0c;深圳市光路在线科技有限公司&#xff08;光路科技&#xff09;凭借其出色的创新能力和市场表现&#xff0c;荣获深圳市中小企业服务局颁发的“创新型中小企业”称号。这一荣誉标志着光路科技在推动行业发展和技术进步方面取得了显著成就。 光路科技自2008年成立…

【含文档】基于Springboot+Android的在线招聘平台(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…

◇【code】PPO: Proximal Policy Optimization

整理的代码库&#xff1a;https://github.com/Gaoshu-root/Code-related-courses/tree/main/RL2024/PPO OpenAI 文档 —— PPO-Clip OpenAI 文档 界面链接 PPO&#xff1a; on-policy 算法、适用于 离散 或 连续动作空间。可能局部最优 PPO 的动机与 TRPO 一样&#xff1a;…

Scott Brinker:企业正在更换更多的Martech,专注集成和API,不断扩大技术栈

营销技术替代因素&#xff1a;集成和API排在第二位 MarTech.org组织了2024年Martech替代调查&#xff0c;它能够深入了解营销技术栈是如何演变的。在496名受访者中&#xff0c;有65%的人表示他们在过去一年中更换了他们技术栈中的一个或多个营销技术解决方案。这些是最常被替代…