Junit单元测试入门与整理

Junit4 单元测试 最近公司一直在鼓励写单元测试,故最近自己也整理了些比较常用的单元测试用法,在这里跟大家分享!以下便是我们经常写的一个测试类,那么其中的一些内容我们是否完全都理解呢,下面我来给大家介绍下:package com.lyancafe.csr.bo; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.tim 阅读详情


单元测试整理-分享

PS:未完待续,持续更新中。。。

先简单说一下为什么要写测试用例
1. 可以避免测试点的遗漏,为了更好的进行测试,可以提高测试效率
2. 可以自动测试,可以在项目打包前进行测试校验
3. 可以及时发现因为修改代码导致新的问题的出现,并及时解决

1. 单元测试介绍:

单元测试是编写的一小段代码,用于检验目标代码的一个很小的、很明确的功能模块是否正确。为了证明这段代码的行为和我们期望的是否一致。目前的单元测试框架有JUnit、Mockito、Unitils,其中Junit是一个基于xUnit的测试框架,是目前进行单元测试的主要工具。

单元测试推荐的一本书是《JUnit实战(第2版)》。
这里写图片描述


2. idea环境相关介绍:

一个java项目应该有三个路径,Sources, Test和Resources三个部分,Sources是你的开发代码,Test是你的测试代码,Resources是你的资源文件或配置文件。
这里写图片描述

在class类名字处打开IntelliJ的quickLips,就可以看到如下的画面:
这里写图片描述

然后我们选择Create Test, 接下来会出现
这里写图片描述

idea就会生成一个这样的文件
这里写图片描述

单元测试的运行界面为
这里写图片描述
绿条表示程序正常的运行且通过了,如果为红条则表示程序中存在bug不可以正常的运行。其中console也可以显示你的所有输出。当然你也可以在非测试方法的地方右击选行运行整个测试类。


3. 单元测试基本概念:

1. JUnit基本注解介绍:

//在所有测试方法前执行一次,一般在其中写上整体初始化的代码
@BeforeClass

//在所有测试方法后执行一次,一般在其中写上销毁和释放资源的代码
@AfterClass

//在每个测试方法前执行,一般用来初始化方法(比如我们在测试别的方法时,类中与其他测试方法共享的值已经被改变,为了保证测试结果的有效性,我们会在@Before注解的方法中重置数据)
@Before

//在每个测试方法后执行,在方法执行完成后要做的事情
@After

// 测试方法执行超过1000毫秒后算超时,测试将失败
@Test(timeout = 1000)

// 测试方法期望得到的异常类,如果方法执行没有抛出指定的异常,则测试失败
@Test(expected = Exception.class)

// 执行测试时将忽略掉此方法,如果用于修饰类,则忽略整个类
@Ignore(“not ready yet”)
@Test
@RunWith

2. Junit4断言
实现数组比较断言

String[] users = new String[]{"tom", "sharp", "tony"};
Assert.assertArrayEquals(new String[]{"tom", "sharp", "tony"}, users);

3. 异常测试

//预期抛出空指针异常
@Test(expected=NullPointerException.class)
public void method() {
    assertNotNull(user.getUserName());
}

4. 超时测试

@Test(timeout = 10)//10ms
public void method() {

}

4. controller层单元测试:

环境配置:

@RunWith(SpringJUnit4ClassRunner.class) //指定测试启动器
@SpringApplicationConfiguration(classes = Application.class)//指定SpringBoot工程的Application启动类
@WebAppConfiguration //Web项目中,Junit需要模拟ServletContext,由该注解提供
@ActiveProfiles("test")
public class V2MerchantControllerTest {}

备注:如果配置不正确会导致运行失败。

对模块进行集成测试时,希望能够通过输入URL对Controller进行测试,如果通过启动服务器,建立http client进行测试,这样会使得测试变得很麻烦,比如,启动速度慢,测试验证不方便,依赖网络环境等,这样会导致测试无法进行,为了可以对Controller进行测试,可以通过引入MockMVC进行解决。

MockMvc实现了对Http请求的模拟,能够直接使用网络的形式,转换到Controller的调用,这样可以使得测试速度快、不依赖网络环境,而且提供了一套验证的工具,这样可以使得请求的验证统一而且很方便。

MockMvc的初始化工作

private MockMvc mockMvc;

@Autowired
private WebApplicationContext webApplicationContext;

@Before
public void setUp() throws Exception {
    this.mockMvc = webAppContextSetup(webApplicationContext).build();
}

获取商户列表的一个测试用例:

@Test
public void getMerchantList() throws Exception {
    //mockMvc.perform(get("/v2/merchants/list"));//执行一个RequestBuilder请求
    mockMvc.perform( //执行一个RequestBuilder请求
            get("/v2/merchants/") //请求的URL, 请求的方法是get
                    .contentType(requestcontentType) //数据的格式
                    .param("userid", "2") //添加参数
                    .param("token", "1") //登录凭证
                    .param("type", "2") //1、查自己, 2、查全部
                    .param("page", "1") //默认从1开始
                    .param("limit", "20") //每页条目数, 默认20条

    )
            .andExpect(status().isOk()) //返回的状态是200
            .andDo(print())//打印出请求和相应的内容
            .andReturn().getResponse().getContentAsString(); //将相应的数据转换为字符串

}

5. service层单元测试

同controller一样的配置
示例代码:

//com.nuanyou.bdpal.service.UserService

@Test
public void findCountryCodeByUserId() throws Exception {
    System.out.println("输出结果为:");
    System.out.println(userService.findCountryCodeByUserId(14L));
    System.out.println("输出结束");
}

6. dao层单元测试

DAO层的大部分工作都是对数据库中相应的表进行CRUD操作。

示例代码:

//com.nuanyou.bdpal.dao.bd.EntityBdCertificateGroupDao

@Test
public void findByCountryIdAndUserId() throws Exception {
    System.out.println("输出的结果为:");
    System.out.println(dao.findByCountryIdAndUserId(1L, 14L));
}

注意事项:
JUnit非常智能的,他将你的测试程序执行完成之后,会回滚所有的操作,做到了测试代码不影响项目程序的要求,也就解释了为什么你测试程序运行后去查看数据库并没有变化,因为所有的操作都被回滚了。你可以通过看测试的状态条是否为绿色来判断程序的正确性,或者加入几条输入语句来confirm一下。


7. 单元测试三十六计

实际进行单元测试时,具体的情形分为很多种,实际操作比理论更加丰富。总体单元测试分为mock形式和调用真实的依赖两种,mock形式单元测试将另起一篇博客,本文主要介绍调用真实依赖时一些特殊情形的处理。

1. mock形式进行单元测试

模拟mock方式进行单元测试

2. 调用真实依赖进行单元测试

  • 对private私有方法的单元测试

对私有方法单元测试的场景比较少,目前并没有测试框架进行太好的支持,本文主要采用反射的方式进行单元测试,适用于比较简单的私有方法,对复杂的私有方法进行单元测试将是一场噩梦。具体的代码示例如下:

//实例化
Constructor<SharpDemo> constructor = SharpDemo.class.getDeclaredConstructor();
constructor.setAccessible(true);
SharpDemo sharp = constructor.newInstance();

//私有方法
Method method = sharp.getClass().getDeclaredMethod("privateMethodName", 参数1.class, 参数2.class...);
method.setAccessible(true);

//执行方法
ResultBean result = (ResultBean) method.invoke(sharp, "12345678", "abcd"...);

8. 注意事项:

JUnit注意事项
1. 测试方法上必须使用@Test进行修饰。
2. 测试方法必须使用public void进行修饰,不能带任何的参数。
3. 新建一个源代码目录来存放我们的测试代码。
4. 测试类的包应该和被测试类保持一致。
5. 测试单元中的每个方法必须可以独立测试,测试方法不能有任何的依赖。

可能遇到的问题:
1. 配置环境不正确导致运行失败
2. 测试方法应该为public

测试失败的两种情况
1. Failure一般由单元测试使用的断言方法判断失败所引起的,这表示测试点发现了问题,就是说程序输出的结果和我们预期的不一样。
2. Error是由代码异常引起的,它可以产生于测试代码本身的错误,也可以是被测试代码中的一个隐藏的bug。

轻松掌握 Java 单元测试与集成测试:JUnit、Mockito 与 Spring Test 指南 JUnit 是一个开源的 Java 测试框架,用于测试 Java 类的行为。它提供了简单的注解和断言方法,使得编写和执行测试变得非常方便。Mockito 是一个强大的 Java 模拟框架,它能够帮助我们为类的依赖关系创建模拟对象(Mock)。模拟对象允许开发人员隔离要测试的类,避免其依赖外部组件或者实际实现,从而进行更为纯粹的单元测试。 阅读详情

相关推荐

JUnit是什么?

JUnit是一个开发源代码的Java测试框架,用于编写和运行可重复的测试。他是用于单元测试框架体系xUnit的一个实例(用于java语言)。它包括以下特性: 1、用于测试期望结果的断言(Assertion) 2、用于共享共同测试数据的测试工具 3、用于方便的组织和运行测试的测试套件 4、图形和文本的测试运行器 JUnit最初是由Erich Gamma(GoF之一)和Kent B

ArduousBonze的专栏 6576

junit单元测试快速入门

目录 一。在eclipse中打开或新建被测项目工程 1.新建java工程 JunitDemo001,并添加文件 Calc.java 2.为类文件添加代码 二。使用junit创建单元测试用例 三。完善和增加用例 四、运行单元测试用例 junit 补充知识: 1.junit注解 2.junit'测试用例执行结果的查看 一。在eclipse中打开或新建被测项目工程 为了便于大家学习,减少由于代码不同而产生的差异,下面大家跟随我创建一个简单的java工程,作为被测代码。 1.新建...

caohongxing的博客 5453

走进JavaWeb技术世界11:单元测试框架Junit

本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下Star哈 文章首发于我的个人博客: www.how2playlife.com 本文是微信公众号【Java技术江湖】的《走进JavaWeb技术世界》其中一篇,本文部分内容来源于网络,为了把本文主题...

AliCoder的博客 818

超级详细的Junit单元测试教程

如果你只会使用@Test来完成单元测试,那你是时候该深入一下了,其实知识点一点都不少!

奈何的人生 10万+

[FreeRTOS+STM32CubeMX] 03 USART串口调试-基于中断实现接收和发送数据

我们接着上一小节,上一节讲到,接收上位机传来的数据时,需要事先知道传来的数据的字节数,这一操作实在有些反人类,那么如何解决这个问题,上位机输入多少,我们就接收多少数据呢? 接下来我将把USART引入中断,在接收数据的回调函数中引入二值信号量、消息队列,来让我的接收数据能够存储在队列中,并一个一个的在任务中输出出来,并最终在上位机回显。

RichieHuang的博客 2649

Vue中实现word文档渲染、在线编辑、保存

Vue3对word文档进行渲染、编辑、保存。word转成html,html转成word

h18749849699的博客 1328

junit测试security框架下有权限验证的controller

废话不多说,上干货。 1、用postman测试的时候,由于有鉴权所以需要传一个token如下图所示: 2、因此我们在单元测试的时候也要传一个token到header里面,不然的话会报错:{“code”:1,“message”:“Full authentication is required to access this resource”,“data”:“Full authentication ...

weixin_43693592的博客 2284

【TM1650】STM8S TM1650芯片控制程序

以下为.h文件: #ifndef __TM1650_I2C_H #define __TM1650_I2C_H #include "stm8s.h" #include "stm8s_gpio.h" #include "tim1.h" #include "usart2.h" #include &lt;iostm8s103f3.h&gt; #include &lt;intrinsics....

cxw312864660的博客 1万+

SpringCloud 微服务Junit测试(Controller层) 包含Fegin调用远程服务(本机调用开发环境机器上部署的微服务)

SpringBootTest(classes={TestApplication.class}) //Springboot启动类。@Component //Junit必须设置此注解。@BeforeEach //junit5注解。* 2 获取用户的token。* 1 初始化Mock。//先获取短信验证码。

awsbamboo115的博客 585

《QEMU/KVM源码分析与应用》读书笔记1 —— 第1章 QEMU与KVM概述

《QEMU/KVM源码分析与应用》学习笔记1 —— 第一章 QEMU与KVM概述

phmatthaus的专栏 1984

仿真系列专栏介绍

大家好!欢迎来到我的仿真学习系列专栏!这是一个我在学习仿真技术过程中整理和分享的系列文章。作为一名正在不断学习和实践的工程师,我希望通过这个专栏,和大家一起探索仿真技术,尤其是在高速信号完整性方面的应用。

案例文章,高速信号 368

【软件测试】JUnit 单元测试 基础学习教程

单元测试是针对最小的功能单元编写测试代码- Java 程序最小的功能单元是方法单元测试就是针对单个 Java 方法的测试专门针对 Java 语言设计,使用广泛;JUnit 是事实上的标准单元测试框架。1、一个 TestCase 包含一组相关的测试方法;2、使用断言测试结果(注意浮点数 assertEquals 要指定 delta )3、每个测试方法必须完全独立;4、测试代码必须非常简单;5、不能为测试代码再编写测试6、测试需要覆盖各种输入条件,特别是边界条件。JUnit。

凤枝桠的博客 8143

PyTorch深度学习实战(29)——变分自编码器(Variational Autoencoder, VAE)

变分自编码器 (Variational Autoencoder, VAE) 是一种结合了自编码器和概率建模的生成模型,通过编码器将输入数据映射到潜在空间中的概率分布,并通过解码器将从潜在空间采样得到的潜在变量映射回原始数据空间,实现了数据的生成和特征学习。

盼小辉丶的博客 1万+

JUnit单元测试常用方法知识整理

一、为什么要进行测试 二、什么是单元测试 三、IDEA下创建JUnit

qq_52019899的博客 9233

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

JUnit 面试题及答案整理,最新面试题

2、在JUnit 5中,可以使用JUnit Platform的支持来运行多个测试类,通过使用@SelectClasses或@SelectPackages等注解来选择包含的测试类或包。@Nested 注解允许在JUnit 5中创建嵌套的测试类,用于对测试进行逻辑分组,并保持测试代码的结构化和组织性。动态测试允许在运行时生成测试用例,与静态测试(@Test注解的测试)不同,动态测试可以根据代码中的逻辑和数据动态创建测试用例。参数化测试是JUnit中的一种测试方式,它允许使用不同的参数多次运行同一个测试。

知识极客 2043

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

JUnit 单元测试

总之,JUnit 是 Java 中最流行的单元测试框架之一,它提供了一个简洁而强大的平台,用于编写和运行自动化测试。JUnit 的核心就是那几个测试方法注解:⨳ @Test是最基本的测试注解,用于独立的、简单的测试场景。可以使用各种参数源(如数组、CSV 文件、方法等)提供测试输入,适用于参数化测试场景。通过指定重复次数,测试方法会被多次执行。这在需要验证方法的幂等性或检查重复执行时的行为时非常有用。适合高级场景,通过扩展机制重复执行同一个测试方法,但每次在不同的上下文中运行。

2301_78976656的博客 1303

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Spring如何使用junit进行单元测试

这篇文章主要介绍了Spring整合junit单元测试,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。 为什么需要单元测试? 在平时的开发当中,一个项目往往包含了大量的方法,可能有成千上万个。如何去保证这些方法产生的结果是我们想要的呢?当然了,最容易想到的一个方式,就是我们通过System.out来输出我们的结果,看看是不是满足我们的需求,但是项目中这些成千上万个方法,我们总不能在每一个方法中都去输出一遍嘛。这也太枯燥了。这时候用我们的单元测试框架junit就可以很好地

怪咖@的博客 3533

Java单元测试与JUnit4使用

前言很多小伙伴都一直有一个问题,我们在使用Java编码的过程中需要对已经编写的类和方法进行测试,比较常见的就是在main方法中去调用。但是当我们的项目比较大的时候,这种方法就显得不那么可行了,本节我们就来学习如何在Java中使用单元测试对我们的代码进行单元测试。学习内容。

2401_84046895的博客 909

从零入门 Java 单元测试 —— Junit 框架详解

在软件开发中,单元测试是必不可少的一环,缺少单元测试,软件上线后经常会问题百出。如果有了单元测试,这些问题大多是可以及时发现和处理的。因此,掌握单元测试是一个高端程序员的必备技能之一,无...

实验楼 659

单元测试整理(六)—— 使用EasyMock和JUnit进行单元测试

EasyMock是Apache许可下发布的Java开源测试框架,它可以和jUnit很好的继承在一起。该框架允许为测试驱动开发(TDD)或行为驱动开发(BDD)创建测试双重对象1。使用EasyMock只需导入相应的jar包即可,本篇用到的所有jar包和代码都可以在我的Github下载。 在这里我们用一个进行用户验证的servlet代码作为被测代码,这段代码来自我之前看过的一篇EasyMock教程2

potatostyles的博客 5433

Junit单元测试基础知识入门简介

JUnit是一个Java语言的单元测试框架,多数Java的开发环境(像eclipse)都已经集成了JUnit作为单元测试的工具。 Junit测试是一个回归测试框架,是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件如何(How)完成功能和完成什么样(What)的功能。 Junit测试的优点: 1、可以使测试代码与产品代码分开。 2、针对某一个类的测试代码通过较少的改动便可以应用于

冯丰枫的博客 1373

【JAVA】单元测试工具-junit学习心得

最近新项目对单元测试要求很高,对我来说是一种新的挑战。用了几天,发现单元测试真的能减少很多愚蠢的错误,也正是因为我之前从来没有用过,才感受特别明显。所以整理一下单元测试的一些内容。 1 单元测试 1.1 什么是单元测试 所谓单元测试是测试应用程序的功能是否能够按需要正常运行,并且确保是在开发人员的水平上,单元测试生成图片。单元测试是一个对单一实体(类或方法)的测试。单元测试是每个软件公司提高...

猫球球的博客 2233

Junit的简单整理

一、简单介绍     JUnit是一个Java语言的单元测试框架。基于Xunit架构的单元测试框架的实例。 二、应用场景     JUnit在日常的工作中经常用到,比如,本文会对超时、异常、参数化、规则等方面进行举例。日常的使用大体分为两种情况:     一种最简单的方式是在方法上标注@Test注解进行测试;     另一种是需要整合Spring的配置文件进行bean的创建、数据库的连接...

u012354570的博客 757
上一篇: Java网络编程
下一篇: 【更新中1】模拟mock方式进行单元测试
单骑走天下
博客等级 码龄15年 9粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值