单元测试和Mock方法

单元测试之mock使用 阅读详情

单元测试和MockService

标签(空格分隔): 协作开发 虚拟接口 Android


单元测试首先是开发的一部分,目的是保证没有耦合的情况下任何输入都能保证正确的输出(包括异常),可以保证程序的健壮性,避免代码腐烂化。其重要性是不言而喻的。查找了一些在Java中的测试思想以及测试工具,整理一下思路。

在单元测试时,测试人员根据详细设计说明书和源程序清单,了解到该模块的I/O条件和模块的逻辑结构,主要采用白盒测试的测试用例,辅之以黑盒测试的测试用例,使之对任何合理和不合理的输入都要能鉴别和响应。这就要求对程序所有的局部和全局的数据结构、外部接口和程序代码的关键部分进行桌面检查和代码审查。


测试内容

边界条件

在开发过程中,代码都是建立在正常的边界之内,对于边界与边界外的条件测试相对较少。边界条件是测试的重点之一,也是极易引发异常的重灾区。
1. 一致性:值是否与预期一致
2. 有序性:值是否像我们期望的那样有序或者无序
3. 区间性:值是否位于合理的最大值和最小值之间
4. 依赖性:代码是否引用了一些不在代码本省控制范围之内的外部资源(SD卡)等
5. 存在性:值(对象)是否存在
6. 基数性:是否恰好有足够的值(测试方法能否正确的计数)
7. 时间性:所有的事件的发生是否是有序的,是否在正确的时刻返回正确或合理的值。

局部数据结构测试

  1. 不正确或不一致的数据类型说明
  2. 使用尚未赋值或尚未初始化的变量
  3. 错误的初始值或错误的默认值
  4. 变量名拼写错或书写错
  5. 使用了外部变量或函数
  6. 不一致的数据类型
  7. 全局数据对模块的影响
  8. 数组越界
  9. 非法引用

覆盖路径测试

由于在测试时不可能做到穷举测试,所以在单元测试时要根据“白盒”测试和“黑盒”测试用例
设计方法设计测试用例,对模块中重要的执行路径进行测试。重要的执行路径指那些处在完
单元功能的算法、控制、数据处理等重要位置的执行路径,也指由于控制较复杂而易错的路径,有选择地对执行路径进行测试是一项重要的任务。应当设计测试用例查找由于错误的计算、不正确的比较或不正常的控制流而导致的错误,对基本执行路径和循环进行测试可发现大量的路径错误。

覆盖路径测试需要注意
  1. 死代码(dead code)执行不到的代码
  2. 算法错误
  3. 混用不同类的操作(泛型)
  4. 初始化不正确
  5. 精度错误—— 比较运算错误、赋值错误,表达式的不正确符号
  6. 循环变量的使用错误—— 错误赋值以及其他错误

路径的测试是伴随着选择而来的,而选择在于条件的比较,大部分错误在于比较

不同数据类型的比较。
不正确的逻辑运算符或优先次序。
因浮点运算精度问题而造成的两值比较不等。
关系表达式中不正确的变量和比较符。
“差 1 错”,即不正常的或不存在的循环中的条件。
当遇到发散的循环时无法跳出循环。
当遇到发散的迭代时不能终止循环。
错误的修改循环变量。

异常处理测试

出错的描述是否难以理解,是否能够对错误定位
显示的错误与实际的错误是否相符
对错误条件的处理正确与否
在对错误进行处理之前,错误条件是否已经引起系统的干预

模块接口测试

当完成内部测试之后,我们可以着手于对外部对接的测试。

模块输入参数的数目是否与模块形式参数数目相同。
模块各输入的参数属性与对应的形参属性是否一致。
模块各输入的参数类型与对应的形参类型是否一致。
传到被调用模块的实参的数目是否与被调用模块形参的数目相同。
传到被调用模块的实参的属性是否与被调用模块形参的属性相同。
传到被调用模块的实参的类型是否与被调用模块形参的类型相同。
引用内部函数时,实参的次序和数目是否正确。
是否引用了与当前入口无关的参数。
用于输入的变量有没有改变。
在经过不同模块时,全局变量的定义是否一致。
限制条件是否以形参的形式传递。
使用外部资源时,是否检查可用性并及时释放资源,如内存、文件、硬盘、端口等

当模块进行外部设备输入/输出操作时,要测试以下额外项目

文件的属性是否正确。
Open与Close语句是否正确。
规定的格式是否与I/O语句相符。
缓冲区的大小与记录的大小是否相配合。
在使用文件前,文件是否打开。
文件结束的条件是否安排好了。
I/O错误是否检查并做了处理。
在输出信息中是否有文字错误。


Mock对象

维基百科上这样描述Mock:In object-oriented programming, mock objects are simulated objects that mimic the behavior of real objects in controlled ways. A computer programmer typically creates a mock object to test the behavior of some other object, in much the same way that a car designer uses a crash test dummy to simulate the dynamic behavior. of a human in vehicle impacts.
Mock通常是指,在测试一个对象A时,我们构造一些假的对象来模拟与A之间的交互,而这些Mock对象的行为是我们事先设定且符合预期。通过这些Mock对象来测试A在正常逻辑,异常逻辑或压力情况下工作是否正常。
引入Mock最大的优势在于:Mock的行为固定,它确保当你访问该Mock的某个方法时总是能够获得一个没有任何逻辑的直接就返回的预期结果。

正常的过程
1. MobileApi开发人员事先和App开发人员定义好MobileApi的接口(名称,参数,返回值)
2. MobileApi按照约定写Mock接口,部署到测试环境,Mock Api中返回硬代码(JSON)数据。
3. App开发人员基于上述测试环境的Mock接口,进行开发
4. MobileApi开发完成后,通知App开发人员,对真实逻辑进行联调

以上四步,如果正常实施,是没有问题的,但是问题经常出现在第二步。MobileApi无法及时提供Mock接口

另外一种情况是:项目的进展需要更新现有接口字段,这是一个很耗时的过程

解除依赖

造成上面窘境的原因是模块与模块之间的依赖。我们可以在自己的App端设计自己的MockService,这样就可以完成步骤一之后,在APP端Mock自己的数据,直到开发完成,而不会被任何人阻塞,App开发完成后,如果有新的需要,可以请MobileApi开发人员汇总在一起修改。

设计App端的MockService需要注意一下几点

1, 对需要Mock的数据的MockApi接口,可以通过url.xml中配置Node节点MockClass属性,来指定要使用那个Mock子类生成的数据:

    <Node 
        Key="getWeatherInfo"
        Expires="300"
        NetType="get"
        MockClass="com.pirate.brook.mock.MockWeatherInfo"
        Url="http://www.weather.com.cn/xxx"/>

2, 使用反射工厂来设计MockService。MockService是基类,它有一个抽象方法getJsonData,用于返回不同的Json数据,上述Node节点配置的MockWeatherInfo.class如下

public class MockWeatherService extends MockService{
    @Override
    public String getJsonData() {
        WeatherInfo weatherInfo = new WeatherInfo(); // 实体编程
        weatherInfo.setCity("Beijing");
        weatherInfo.setCityId("10000");

        Response response = getSuccessResponse();
        response.setResult(JSON.toJSONSting(weatherInfo));
        return JSON.toJSONString(response); // 返回封装为完整的Response
    }
}

3,如何实现反射机制(RemoteService)

public void invoke(final BaseActivity activity, 
            final String apiKey,
            final List<RequestParameter> params, 
            final RequestCallback callBack) {
        // 从xml文件中获取URLData
        final URLData urlData = UrlConfigManager.findURL(activity, apiKey);
        // 判断是否需要Mock
        if (urlData.getMockClass() != null) {
            try {
                // 反射得到类的对象
                MockService mockService = (MockService) Class.forName(
                        urlData.getMockClass()).newInstance();
                String strResponse = mockService.getJsonData();

                final Response responseInJson = JSON.parseObject(strResponse,
                        Response.class);
                if (callBack != null) {
                    if (responseInJson.hasError()) {
                        callBack.onFail(responseInJson.getErrorMessage());
                    } else {
                        callBack.onSuccess(responseInJson.getResult());
                    }
                }
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        } else {
            HttpRequest request = activity.getRequestManager().createRequest(
                    urlData, params, callBack);
            DefaultThreadPool.getInstance().execute(request);
        }
    }

URLData.class

public class URLData {
    private String key;
    private long expires;
    private String netType;
    private String url;
    private String mockClass;
    }

这样就减少了对各个模块的依赖


另外一种解除依赖的方法—-使用Mockito库

大家可以参考这篇入门文章Mockito简明教程

【C/C++】单元测试实战:Stub与Mock框架解析 单元测试框架 阅读详情

相关推荐

MockService

在Android开发的初级阶段 服务端 不能及时提供接口数据 移动需要自己使用虚拟数据 模拟开发

如何使用Mock进行业务逻辑层(Service)测试

场景 公司采用的是分层开发,controller、Service、dao层分离,现在写dao层代码的人生病了,进度比较慢,现在你写的是 Service层的代码,怎么测试 Service 层代码是否正确呢? Service层测试的重点是什么? DAO层调用的次数 以及调用的顺序 并不关心最后数据是否准确 测试代码示例 0. 准备环境 引入依赖 <!-- Junit测试包 --> &l...

孔明的博客 8198

「API取数」FDL获取金蝶云星空的单据数据

本文介绍了如何使用FDL实现金蝶云API取数以及如何有效应对复杂的API数据处理场景。

oOBubbleX的博客 2027

关于mockservice

____最近一段时间利用部分工作时间和一部分工作之余时间,实现了mockservice系统的搭建和功能时间,那么什么是mockservice系统?~ ____首先解释一下mockservice系统的由来,以目前的A系统为例来分析一下:A系统因为对各个其他系统的依赖非常严重(需要发送消息并取得返回结果或者返回即时处理结果),而目前我们开发环境的各个环境是非常不稳定的,所以直接调用开发环境中真实

西岚晓的专栏 3684

Modem2G/3G/4G/5G:RFFE Driver(射频前端驱动):高通平台GRFC配置方法

文 | GentlemanTsao 文章目录前言1.什么是GRFC2.GRFC的配置流程概览3.msm_sig_info的配置与分析msm_sig_info Table位置:msm_sig_info Table示例:Table元素解读:rfc_msm_sig_info_type结构体signal typemsm_gpio |grfc_num:GPIO到GRFC的映射output_typefunction_select4._sig_cfg的配置与分析_sig_cfg table位置:_sig_cfg tabl

GentelmanTsao的博客 7312

【Ultrascale+ MPSOC学习记录】10、PS端以太网使用lwip

还是参考ALINX教程,学习PS端以太网如何使用,从教程中可以看到,开发板使用了一个xilinx默认不支持的phy JL2121,所以需要修改lwip的库源码。

ryo891012的博客 880

mock模拟接口测试_测试利器之Mock server

哈喽,艾瑞巴蒂,又在美好的周一和大家见面了,今天要和大家分享的是Mock server相关的知识,一大波知识来袭,请做好准备~什么是Mock server?Mock测试:就是在测试过程中,对于某些不容易构造或者 不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法。Mock对象:使用Mock Object进行测试,主要是用来模拟那些在应用中不容易构造(如HttpServletRe...

weixin_39883462的博客 1117

Linux下基于AHCI controller模块实现SATA Platform驱动附代码详细流程

本文主要是针对ARM A55集成了AHSATA controller模块开发sata驱动,通过Platform的形式在linux识别到SSD,本文详细讲述整个开发过程,同时对SATA Platform驱动进行讲解。1、配置SATA Phy的初始化;2、打开SATA Platform相关编译开关;3、配置设备树;4、linux启动识盘。

Luckiers的博客 2497

Mock测试(测试service层举例)

mock我简单粗暴的在这种情况下的理解就是“模拟”,将你不愿意真正执行的函数进行mock模拟,模拟的函数不会真正的去执行函数内部代码,而是通过你给定函数形参和指定返回值进行下一步的操作即可。就是对你需要模拟的函数所在的类上加的,比如这里,我想模拟eventMapper的insertEvent插入函数和entityService的insertEntityIfNotExists函数,就在这两个类上加@Mock。例子:向事件表中插入事件数据,若该事件涉及到的实体在实体表中不存在,则将实体再插入实体表。

m0_58212551的博客 932

halcon 查找圆形

先找到大概位置进行拟合,然后再以拟合出的位置作为测量的大概位置进行找圆;

qq_59062726的博客 734

告别龟速计算!用Python的fengwo模块5分钟搞定通达信COST/WINNER函数(附完整代码)

本文介绍如何使用Python的fengwo模块高效复现通达信的COST和WINNER函数,解决量化交易中的计算精度和性能问题。通过C++核心算法和多线程优化,计算速度提升显著,误差低于0.5%,并支持与通达信DLL无缝集成,适用于实盘交易策略开发。

weixin_42533751的博客 599

mock 服务搭建

mock 服务

Gleason 8265

Sigrity Power DC Single-BoardPackage IR Drop Analysis模式进行单板压降仿真分析操作指导

如果需要单独对某个via设置参数,右侧选择Setup by padstack,下方下拉选择某个via,单独设置参数即可。举例:板厚1.6mm,内层1OZ(1.2mil,即0.03mm),铜皮宽度1mm,20度温升,允许通流I为2.5A。目的是模拟实际情况,via的孔壁电镀1mil,中间是空心的,让via不完全被填充金属成为实心via。Upper/lower Tolerance:上下公差,设置为5%,也就是压降允许的范围。电流密度计算公式:J=I/A(J为电流密度,I为电流,A为横截面积)

weixin_54787054的博客 695

junit单元测试mock私有private方法和静态static方法

org.powermock.api.mockito.PowerMockito更强大,支持private和protected方法的mock。org.mockito.Mockito功能有限,不能mock 私有private、受保护的protected方法。利用PowerMockito来mock私有方法需要mock。

星空的风fly 2万+

uniapp - H5人脸识别认证与活体检测功能(纯前端免费方案+微信sdk人脸识别)完整源码,微信公众号网页/h5端人脸识别功能人脸核身(微信方案提供后端spring boot+thinkphp源码

uniapp实现人脸认证,uniAPP h5手机拍照+人脸识别,免费人脸识别插件,前端人脸识别解决方案,uniapp H5人脸识别带前后摄像头,人脸识别在H5页面进行采集,微信公众号H5人脸核身,H5端人脸识别功能实现,免费h5人脸识别插件方案,微信公众号H5网页实现人脸识别,uniapp人脸监测,uniapp人脸生物监测,使用uniapp开发H5人脸采集功能/人脸识别功能,uniapp项目—h5端人脸采集功能实现,uniapp vue3人脸核身,H5活体检测认证,人脸认证张嘴摇摇头指引动作,人脸核身 微信

🏆 前端领域优质创作者 3809

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

单元测试笔记,静态方法的测试和Mock

测试三个步骤: 1、接口---》2、造数据---》3、验证结果; 静态方法的测试:   对于静态方法的测试,一般是在其基础上,封装一个接口和实现类,方便后续的Mock模拟。 个人理解,大致原理就是拦截实际接口,然后替换为Mock的接口逻辑,这样就可以过滤掉其他外部的依赖,同样也可以让单测功能更加单纯。比如: public interface ILogHelp...

weixin_30591551的博客 584

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

单元测试 Mock不Mock?

前段时间,我们团队就单元测试是否采用 Mock 进行了一番交流,各有各的说法。本文就单元测试 Mock不Mock 给出我的观点,欢迎各位同仁提出不同的意见,共同探讨、相互交流。简单来说,Mock就是模拟目标代码的行为,在实际测试过程中代替真实的调用目标。如下图这样做的意义何在?隔离测试:Mock 使得测试可以专注于测试的代码逻辑,而不必关心外部不稳定因素。提高测试速度:Mock 可以避免耗时的外部调用,从而加快测试速度。提高测试的可靠性和稳定性:通过Mock,可以避免外部变化对测试结果的影响。

二蛋的博客 2006

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Spring 单元测试中如何进行 mock

我们在使用 Spring 开发项目时,都会用到依赖注入。如果程序依赖了外部系统或者不可控组件,比如依赖数据库、网络通信、文件系统等,我们在编写单元测试时,并不需要实际对外部系统进行操作,这时就要将被测试代码与外部系统进行解耦,而这种解耦方法就叫作 “mock”。所谓 “mock” 就是用一个“假”的服务代替真正的服务。 那我们如何来 mock 服务进行单元测试呢?mock 的方式主要有两种:手动 mock 和利用单元测试框架 mock。其中,利用框架 mock 主要是为了简化代码编写。我们这里主要是介绍利用

Star's Tech Blog 3743

C++类对象单元测试中的Mock使用

文章目录前言1. 下载网址2. 为什么选择Google Mock3. C++简单的例子3.1 使用流程4. 指定自己的期望 前言   在进行单元测试时,我们想要测试自己缩写函数A,但是函数A却依赖于函数B,当函数B无法满足预期时就无法对函数A进行测试,主要由于下面几个原因: 函数B依赖于硬件设备 真实的函数B的返回值无法满足我们的预期 团队开发中函数B尚未实现   这时就需要对函数B进行打桩(仿真mock),使其达到我们预期的效果。 但是如同下面这种类型函数时,则需要深入下去,对基层的函数进行打桩: t

lzg_na的博客 1万+

软件测试——Mock原理和使用

mock主要是的为了提供开发程序员的做一个的单元测试而使用的。假设你开发一个项目,里面包含了一个登录模块,登录模块需要调用身份证验证模块中的认证函数,该认证函数会进行值的返回,然后系统根据这个返回值来做判断是否能进行登录。但是身份证验证模块中的认证函数只有在正式上线的系统上才提供。公司内部的测试环境或者开发环境上不提供。如果此时需要进行登录模块的业务测试或接口测试。

庄小焱 9866

有效使用Mock编写java单元测试

Java单元测试对于开发人员质量保证至关重要,尤其当面对一团乱码的遗留代码时,没有高覆盖率的单元测试做保障,没人敢轻易对代码进行重构。然而单元测试的编写也不是一件容易的事情,除非使用TDD方式,否则编写出容易测试的代码不但对开发人员的设计编码要求很高,而且代码中的各种依赖也常常为单元测试带来无穷无尽的障碍。 令人欣慰的是开源社区各种优秀的Mock框架让单元测试不再复杂,本文简单介绍EasyMoc

Tony Chen的专栏 10万+

python单元测试mock_Python单元测试和Mock测试

单元测试测试可以保证你的代码在一系列给定条件下正常工作测试允许人们确保对代码的改动不会破坏现有的功能测试迫使人们在不寻常条件的情况下思考代码,这可能会揭示出逻辑错误良好的测试要求模块化,解耦代码,这是一个良好的系统设计的标志#!/usr/bin/env python# -*- coding: utf-8 -*-import os, sysimport time, datetimeimport un...

weixin_39622760的博客 186

浅谈单元测试中Mock的使用

何为mock? mock测试就是在测试过程中中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法。 mock对象 mock对象就是真实对象在测试期间的代替品。 mock对象使用场景 真实对象具有不可确定的行为,有时真实对象的某些行为很难被触发。 mock测试的关键步骤 在测试代码中实现

搜狗测试 2729
上一篇: 读书笔记App研发录--数据缓存设计
下一篇: Android前台Service
PirateBrook
博客等级 码龄11年 90粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值