jUnit的学习笔记

news2025/1/24 17:46:26

jUnit学习笔记

      • 要不要做单元测试的思考
      • jUnit的使用
        • jUnit的一些注意事项
        • 注解
        • Assert断言
        • JUnitCore
        • TestCase
        • TestResult
        • TestSuite 测试套件
        • 忽略测试
        • 时间测试
        • 异常测试
        • 参数化测试
      • jUnit中遇到的问题
        • 1.多线程测试时,jUnit自动退出了?
        • 2.测试入库的数据时,执行成功了数据却没有入库?
        • 3.idea中打包去掉test。
        • 4.idea如何根据类生成测试类?

要不要做单元测试的思考

单元测试又称模块测试,是对最小单元的程序模块进行正确性检测。
单元测试本身可以提高代码质量,不过要不要做单元测试,需要从功能的复杂度和功能性质来考虑。
(1)编写的工具类不建议在主程序中出现test的方法,所以可以采用单元测试,这样不会打包到主程序中。
(2)根据功能复杂度考虑单元测试,复杂的功能尽量拆到最小单元,不要让单元测试加重编码负担。
java主要用jUnit单元测试,后面记录下jUnit的使用。

jUnit的使用

maven引入junit包

<dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>自己找一个版本</version>
        <scope>test</scope>
</dependency>

jUnit的一些注意事项

  • 测试方法必须使用 @Test 修饰。
  • 测试方法必须使用 public void 进行修饰,不能带参数。
  • 使用单元测试会新建一个 test 目录存放测试代码,在生产部署的时候不引入 test 目录下代码。
  • 测试代码的包应该和被测试代码包结构保持一致。
  • 测试单元中的每个方法必须可以独立测试,方法间不能有任何依赖。
  • 测试类一般使用 Test 作为类名的后缀。
  • 测试方法使一般用 test作为方法名的前缀。

注解

  • @Test:将一个普通方法修饰成一个测试方法。@Test(excepted=xx.class):xx.class表示异常类,表示测试的方法抛出此异常时,认为是正常的测试通过。@Test(timeout = 毫秒数) :测试方法执行时间是否符合预期。
  • @BeforeClass: 会在所有的方法执行前被执行,static 方法 (全局只会执行一次,而且是第一个运行)。
  • @AfterClass:会在所有的方法执行之后进行执行,static 方法 (全局只会执行一次,而且是最后一个运行)。
  • @Before:会在每一个测试方法被运行前执行一次。
  • @After:会在每一个测试方法运行后被执行一次。
  • @Ignore:所修饰的测试方法会被测试运行器忽略。
  • @RunWith:可以更改测试运行器 org.junit.runner.Runner。

Assert断言

Assert.assertFalse("连接失败!",Objects.isNull(db));
Assert.assertEquals("匹配失败!",2,3);

JUnitCore

测试用例是使用 JUnitCore 类来执行的,每个单元测试类都可以作为测试用例。
JUnitCore 是运行测试的外观类,可通过循环打印错误信息。

public class TestRunner {
    public static void main(String[] args) {
        Result result = JUnitCore.runClasses(TestJunit.class);
        for (Failure failure : result.getFailures()) {
            System.out.println(failure.toString());
        }
        System.out.println(result.wasSuccessful());
    }
}

TestCase

测试样例定义了运行多重测试的固定格式。例如:

public class DBTestCase extends TestCase {
    public void test(){
        int i =this.countTestCases();
        String name=this.getName();
    }
}

TestResult

TestResult收集所有执行测试案例的结果,是收集参数层面的一个实例。它区分失败和错误,失败是可以预料的并且可以通过假设来检查,错误是不可预料的问题比如异常。

public class DBTestResult extends TestResult {
    public synchronized void addError(Test test, Throwable t) {
        super.addError((junit.framework.Test) test, t);
    }
}

TestSuite 测试套件

可以运行很多测试用例。

public static void main(String[] args) {
        //测试套件
        TestSuite suite = new TestSuite(DbTest.class, DBTestCase.class, DBTestResult.class );
        TestResult testResult = new TestResult();
        suite.run(testResult);
        System.out.println("测试数量 = " + testResult.runCount());
    }

测试套件的类

@RunWith(Suite.class)
@Suite.SuiteClasses({ DbTest.class, DemoTest.class })
public class AllTest {
	//此处不写代码,写了也不会执行
}

忽略测试

@Ignore这个注解可以忽略测试,可放到类上也可以放到方法上。

时间测试

@Test(timeout=1000)给测试方法添加了暂停时间,超时会测试停止,并不通过。

异常测试

@Test(expected = XxxxxException.class)为追踪异常的选项,可以测试代码是否它抛出了想要得到的异常。

参数化测试

参数化测试允许开发人员使用不同的值反复运行同一个测试。直接附上官方的代码吧,例子是将预设的参数数据和validate方法进行断言判断是否正确。

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import java.util.Arrays;
import java.util.Collection;
import static org.junit.Assert.assertEquals;

@RunWith(Parameterized.class)
public class ParameterTest {
    private Integer inputNumber;
    private Boolean expectedResult;

    // Each parameter should be placed as an argument here
    // Every time runner triggers, it will pass the arguments
    // from parameters we defined in primeNumbers() method
    public ParameterTest(Integer inputNumber,
                                  Boolean expectedResult) {
        this.inputNumber = inputNumber;
        this.expectedResult = expectedResult;
    }

    @Parameterized.Parameters
    public static Collection primeNumbers() {
        return Arrays.asList(new Object[][] {
                { 2, true },
                { 6, false },
                { 19, true },
                { 22, false },
                { 23, true }
        });
    }

    // This test will run 4 times since we have 5 parameters defined
    @Test
    public void testPrimeNumberChecker() {
        System.out.println("Parameterized Number is : " + inputNumber);
        assertEquals(expectedResult,
                validate(inputNumber));
    }

    public Boolean validate(final Integer primeNumber) {
        for (int i = 2; i < (primeNumber / 2); i++) {
            if (primeNumber % i == 0) {
                return false;
            }
        }
        return true;
    }
}

jUnit中遇到的问题

1.多线程测试时,jUnit自动退出了?

jUnit执行完主程序会自动结束,就一起将子线程也断掉了。解决这种情况需要用到计数器CountDownLatch。

	@Test
    public void testThread() throws InterruptedException {
        TestClass testClass = new TestClass();
        //同步计数器
        int count = 20;
        CountDownLatch countDownLatch = new CountDownLatch(count);
        for (int i = 1; i <= count; i++) {
            new Thread(() -> {
            	//业务处理
                testClass.write(path, "writeString");
                countDownLatch.countDown();
            }).start();
        }
        countDownLatch.await();
    }

2.测试入库的数据时,执行成功了数据却没有入库?

由于junit不会将数据真是存入数据库,想要真实入库需要自己加commit提交。

3.idea中打包去掉test。

图中图标可去掉test。
去掉test

4.idea如何根据类生成测试类?

光标放到类名上,alt+enter,选择create test,即可在test目录下得到测试类。

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

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

相关文章

各种激活函数的计算公式、图像以及实现代码

激活函数已经成为神经网络中非常重要的一部分&#xff0c;随着各种类型的神经网络模型被人们开发出来&#xff0c;各种激活函数也应运而生&#xff0c;在不同的场景中&#xff0c;取得良好的效果。本文跟据著名的YOLO系列目标检测模型的源码 AlexeyAB Darknet&#xff0c;整理出…

HTML第5天 HTML新标签与特性

新标签与特性文档类型设定前端复习帮手W3Schoool常用新标签datalist标签&#xff0c;与input元素配合&#xff0c;定义选项列表fieldset元素新增input表单文档类型设定 document – HTML: 开发环境输入html:4s – XHTML: 开发环境输入html:xt – HTML5: 开发环境输入html:5 前…

如何在知行之桥EDI系统中定时自动更换交易伙伴AS2证书?

为了保证客户与交易伙伴之间数据传输的安全性&#xff0c;AS2传输协议中&#xff0c;通常会通过一对数字证书对传输数据进行签名和加密。但是证书是有有效期的&#xff0c;在证书到期之前&#xff0c;需要贸易双方及时更换新的证书。 在更新证书时&#xff0c;由于客户通常是和…

第十六节 接口

接口 接口是一种规范。规范也是一种公开的。 接口中的成分特点&#xff1a;JDK8之前接口中只能有抽象方法和常量。 接口的用法&#xff1a; ●接口是用来被类实现(implements)的&#xff0c;实现接口的类称为实现类。实现类可以理解成所谓的子类。 从上面可以看出&#xff0c…

网络的瓶颈效应

python从小白到总裁完整教程目录:https://blog.csdn.net/weixin_67859959/article/details/129328397?spm1001.2014.3001.5501 ❤ 网络的瓶颈效应 网络瓶颈&#xff0c;指的是影响网络传输性能及稳定性的一些相关因素&#xff0c;如网络拓扑结构&#xff0c;网线&#xff0…

了解栈Stack一篇文章就够了

什么是栈栈是一种特殊的线性表&#xff0c;只允许一端进行数据的插入和删除&#xff0c;即先进后出原则。类似于弹夹先装进去的子弹后面出&#xff0c;后放入的子弹先出。栈的底层原理栈是一种线性结构&#xff0c;所以既能使用数组实现&#xff0c;也能使用链表实现&#xff0…

【蓝桥杯刷题训练营】day05

1 数的分解 拆分成3个数相加得到该数 然后采用了一种巨愚蠢的办法&#xff1a; int main() {int count 0;int a 2;int b 0;int c 1;int d 9;int a1, a2, a3;int c1, c2, c3;int d1, d2, d3;for (a1 0; a1 < 2; a1){for (a2 0; a2 < 2; a2){for (a3 0; a3 <…

中断和事件

目录 中断概述 什么是中断&#xff1f; 什么是EXTI&#xff1f; EXTI初始化结构体&#xff1a; 中断/事件线&#xff1a; EXTI模式&#xff1a; 触发类型&#xff1a; EXTI控制&#xff1a; 什么是优先级&#xff1f; 什么是优先级分组&#xff1f; 什么是NVIC&#…

【Java】最新版本SpringCloudStream整合RocketMQ实现单项目中事件的发布与监听

文章目录前言依赖配置代码参考前言 SpringCloud项目中整合RocketMQ是为了削峰填谷。 这里我使用RocketMQ的作用用于接收项目中产生的消息&#xff0c;然后异步的发送邮件给客户&#xff0c;这是这个项目的产生的背景。 依赖配置 <dependencies><dependency><…

开发钉钉微应用,实现免登+调试

1.创建h5微应用 https://open.dingtalk.com/document/orgapp/develop-org-h5-micro-applications 根据里面的三个步骤,创建h5微应用 2.免登之前必须要先进行JSAPI的授权 文档说明: https://open.dingtalk.com/document/orgapp/jsapi-authentication 根据文档中的说明 步骤…

spring事物源码分析

今天的任务是剖析源码&#xff0c;看看Spring 是怎么运行事务的&#xff0c;并且是基于当前最流行的SpringBoot。还有&#xff0c;我们之前剖析Mybatis 的时候&#xff0c;也知道&#xff0c;Mybatis 也有事务&#xff0c;那么&#xff0c;他俩融合之后&#xff0c;事务是交给谁…

MySQL (六)------MySQL的常用函数、 事务(TCL)、DCL用户操作语句、常见环境、编码问题

第一章 MySQL的常用函数 1.1 字符串函数 1.1.1 字符串函数列表概览 函数用法CONCAT(S1,S2,......,Sn)连接S1,S2,......,Sn为一个字符串CONCAT_WS(separator, S1,S2,......,Sn)连接S1一直到Sn&#xff0c;并且中间以separator作为分隔符CHAR_LENGTH(s)返回字符串s的字符数LENGTH…

深入理解性能压测工具原理

如果没有性能测试工具如何通过手工实现 如果没有性能测试工具&#xff0c;通过手工进行性能测试&#xff0c;这是一个值得我们思考的问题。这时候需要一个协调员发送指令&#xff0c;一个操作员进行操作&#xff0c;对系统施加压力&#xff0c;多个操作员代表着多个用户进行并…

面向对象设计模式:创建型模式之原型模式

文章目录一、引入二、代理模式&#xff0c;Prototype Pattern2.1 Intent 意图2.2 Applicability 适用性2.3 类图2.4 应用实例&#xff1a;使用下划线或消息框展示字符串2.4 应用实例&#xff1a;JDK java.lang.Object java.lang.Cloneable一、引入 二、代理模式&#xff0c;Pr…

Python—看我分析下已经退市的 可转债 都有什么特点

分析 需求分析 可转债退市原因的种类与占比是多少 强赎与非强赎导致的退市可转债 存续时间 维度占比 强赎与非强赎导致的退市可转债 发行资金 规模占比 强赎与非强赎导致的退市可转债 各个评级 的占比 强赎与非强赎导致的退市可转债 各个行业&#xff08;一级行业&#xf…

互相关延时估计 Matlab仿真

文章目录互相关延时估计什么是互相关延时估计&#xff1f;原理代码实现总结互相关延时估计 互相关延时估计是一种信号处理技术&#xff0c;用于计算两个信号之间的时间延迟。在本篇博客中&#xff0c;我们将使用MATLAB来实现互相关延时估计&#xff0c;并提供多个例子和代码&a…

TypeScript深度剖析: TypeScript 中函数的理解?与 JavaScript 函数的区别?

一、是什么 函数是 JavaScript 应用程序的基础&#xff0c;帮助我们实现抽象层、模拟类、信息隐藏和模块 在 TypeScript 里&#xff0c;虽然已经支持类、命名空间和模块&#xff0c;但函数仍然是主要定义行为的方式&#xff0c;TypeScript 为 JavaScript 函数添加了额外的功能…

English Learning - L2-5 英音地道语音语调 弹力双元音 [ɪə] [ʊə] [eə] 2023.03.6 周一

English Learning - L2-5 英音地道语音语调 弹力双元音 [ɪə] [ʊə] [eə] 2023.03.6 周一朗读节奏元音的长度元音发音在清辅音和浊辅音前的区别元音发音跟后面浊辅音节数的区别元音在重读音节中复习大小元音发音对比/ʌ/ 舌中音/ɒ/ 舌后音/ʊ/ 舌后音/ɪ/ 舌前音[ɑ:] VS […

Jenkins+Docker自动化部署项目

看到了一篇文章&#xff0c;实操一下自动部署的感觉。参看地址&#xff1a;原文 首先更新docker&#xff0c;我更新到了 [rootlocalhost springboot]# docker --version Docker version 23.0.1, build a5ee5b1跟新步骤&#xff1a; yum update#卸载旧版本 yum remove dock…

Nginx支持quic协议

第一种方式&#xff1a;Nginx官方nginx-quic搭建 通过部署Nginx官方的QUIC分支来实现的浏览器和nginx-quic服务器粗略的HTTP3通信。 1、下载BoringSSL BoringSSL 是由谷歌开发,从 OpenSSL 中分离的一个分支。BoringSSL 是 Chrome/Chromium、Android&#xff08;但它不是 NDK 的…