单元测试总结

2023-11-19

概念

百度百科:单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如C语言中单元指一个函数,Java里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。总的来说,单元就是人为规定的最小的被测功能模块。单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。
经常与单元测试联系起来的另外一些开发活动包括代码走读(Code review),静态分析(Static analysis)和动态分析(Dynamic analysis)。静态分析就是对软件的源代码进行研读,查找错误或收集一些度量数据,并不需要对代码进行编译和执行。动态分析就是通过观察软件运行时的动作,来提供执行跟踪,时间分析,以及测试覆盖度方面的信息。

单元测试的目的

单元测试是编写测试代码,用以检测特定的、明确的、细颗粒的功能! 严格来说,单元测试只针对功能点进行测试,不包括对业务流程正确性的测试。
目前开发所用的单元是Junit框架,在大多数java的开发环境中已经集成,可以方便开发自己调用!
注意:单元测试不仅仅是要保证代码的正确性,一份好的单元测试报告,还要完整地记录问题的所在和缺陷以及正确的状态,方便后面代码的修复,重构和改进!
一般来说,一份单元测试主要包括以下几个方面:
1.接口功能性测试: 接口功能的正确性,即保证接口能够被正常调用,并输出有效数据!

------------------> 是否被顺利调用

------------------> 参数是否符合预期

==============================================================================================
2.局部数据结构测试:保证数据结构的正确性
------------------> 变量是否有初始值或在某场景下是否有默认值

------------------> 变量是否溢出

3.边界条件测试:测试
------------------> 变量无赋值(null)
------------------> 变量是数值或字符
------------------> 主要边界:最大值,最小值,无穷大
------------------> 溢出边界:在边界外面取值+/-1
------------------> 临近边界:在边界值之内取值+/-1
------------------> 字符串的边界,引用 "变量字符"的边界
------------------> 字符串的设置,空字符串
------------------> 字符串的应用长度测试
------------------> 空白集合
------------------> 目标集合的类型和应用边界
------------------> 集合的次序

------------------> 变量是规律的,测试无穷大的极限,无穷小的极限

4.所有独立代码测试:保证每一句代码,所有分支都测试完成,主要包括代码覆盖率,异常处理通路测试
------------------> 语句覆盖率:每个语句都执行到了
------------------> 判定覆盖率:每个分支都执行到了
------------------> 条件覆盖率:每个条件都返回布尔
------------------> 路径覆盖率:每个路径都覆盖到了

==============================================================================================
5.异常模块测试,后续处理模块测试:是否包闭当前异常或者对异常形成消化,是否影响结果!

断言测试与及常用断言

断言列表:
-------------->assertTrue(String message, boolean condition) 要求condition == true
-------------->assertFalse(String message, boolean condition) 要求condition == false
-------------->assertEquals(String message, XXX expected,XXX actual) 要求expected期望的值能够等于actual
-------------->assertArrayEquals(String message, XXX[] expecteds,XXX [] actuals) 要求expected.equalsArray(actual)
-------------->assertNotNull(String message, Object object) 要求object!=null
-------------->assertNull(String message, Object object) 要求object==null
-------------->assertSame(String message, Object expected, Object actual) 要求expected == actual
-------------->assertNotSame(String message, Object unexpected,Object actual) 要求expected != actual
-------------->assertThat(String reason, T actual, Matcher matcher) 要求matcher.matches(actual) == true

-------------->fail(String message) 要求执行的目标结构必然失败,同样要求代码不可达,即是这个方法在程序运行后不会成功返回,如果成功返回了则报错

before、after

用于在测试前、后做一些初始化、收尾工作,例如测试接口性能。

@Before
    public void before(){
        startTimeMillis=System.currentTimeMillis();
    }
 
    @After
    public void after(){
        endTimeMillis= System.currentTimeMillis();
        System.out.println("【耗时】"+(endTimeMillis-startTimeMillis));
    }

参数化测试

参数化测试的目标是为了一次性完成同类型测试,将相同类型的数据按照一定的顺序批量地传入测试方法,并得出结论!其本质是一个批量的化的操作,只是为了方便我们测试而进行了封装。我们只有提供测试的方法以及按照一定的顺序进行设置则可以。

 @RunWith(Parameterized. class )
 public   class  TestParam {
 
      private   static  Calculator calculator  =   new  Calculator(); //需要测试的类
      private   int  param; 
      private   int  result;
 
@Parameters
public   static  Collection data(){
 
   return  Arrays.asList(new  Object[][] {{ 11 ,  17 } , { xx1 ,  xx} } );
 
} 
 
//有参构造,在实例的时候实现参数初始化
public  TestParam( int  param,  int  result){
   this .param  =  param;
   this .result  =  result;
} 
 
@Test
public  void  TestResult(){
   calculator.square(param);
   assertEquals(result, calculator.getResult()); 
} 
 
} 

--------->进行类注解:@RunWith(Parameterized.class),为了测试类指定一个ParameterizedRunner运行器

--------->进行参数设置:将测试结果和期望结果,以每一组都是一个数组的形式存放以形成二维数组,转化为list返回并注解。

--------->参数初始化:设置测试方法要入参的参数,并按照"参数设置"的顺序利用构造方法进行初始化的赋值!

--------->测试调用:写一个测试方法进行调用,将参数传递到要测试的类的方法中并返回数据。

问题

1)service层单元测试

a. junit加载文件:

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration(locations = {"classpath:applicationContext.xml"})

b.手动加载方法:

ApplicationContext applicationContext = new ClassPathXmlApplicationContext(new String[]{"/spring/spring-mvc.xml","/spring/spring-redis.xml","/spring/spring-mybatis.xml","/spring/spring-main.xml"});
DeptMapper deptService = (DeptMapper) applicationContext.getBean("deptService");

2) Controller层的单元测试

a.使用MockMvc模拟通过url的接口调用。MockMvc是SpringMVC提供的Controller测试类,每次进行单元测试时,都是预先执行@Before中的setup方法,初始healthArticleController单元测试环境。示例代码如下。
b.postman+修改权限过滤条件

package testDao;

import com.susq.mbts.controller.UserController;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.ResultActions;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;


@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:applicationContext.xml"})
public class ConTest {
    @Autowired
    private UserController userController;

    private MockMvc mockMvc;

    @Before
    public void setup(){
        mockMvc = MockMvcBuilders.standaloneSetup(userController).build();
    }

    @Test
    public void Ctest() throws Exception {	
        ResultActions resultActions = this.mockMvc.perform(MockMvcRequestBuilders.post("/show_user3").param("id", "1"));
        MvcResult mvcResult = resultActions.andReturn();
        String result = mvcResult.getResponse().getContentAsString();
        System.out.println("=====客户端获得反馈数据:" + result);
        // 也可以从response里面取状态码,header,cookies...
//        System.out.println(mvcResult.getResponse().getStatus());
    }
}

无论遇到什么样的困难都不要怕,微笑着面对他

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单元测试总结 的相关文章

  • JPA 中的复合键

    我想创建一个具有自动生成的主键的实体 而且还有一个由其他两个字段组成的唯一复合键 我如何在 JPA 中执行此操作 我想这样做是因为主键应该用作另一个表中的外键 并且使其复合并不好 在下面的代码片段中 我需要命令和模型是唯一的 pk当然是主键
  • Java:在 eclipse 中导出到 .jar 文件

    我正在尝试将 Eclipse 中的程序导出到 jar 文件 在我的项目中 我添加了一些图片和 PDF s 当我导出到 jar 文件时 似乎只有main已编译并导出 我的意愿是如果可能的话将所有内容导出到 jar 文件 因为这样我想将其转换为
  • 大数据使用什么数据结构

    我有一个包含一百万行的 Excel 工作表 每行有 100 列 每行代表一个具有 100 个属性的类的实例 列值是这些属性的值 哪种数据结构最适合在这里使用来存储数百万个数据实例 Thanks 这实际上取决于您需要如何访问这些数据以及您想要
  • 如何在代理后面安装 Eclipse Neon

    对于 Neon Eclipse 附带了一个安装程序 我在安装程序中找不到任何配置菜单 我的java版本是 java version java version 1 8 0 72 Java TM SE Runtime Environment b
  • 当客户端关闭连接时,Spring StreamingResponseBody 请求线程未清理

    我在控制器中有一个端点 它返回一个StreamingResponseBody 用于向客户端发送文件 其代码大致如下 RestController RequestMapping value api public class Controlle
  • 什么时候可以在 Java 中使用 Thead.stop() ?

    Thread stop 的 Java 文档听起来好像如果您调用 Thread stop 世界就会终结 已弃用 这种方法本质上是不安全的 停止线程 Thread stop 导致它解锁所有已锁定的监视器 作为未经检查的 ThreadDeath
  • Spring Security SAML2 使用 G Suite 作为 Idp

    我正在尝试使用 Spring Security 5 3 3 RELEASE 来处理 Spring Boot 应用程序中的 SAML2 身份验证 Spring Boot 应用程序将成为 SP G Suite 将成为 IDP 在我的 Maven
  • 需要使用 joda 进行灵活的日期时间转换

    我想使用 joda 解析电子邮件中的日期时间字符串 不幸的是我得到了各种不同的格式 例如 Wed 19 Jan 2011 12 52 31 0600 Wed 19 Jan 2011 10 15 34 0800 PST Wed 19 Jan
  • 自动生成Flyway的迁移SQL

    当通过 Java 代码添加新模型 字段等时 JPA Hibernate 的自动模式生成是否可以生成新的 Flyway 迁移 捕获自动生成的 SQL 并将其直接保存到新的 Flyway 迁移中 以供审查 编辑 提交到项目存储库 这将很有用 预
  • 生成的序列以 1 开头,而不是注释中设置的 1000

    我想请求一些有关 Hibernate 创建的数据库序列的帮助 我有这个注释 下面的代码 在我的实体类中 以便为合作伙伴表提供单独的序列 我希望序列以 1000 开头 因为我在部署期间使用 import sql 将测试数据插入数据库 并且我希
  • 从 GitHub 上托管的 Spring Cloud Config Server 访问存储库的身份验证问题

    我在 GitHub 上的存储库中托管配置 如果我将回购公开 一切都好 但如果我将其设为私有 我将面临 org eclipse jgit errors TransportException https github com my user m
  • Java Swing For mac 中的 DJ Native Swing 浏览器

    我有一个用 Swing 制作的 Java 应用程序 并且使用了一个 DJ Native Swing 浏览器 当我尝试在 OS X 上使用它时 它抛出了一个NoClassDefFoundError尽管我添加了 swt jar 但始终如此 有人
  • 了解joda时间PeriodFormatter

    我以为我明白了 但显然我不明白 你能帮我通过这些单元测试吗 Test public void second assertEquals 00 00 01 OurDateTimeFormatter format 1000 Test public
  • GWT 2.3 开发模式 - 托管模式 JSP 编译似乎不使用 java 1.5 兼容性

    无法编译 JSP 类 生成的 servlet 错误 DefaultMessage 上次更新 0 日期 中 0 时间 HH mm ss z 语法 错误 注释仅在源级别为 1 5 时可用 在尝试以开发模式在 Web 浏览器中打开我的 gwt 模
  • HashMap 值需要不可变吗?

    我知道 HashMap 中的键需要是不可变的 或者至少确保它们的哈希码 hashCode 不会改变或与另一个具有不同状态的对象发生冲突 但是 HashMap中存储的值是否需要与上面相同 为什么或者为什么不 这个想法是能够改变值 例如在其上调
  • 如何在 Java 中创建接受多个值的单个注释

    我有一个名为 Retention RetentionPolicy SOURCE Target ElementType METHOD public interface JIRA The Key Bug number JIRA referenc
  • 在 Google App-Engine JAVA 中将文本转换为字符串,反之亦然

    如何从字符串转换为文本 java lang String to com google appengine api datastore Text 反之亦然 Check Javadoc http code google com appengin
  • Resteasy 可以查看 JAX-RS 方法的参数类型吗?

    我们使用 Resteasy 3 0 9 作为 JAX RS Web 服务 最近切换到 3 0 19 我们开始看到很多RESTEASY002142 Multiple resource methods match request警告 例如 我们
  • org.apache.commons.net.io.CopyStreamException:复制时捕获 IOException

    我正在尝试使用以下方法中的代码将在我的服务器中创建的一些文件复制到 FTP 但奇怪的是我随机地低于错误 我无法弄清楚发生了什么 Exception org apache commons net io CopyStreamException
  • 在浏览器刷新中刷新检票面板

    我正在开发一个付费角色系统 一旦用户刷新浏览器 我就需要刷新该页面中可用的统计信息 统计信息应该从数据库中获取并显示 但现在它不能正常工作 因为在页面刷新中 java代码不会被调用 而是使用以前的数据加载缓存的页面 我尝试添加以下代码来修复

随机推荐

  • java 字符串拼接

    最常用的有4种方法 运算符 如果拼接的都是字符串直接量 则适合使用 运算符实现拼接 public static void main String args method1 字符串拼接 public static void method1 S
  • Android MediaPlayer+Stagefright框架(音频)图解

    在android原生的媒体播放器中是由mediaplayerservice来控制媒体播放器的 在mediaplayerservice中创建了mediaplayer 在mediaplayer java的native方法通过jni调用andro
  • java使用jdbc连接hive2出现Required field 'client_protocol' is unset! Struct:TOpenSessionReq

    java sql SQLException Could not establish connection to jdbc hive2 Required field client protocol is unset Struct TOpenS
  • 欢迎进入嵌入式羊圈博客导航一站式搜索(所有博客的汇总帖)

    目录 一 Linux 服务器相关 二 折腾系列 三 日常学习笔记 四 硬件工程师之路 五 T5L迪文屏的开发与应用 六 ZigBee的开发与应用 七 C语言高阶学习笔记 八 嵌入式通信 九 单线通讯 十 单片机 嵌入式 十一 STM8S学习
  • vue常见面试题:computed和watch的区别是什么?

    根据vue官方文档可以看到 computed叫做计算属性 而watch叫做侦听器 顾名思义 计算属性 是依赖其他变量计算出来得到的一个变量 也就是它受别的变量的影响 别的变量一变他就会变 比如 计算属性是基于它们的响应式依
  • 微信公众号服务器配置验证服务器地址token php代码

    做记录
  • 三个小朋友分糖果

    题目描述 有甲 乙 丙三个小朋友 甲有x粒糖果 乙有y粒糖果 丙有z粒糖果 现在他们做一个游戏 从甲开始 将自己的糖平均分三份 自己留一份 其余两份分别给乙与丙 多余的糖果自己吃掉 然后乙与丙也依次这样做 问最后甲 乙 丙三人各有多少粒糖果
  • jquery attr()方法 添加,修改,获取对象的属性值

    转自 http hi baidu com 0701u item b8ec62c1daba973eef466524 jquery中用attr 方法来获取和设置元素属性 attr是attribute 属性 的缩写 在jQuery DOM操作中会
  • 区块链程序要怎么去测试?

    区块链程序开发越来越多 区块链怎么做测试 让大家很好奇 与传统测试不同的是区块链系统边界模糊 不管是是独立的应用程序 还是客户端 服务器模式的应用程序 传统软件都具备明显的系统边界 可以通过UI用户界面或者客户端去进行测试 区块链底层则不同
  • 空间解析几何

    解析几何是用代数方法研究几何对象之间的关系和性质的一门几何学分支 通俗讲就是通过建立坐标系来用方程描述几何图形 在解析几何创立以前 几何与代数是彼此独立的两个分支 而它的出现使形与数统一起来 这是数学发展史上的一次重大突破 在平面解析几何中
  • Unity3D Engine Architecture

    原文 http www umingo de doku php id paper mechs and tanks section03 Architecture To better understand the game s software
  • InfoQ视频直播分享报名:前贝尔实验室、Oracle架构师为你在线揭秘分布式平台内核...

    报名方式 关注InfoQ微信公众号 ID infoqchina 回复 InfoQ 即可观看在线直播技术分享 分享地点 u0026amp 时间 InfoQ直播微课堂将在熊猫 TV 网站播出 看腻了卖肉的女主播 来看看QCon 的明星讲师如何
  • html图片平铺div,前端小知识——图片平铺问题

    图片平铺有两种方式 直接写img标签或者通过background image方式 1 img标签 HTML CSS row margin 0 auto width 100 img width 100 height 100 margin 0
  • 用于Arduino的S4A图形化编程图文详解

    文章结构 1 说明 2 实操 2 1 S4A安装 2 2 Arduino IDE 安装 2 3 下载S4A的固件 2 4 连接 2 5 刷入S4A固件 2 6 打开S4A并测试 3 附录 Uno引脚图 1 说明 作者还拥有个人公众号 会写一
  • Dcat-admin 多级联动

    Dcat admin 2 x 多级联动 需求 一个省市区的三级联动功能 在表单中 需要可以实现三级联动 在列表的查询中 也需要实现三级联动 实现说明 前提 dcat admin 提供了 一个 load 方法 有两个参数 第一个是选项框的字段
  • deepin操作系统无法打开蓝牙

    自己用的deepin系统无法使用蓝牙传送图片 发现系统里面找不到这个功能 可以使用命令安装蓝牙功能 sudo apt install bluetooth blueman blueman assistant 安装以后 很方便手机传送文件
  • 怎样修改一个正在运行的soket的端口

    0 目录 整体架构目录 ASP NET Core分布式项目实战 目录 在开发项目的过程中 我新创建了一个controller 发现vs会给我们直接在controller头添加前缀 比如 Route api controller 即在访问接口
  • ESB开发WebService接口

    1 概述 在进行系统间集成时经常利用WebService 但是从建立WebService和调用的重复性和维护性的工作量都相当大 首先简单介绍一下 ESB全称为Enterprise Service Bus 即企业服务总线 它是传统中间件技术与
  • HertzBeat监控部署及使用

    易用友好的高性能监控告警系统 网站监测 PING连通性 端口可用性 数据库监控 API监控 自定义监控 阈值告警 告警通知 邮件微信钉钉飞书 安装部署 HertzBeat最少依赖于 关系型数据库MYSQL8 实际亲测用mysql5 7 也行
  • 单元测试总结

    概念 百度百科 单元测试 unit testing 是指对软件中的最小可测试单元进行检查和验证 对于单元测试中单元的含义 一般来说 要根据实际情况去判定其具体含义 如C语言中单元指一个函数 Java里单元指一个类 图形化的软件中可以指一个窗