测试工程师必须要知道的单元测试框架Junit详解

news2024/11/25 11:53:47

作为一名测试工程师,相信你或多或少的接触过单元测试,对于测试来讲它是一门能够区分专业开发人员与业余开发人员的重要学科,这篇文章将对java中最常见的一个单元测试框架junit进行一个梳理和讲解。如果你之前没接触过,那么就通过这篇文章进行一个学习。如果你是一个测试老手,我也希望这篇文章能够加深你的印象。

一、为什么需要单元测试

在平时的开发当中,一个项目往往包含了大量的方法,可能有成千上万个。如何去保证这些方法产生的结果是我们想要的呢?当然了,最容易想到的一个方式,就是我们通过System.out来输出我们的结果,看看是不是满足我们的需求,但是项目中这些成千上万个方法,我们总不能在每一个方法中都去输出一遍嘛。这也太枯燥了。这时候用我们的单元测试框架junit就可以很好地解决这个问题。

junit如何解决这个问题的呢?答案在于内部提供了一个断言机制,他能够将我们预期的结果和实际的结果进行比对,判断出是否满足我们的期望。相信到这,你已经迫不及待的想认识一下junit,下面我们直接通过案例,来分析一下这个机制。

二、从案例讲起

1、预备工作

junit4是一个单元测试框架,既然是框架,这也就意味着jdk并没有为我们提供api,因此在这里我们就需要导入相关的依赖。对于IDEA来说,你在构建Maven项目的时候会直接自动添加相关的依赖,如果没有,手动添加即可:

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
</dependency>

这里的版本是4.12。当然还有最新的版本。你可以手动选择。这里选用的是4的版本。

2、案例

这里我们要测试的功能超级简单,就是加减乘除法的验证。

public class Calculate {
    public int add(int a,int b) {
        return a + b;
    }
    public int subtract(int a, int b) {
        return a - b;
    }
    public int multiply(int a,int b) {
        return a * b;
    }
    public int divide(int a ,int b) {
        return a / b;
    }
}

然后我们看看如何使用junit去测试。

public class CalculateTest {
    @Test
    public void testAdd() {
        assertEquals(2, new Calculate().add(1,1));
    }
    @Test
    public void testSubtract() {
        assertEquals(8, new Calculate().subtract(10,2));
    }
    @Test
    public void testMultiply() {
        assertEquals(6, new Calculate().multiply(3, 2));
    }
    @Test
    public void testDivide() {
        assertEquals(5, new Calculate().divide(10, 2));
    }
}

以上就是我们的单元测试,需要遵循一下规则:

1、每一个测试方法上使用@Test进行修饰

2、每一个测试方法必须使用public void 进行修饰

3、每一个测试方法不能携带参数

4、测试代码和源代码在两个不同的项目路径下

5、测试类的包应该和被测试类保持一致

6、测试单元中的每个方法必须可以独立测试

以上的6条规则,是在使用单元测试的必须项,当然junit也建议我们在每一个测试方法名加上test前缀,表明这是一个测试方法。

assertEquals是一个断言的规则,里面有两个参数,第一个参数表明我们预期的值,第二个参数表示实际运行的值。不过junit5对这些做出了一些改变,我们会在后续的文章中专门介绍。

我们运行一下测试类,就会运行每一个测试方法,我们也可以运行某一个,只需要在相应的测试方法上面右键运行即可。如果运行成功编辑器的控制台不会出现错误信息,如果有就会出现failure等信息。

3、运行流程

在上面的每一个测试方法中,代码是相当简单的,就一句话。现在我们分析一下这个测试的流程是什么:

public class JunitFlowTest {
    @BeforeClass
    public static void setUpBeforeClass() throws Exception {
        System.out.println("beforeClass...");
    }
    @AfterClass
    public static void tearDownAfterClass() throws Exception {
        System.out.println("afterClass...");
    }
    @Before
    public void setUp() throws Exception {
        System.out.println("before...");
    }
    @After
    public void tearDown() throws Exception {
        System.out.println("after");
    }
    @Test
    public void test1() {
        System.out.println("test1方法...");
    }
    @Test
    public void test2(){
        System.out.println("test2方法...");
    }
}

在上面的代码中,我们使用了两个测试方法,还有junit运行整个流程方法。我们可以运行一下,就会出现下面的运行结果:

beforeClass...
before...
test1方法...
after
before...
test2方法...
after
afterClass...

从上面的结果我们来画一张流程图就知道了:

这个流程相信应该能看懂,如果我们使用过SSM等其他的一些框架,经常会在before中添加打开数据库等预处理的代码,也会在after中添加关闭流等相关代码。

以上这个案例如果能看懂,基本上算是入门了。其实这个案例也比较简单。相信以大家聪明的头脑能看懂。下面我们看看junit中的注解。

现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:310357728【暗号:csdn999】

三、注解

对于@Test,里面有很多参数供我们去选择。我们来认识一下

1、@Test(expected=XX.class)

这个参数表示我们期望会出现什么异常,比如说在除法中,我们1/0会出现ArithmeticException异常,那这里@Test(expected=ArithmeticException.class)。在测试这个除法时候依然能够通过。

2、@Test(timeout=毫秒 )

这个参数表示如果测试方法在指定的timeout内没有完成,就会强制停止。

3、@Ignore

这个注解其实基本上不用,他的意思是所修饰的测试方法会被测试运行器忽略。

4、@RunWith

更改测试运行器。

四、测试套件

在文中一开始我们曾经提到,如果我们的项目中如果有成千上万个方法,那此时也要有成千上万个测试方法嘛?如果这样junit使用起来还不如System.out呢,现在我们认识一下测试嵌套的方法,他的作用是我们把测试类封装起来,也就是把测试类嵌套起来,只需要运行测试套件,就能运行所有的测试类了。

//这里有很多个测试类
public class Test1 {
    @Test
    public void test() {
        System.out.println("测试类1");
    }
}
public class Test2 {
    @Test
    public void test() {
        System.out.println("测试类2");
    }
}
//这里一次可以类推

下面我们使用测试套件,把这些测试类嵌套在一起。

@RunWith(Suite.class)
@Suite.SuiteClasses({Test1.class,Test2.class等相关测试类})
public class SuiteTest {
    /*
     * 写一个空类:不包含任何方法
     * 更改测试运行器Suite.class
     * 将测试类作为数组传入到Suite.SuiteClasses({})中
     */
}

也很简单,下面我们看一下,参数化设置。

五、参数化设置

什么是参数化设置呢?在一开始的代码中我们看到,测试加法的时候是1+1,不过我们如果要测试多组数据怎么办?总不能一个一个输入,然后运行测试吧。这时候我们可以把我们需要测试的数据先配置好。

@RunWith(Parameterized.class)
public class ParameterTest {
    int expected =0;
    int input1 = 0;
    int input2 = 0;
    @Parameters
    public static Collection<Object[]> t() {
        return Arrays.asList(new Object[][]{
                {3,1,2},
                {4,2,2}
        }) ;
    }
    public ParameterTest(int expected,int input1,int input2) {
        this.expected = expected;
        this.input1 = input1;
        this.input2 = input2;
    }
    @Test
    public void testAdd() {
        assertEquals(expected, new Calculate().add(input1, input2));
    }
}

这时候再去测试,只需要去选择相应的值即可,避免了我们一个一个手动输入。

对于junit测试,常用的使用方法就是这么多,关于深入了解,只能放在后面的课程中了。今天先到这。

END今天的分享就到此结束了,点赞关注不迷路~

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

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

相关文章

泰凌微(Telink)8258配置串口收发自定义数据

在官网下载SDK后&#xff08;以Mesh SDK为例&#xff09;使用Eclipse打开&#xff0c;对应MCU的配置文件在app_config_8258.h&#xff0c;默认的HCI接口是HCI_USE_NONE&#xff0c;如果改成HCI_USE_UART后可以通过串口收发数据&#xff0c;此时默认接收函数处理的是以Telink的协…

mfc140.dll丢失的解决方法,以及解决方法的优缺点

如果你在使用电脑时遇到了“mfc140.dll丢失”的错误提示&#xff0c;这可能会阻止你运行特定的应用程序或游戏。这篇文章将向你介绍导致此错误出现的原因以及mfc140.dll丢失的解决方法&#xff0c;让你的电脑系统恢复正常运行。 一.mfc140.dll丢失的解决方法以及优缺点 方法 1…

解析企业云性能监控几个重要作用

随着企业业务的数字化转型&#xff0c;云计算在企业中的应用越来越广泛。在这个背景下&#xff0c;保障云计算环境的性能和稳定性显得尤为重要。企业云性能监控作为一种有效的管理手段&#xff0c;对于确保云计算系统的顺利运行和业务的高效展开起到了关键作用。以下是企业云性…

银行业反洗钱培训报名流程及一寸蓝底报名照片制作

欢银行业反洗钱培训旨在加强银行业从业人员对反洗钱法规的理解&#xff0c;提升防范洗钱风险的专业技能。培训根据法规要求&#xff0c;帮助参训者更好地识别和应对潜在的洗钱威胁。培训内容包括反洗钱的基本原理、实际操作技能和风险评估策略等。下面主要介绍由中国金融培训中…

C# WPF上位机开发(抽奖软件)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 每到年末或者是尾牙的时候&#xff0c;很多公司都会办一些年终的清楚活动&#xff0c;感谢员工过去一年辛苦的付出。这个时候&#xff0c;作为年会…

智能优化算法应用:基于野马算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于野马算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于野马算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.野马算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

VINS编译, opencv多版本的原因导致的问题

1. 通用问题 问题一 编译时报错 error: ‘CV_GRAY2RGB’ was not declared in this scope 等 解决方法 在报错文件上添加头文件 #include <opencv2/imgproc/imgproc_c.h> 单独遇到CV_AA的报错时&#xff0c;也可以将 CV_AA 改为 cv::LINE_AA 问题二 编译时报错 erro…

inBuilder低代码平台新特性推荐-第十五期

各位CSDN的友友们&#xff0c;大家好~ 今天来给大家介绍一下inBuilder低代码平台社区版中特性推荐系列第十五期——消息服务 一、 消息服务 inBuilder低代码平台有很多地方需要对结果发送云加、短信、邮件及GS消息等&#xff0c;并对这些不同的消息进行查看、处理。为了统一…

1688API接口系列,商品详情数据丨搜索商品列表丨商家订单类丨1688开放平台接口使用方案

1688商品详情接口是指1688平台提供的API接口&#xff0c;用于获取商品详情信息。通过该接口&#xff0c;您可以获取到商品的详细信息&#xff0c;包括商品标题、价格、库存、描述、图片等。 要使用1688商品详情接口&#xff0c;您需要先申请1688的API权限&#xff0c;并获取ac…

debian10 安装 tabby

tabby-1.0.205-linux-x64.debtabby-1.0.205-linux-x64.deb资源-CSDN文库 chmod 777 tabby-1.0.205-linux-x64.deb dpkg -i tabby-1.0.205-linux-x64.deb 会报错 用这个安装一下依赖 apt --fix-broken install dpkg -i tabby-1.0.205-linux-x64.deb tabby

一个技巧,解决企业大厦门禁问题!

随着科技的迅速发展&#xff0c;门禁监控系统在各个领域得到了广泛应用。这一技术不仅提高了安全性&#xff0c;还为管理者提供了更加高效的管理手段。 在各种环境中&#xff0c;从企业办公楼到学校校园&#xff0c;门禁监控系统都展现了其卓越的功能和优势。 客户案例 企业大…

RT_Thread_修改为外部晶振及验证

关注两处&#xff1a; 1、stm32f4xx_hal_conf.h&#xff0c;外部晶振频率HSE宏定义 2、drv_clk.c&#xff0c;system_clock_config函数 1、外部晶振频率HSE宏定义 根据实际外部晶振的频率去定义&#xff0c;使用的是8MHz&#xff1b; 2、system_clock_config 开启HSE&#…

【智能家居】六、摄像头安装实现监控功能点、人脸识别(face_recognition的使用)

一、定义及第三方库的说明 OCR &#xff08;光学字符识别&#xff09;文字识别、图像识别mjpg-streamer实时流式传输视频工具树莓派mjpg-streamer Face Recognition人脸识别 Dlib 计算机视觉问题的工具和算法face_recognition库OpenCV 计算机视觉和机器学习的开源库 三、香…

Jsoup爬取HTTPS页面数据资源,并导入数据库(Java)

一、实现思路 示例页面&#xff1a; 2020年12月中华人民共和国县以上行政区划代码 忽略https请求的SSL证书通过Jsoup获取页面标签遍历行标签&#xff0c;分别获取每个行标签的第二个和第三个列标签将获取到的行政代码和单位名称分别插入sql语句占位符执行sql语句&#xff0c…

【网络编程】-- 01 概述、IP

网络编程 1 概述 1.1 计算机网络 (连接分散计算机设备以实现信息传递的系统) 计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备&#xff0c;通过通信线路连接起来&#xff0c;在网络操作系统&#xff0c;网络管理软件及网络通信协议的管理和协调下&…

图的存储(邻接矩阵,边集数组,邻接表,链式前向星)

目录 &#x1f33c;图的存储 &#xff08;1&#xff09;邻接矩阵 &#xff08;2&#xff09;边集数组 &#xff08;3&#xff09;邻接表 &#xff08;4&#xff09;链式前向星 &#x1f600;刷题 &#x1f40d;最大节点 &#x1f40d;有向图 D 和 E &#x1f40d;奶牛…

3 文本分类入门finetune:bert-base-chinese

项目实战&#xff1a; 数据准备工作 bert-base-chinese 是一种预训练的语言模型&#xff0c;基于 BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;架构&#xff0c;专门用于中文自然语言处理任务。BERT 是由 Google 在 2018 年提出的一…

Leetcode—1466.重新规划路线【中等】

2023每日刷题&#xff08;五十二&#xff09; Leetcode—1466.重新规划路线 算法思想 实现代码 class Solution { public:int minReorder(int n, vector<vector<int>>& connections) {vector<pair<int, int>> g[n];for(auto e: connections) {in…

“掌握高效视频分割技巧,降低误差,提高精度“

如果你是一名视频编辑爱好者或者专业人士&#xff0c;那么你一定会在视频剪辑的过程中遇到各种挑战。其中&#xff0c;如何准确高效地进行视频分割是一个至关重要的问题。现在&#xff0c;我们将向你展示一种全新的解决方案&#xff0c;帮助你轻松解决这些问题。 首先第一步&a…