Java 单元测试

news2024/11/17 11:03:30

目录

一、Junit

1.1、单元测试初始化与清理资源

1.2、捕获异常

1.3、条件测试

1.4、标记失效测试方法

1.5、参数化测试


        单元测试:是对最小功能单元编写的测试代码。

        示例,当开发好一个 Java 阶乘的方法。        

        n! = 1 x  2 x  3 x ....x n

        代码如下:

public static long fact(long n) {
        long r = 1;
        for (long i = 1; i <= n; i++) {
            r = r * i;
        }
        return r;
    }

        需要测试这个方法,一般都在 main 方法执行测试。

public class Main {
    public static void main(String[] args) {
    	System.out.println(Main.fact(3));
    }
    
    public static long fact(long n) {
        long r = 1;
        for (long i = 1; i <= n; i++) {
            r = r * i;
        }
        return r;
    }
}

        main 方法做测试有如下缺点:

1、不能把测试代码分离

2、没有打印出测试结果和期望结果

3、比较难编写出通用测试代码

一、Junit

        Junit 是一个开源的 Java 语言的单元测试框架。针对 Java 设计,使用广泛。使用 Junit 编写单元测试好处在于:

1、简单地组织测试代码,并随时运行它们。

2、会给出成功与失败结果,还可以生产测试报告,不仅包含测试成功率,还可以统计测试的代码覆盖率(即被测试的代码本身有多少经过测试)

3、单元测试互相独立,不依赖运行顺序

         单元测试可以使用断言 Assertions 。断言可以对程序运行的结果做一个判断。

1.1、单元测试初始化与清理资源

        一般写单元测试时,当需要初始化数据时可以在方法上使用注解@BeforeEach,当我们测试完成,需要关闭资源时在方法上使用注解@AfterEach。

1.2、捕获异常

package com.demo;

import static org.junit.jupiter.api.Assertions.assertThrows;

import org.junit.jupiter.api.Test;

public class Main {
	
	@Test
	public void testException() {
		assertThrows(IllegalAccessError.class, ()->{
			Main.fact(-1);
			
		});
		
	}
	public static long fact(long n) {
		if(n < 0) {
			throw new IllegalAccessError();
		}
        long r = 1;
        for (long i = 1; i <= n; i++) {
            r = r * i;
        }
        return r;
    }
}

        Junit 提供  assertThrows() 来捕获一个指定异常。

        第一个参数:异常类型

        第二个参数:执行代码,也可以理解发生异常代码。

1.3、条件测试

        @EnabledOnOs 是一个条件判断。

        示例:在 Windows 和 Linux系统执行不一样的测试方法。

package com.demo;

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.EnabledOnOs;
import org.junit.jupiter.api.condition.OS;

public class Main {
	
	@Test
	@EnabledOnOs(OS.WINDOWS)
	void testWindows() {
	    System.out.println("window");
	}

	@Test
	@EnabledOnOs({ OS.LINUX, OS.MAC })
	void testLinuxAndMac() {
		  System.out.println("linux or mac");
	}
}

1.4、标记失效测试方法

        可以使用@Disabled注解。

        示例

package com.demo;

import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;

public class Main {
	@Test
	void test() {
	    System.out.println("test");
	}
	
	@Test
	@Disabled
	void testDisabled() {
	    System.out.println("Disabled");
	}
}

1.5、参数化测试

        如果待测试的输入与输出是一组数据,可以把从测试的数据组织起来,用不同的测试数据调用相同测试方法。

        Junit 提供了一个 @ParameterizedTest 注解,用来进行参数化测试。

package com.demo;

import static org.junit.Assert.assertEquals;

import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;

public class Main {
	
	@ParameterizedTest
	@ValueSource(ints = { 0, 1, 5, 100 })
	void testAbs(int x) {
	    assertEquals(x, Math.abs(x));
	}
	
	@ParameterizedTest
	@ValueSource(ints = { -1, -5, -100 })
	void testAbsNegative(int x) {
	    assertEquals(-x, Math.abs(x));
	}
}

        另一种传入测试参数的方法是使用@CsvSource,它的每一个字符串表示一行,一行包含的若干参数用,分隔

package com.demo;

import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;

public class Main {
	
	@ParameterizedTest
	@CsvSource({ "abc, Abc", "APPLE, Apple", "gooD, Good" })
	void testCapitalize(String input, String result) {
		System.out.println(input+" "+ result);
	}
}

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

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

相关文章

CRM软件哪个好?该如何选择?

CRM软件哪个好&#xff1f;该如何选择&#xff1f; CRM是集营销、销售、服务为一体的围绕客户全生命周期管理的系统&#xff0c;在各行各业的数字化转型大潮中&#xff0c;作为以消费者、终端用户、客户为主导的企业经营管理核心系统&#xff0c;CRM选型的难度和复杂度也在不断…

关于ETL的两种架构(ETL架构和ELT架构)

ETL&#xff0c;是英文 Extract-Transform-Load 的缩写&#xff0c;用来描述将数据从来源端经过抽取&#xff08;extract&#xff09;、转换&#xff08;transform&#xff09;、加载&#xff08;load&#xff09;至目的端的过程。ETL一词较常用在数据仓库&#xff0c;但其对象…

Java的JVM垃圾回收机制GC概述

JVM——GC机制1、什么是GC&#xff1f;2、GC算法的总体概述3、JVM所处的位置4、JVM整体结构5、JVM架构模型6、Java垃圾回收机制优缺点7、GC主要关注的区域垃圾回收算法&#xff1a;标记阶段&#xff0c;引用计数循环引用标记阶段&#xff1a;可达性分析算法GC root可以是哪些&a…

JavaScript代码题--以及一些奇奇怪怪的发现

解析 let a{b:10,c:{d:[11,12],e:13}}&#xff0c;实现 10111213 效果 解 const a{b:10,c:{d:[11,12],e:13}}function sum(obj) {let total 0;const value Object.values(obj)value.forEach(item>{total typeof item number ? item : sum(item)})return total }const …

Java家教系统家教网站家教兼职系统

简介&#xff1a; 用户可以注册成为学员也可以是教员。教员发布家教信息&#xff0c;学员根据自己的要求查找符合自己的教员。学员预约教员的某一天去家教&#xff0c;教员可以在个人中心里查看&#xff0c;是否接受该预约。在教员接受或拒绝之前&#xff0c;学员随时可以取消…

数据库,计算机网络、操作系统刷题笔记23

数据库&#xff0c;计算机网络、操作系统刷题笔记23 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;oracle…

基于 Vue 制作一个猜拳小游戏

目录前言&#xff1a;项目效果展示&#xff1a;对应素材&#xff1a;代码实现思路&#xff1a;实现代码&#xff1a;总结&#xff1a;前言&#xff1a; 在工作学习之余玩一会游戏既能带来快乐&#xff0c;还能缓解生活压力&#xff0c;跟随此文一起制作一个小游戏吧。 描述&…

【2042. 检查句子中的数字是否递增】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 句子是由若干 token 组成的一个列表&#xff0c;token 间用 单个 空格分隔&#xff0c;句子没有前导或尾随空格。每个 token 要么是一个由数字 0-9 组成的不含前导零的 正整数 &#xff0c;要么是一个…

ORA-00600 kcratr_nab_less_than_odr 问题处理

问题&#xff1a;ORA-00600: 内部错误代码, 参数: [kcratr_nab_less_than_odr], [1], [196495], [39399], [39460], [], [], [], [], [], [], []导致原因&#xff1a;可能是由于服务器宕机&#xff0c;控制文件的缺失&#xff0c;或者在线日志文件在实例恢复时不完整1、数据库未…

5G边缘计算网关助力5G工业物联网智能化建设

5G边缘计算&#xff0c;凭借高带宽、高可靠、低时延、移动性等特性&#xff0c;推动工业生产物联网发展趋势&#xff0c;实现工业更快、更精准通信及数据共享。边缘计算网关下5G工业物联网远程感知生产一线&#xff0c;工控数字化、自动化、智能化&#xff0c;降低人物力资源成…

LeetCode 2042. 检查句子中的数字是否递增

【LetMeFly】2042.检查句子中的数字是否递增 力扣题目链接&#xff1a;https://leetcode.cn/problems/check-if-numbers-are-ascending-in-a-sentence/ 句子是由若干 token 组成的一个列表&#xff0c;token 间用 单个 空格分隔&#xff0c;句子没有前导或尾随空格。每个 tok…

【计算机体系结构】指令集并行(ILP)动态调度算法:Tomasulo实现代码(Tomasulo Algorithm Implementation)

Tomasulo Algorithm Implementation &#xff08;本文章仅提供算法实现过程&#xff0c;具体算法思想请查阅教科书&#xff09; 如果觉得这篇文章有用&#xff0c;请记得点个赞并收藏哦&#xff01; 1.Introduction Tomasulo算法用于指令的动态调度&#xff0c;允许乱序执行…

C C++内存对齐以及特殊类的大小

目录C语言内存对齐现象内存对齐规则为什么存在内存对齐如果struct or class中存在成员函数时的大小空类大小为1Cclass存在虚函数时的大小C语言 内存对齐现象 C语言中结构体的大小往往不是结构体中各种数据类型的加和&#xff0c;因为存在内存对齐; struct S {double d;//8字…

Linux常用系统日志

文章目录一 常用系统日志二 系统日志优先级三 其他日志文件一 常用系统日志 日志文件用途/var/log/messages记录大多数系统日志信息&#xff0c;包括启动、IO错误、网络和程序等问题/var/log/secure记录安全和身份验证等相关消息和错误/var/logrsyslog将所有日志文件写入到该目…

Nacos 漏洞利用

Nacos 漏洞利用 1.漏洞描述&#xff1a; Alibaba Nacos是阿里巴巴推出来的一个新开源项目&#xff0c;是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。致力于帮助发现、配置和管理微服务。Nacos提供了一组简单易用的特性集&#xff0c;可以快速实现动态…

ASP.NET企业智能办公OA系统源码带文档【源码免费分享】

ASP.NET企业智能办公OA系统源码带文档 需要源码学习可私信我获取&#xff01; 本系统特色功能&#xff1a; 1&#xff1a;自定义工作流程&#xff0c;系统所有参数可自定义配置&#xff0c;支持多分公司、多部门架构 2&#xff1a;采用三层结构设计软件&#xff0c;系统扩容性…

vivo 实时计算平台建设实践

作者&#xff1a;vivo 互联网实时计算团队- Chen Tao 本文根据“2022 vivo开发者大会"现场演讲内容整理而成。 vivo 实时计算平台是 vivo 实时团队基于 Apache Flink 计算引擎自研的覆盖实时流数据接入、开发、部署、运维和运营全流程的一站式数据建设与治理平台。 一、v…

【云边有个小卖部】阅读笔记

童年就像童话&#xff0c;这是他们在童话里第一次相遇。 那么热的夏天&#xff0c;少年的后背被女孩的悲伤烫出一个洞&#xff0c;一直贯穿到心脏。 刘十三被欺负得最惨&#xff0c;却想保护凶巴巴的程霜。 每当她笑的时候&#xff0c;就让他想起夏天灌木丛里的萤火虫&#xff…

2022年专业连锁行业研究报告

第一章 行业概况 专业连锁经营是一种商业组织形式和经营制度&#xff0c;是指经营同类商品或服务的若干个企业&#xff0c;以一定的形式组成一个联合体&#xff0c;在整体规划下进行专业化分工&#xff0c;并在分工基础上实施集中化管理&#xff0c;把独立的经营活动组合成整体…

力扣sql入门篇(七)

力扣sql入门篇(七) 1 查询近30天用户活跃数 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 #注意因为between是两端都包含,仅统计30天,因而间隔天数写成29天 SELECT activity_date day,count(distinct user_id) active_users FROM Activity WHERE a…