• JUNIT使用和注意、以及断言的介绍使用、SpringBoot Test测试类的使用、maven配置使用junit详细介绍


    参考文章: https://www.cnblogs.com/zhukaile/p/14514238.html,https://blog.csdn.net/qq_36448800/article/details/126438339

    一、什么是单元测试

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

    二、使用

    注意:用Junit进行单元测试必须满足以下条件

    1、每一个测试方法上使用@Test进行修饰
    2、每一个测试方法必须使用public void 进行修饰
    3、每一个测试方法不能携带参数
    4、测试代码和源代码在两个不同的项目路径下
    5、测试类的包应该和被测试类保持一致
    6、测试单元中的每个方法必须可以独立测试
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    1.Junit的jar包导入

    如果不是maven项目,直接网上下载junit的jar包,如果是maven项目,直接导入maven依赖,版本改成自己需要。但是要注意,4.10以上版本的junit要配合hamcrest-core的jar包使用。这里我建议直接用5的,因为有时候用四会报错 java @Test 使用不了

    如需详细了解为什么,可以参考我的另一篇文章https://blog.csdn.net/munangs/article/details/126671706 进去直接使用ctrl+f搜索junit即可

    <dependency>
          <groupId>org.junit.jupiter</groupId>
          <artifactId>junit-jupiter-api</artifactId>
          <version>5.6.2</version>
    </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2.Junit简单使用

    import org.junit.*;
     
    public class Tests {
       @Test
        public void testAdd(){
           System.out.println("test1");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    左击方法名,点击运行按钮,选择debug模式,运行结果如图
    在这里插入图片描述

    3.对方法进行断言测试

    这里写了三个方法,主要对以下方法用断言进行测试,代码如下

    public class Method {
        public int add(int a,int b){
            return a+b;
        }
        public int delete(int a,int b){
            return a-b;
        }
        public boolean isTrue(){
            return 2==1;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    1)、assertEquals

    断言判断是否相等,这个方法里面可以又很多参数,一般根据我们的需要输入相应的参数
    在这里插入图片描述

    在这里选择assertEquals(Object expected,Object actual),expected指的是期望得到的值,actual指实际返回的结果,如果期望值和实际结果不相等,就会抛异常,即断言失败。我们对add方法进行测试,代码如下

    public class Tests {
       @Test
        public void testAdd(){
            Assert.assertEquals(3,new Method().add(3,1));
           System.out.println("test1");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    输入值和期望值不一样,这里抛出异常
    在这里插入图片描述

    2、assertTrue/assertFalse

    该断言用来验证给定的布尔型值是否为真,假如结果为假,则验证失败
    方法: assertTrue ([String message],Boolean condition)
    message是个可选的消息,假如提供,将会在发生错误时报告这个消息。
    这里测试isTrue方法,测试代码如下:

    public class Tests {
       @Test
        public void testTrue(){
            Assert.assertTrue("不相等",new Method().isTrue());
           System.out.println("test1");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    很明显,测试代码里面返回的是false,所以会抛出message消息

    assertFalse方法同上,只是判断的结果相反,如果boolean中返回为false则不抛异常,返回为true抛出message消息

    在这里插入图片描述

    3)、assertNull

    这个方法很好理解,就不写专用的方法来进行演示。用于判断函数返回是否为空
    方法:assertNotNull([String message],Object object)
    message即返回为空之后的打印的消息,object是判断的方法
    测试代码如下:

    public class Tests {
       @Test
        public void testTrue(){
            Assert.assertNull("不为空","abcde");
           System.out.println("test1");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    测试结果:如果判断的对象不为空,则会抛出message消息,为空则通过测试
    在这里插入图片描述

    4)、assertSame

    该断言用来验证expected参数和actual参数所引用的是否是同一个对象,假如不是,则验证失败。相应地,也存在验证不是同一个对象的断言。(和assertEquals区别在于,这个用于判断实际结果是否与期望结果的引用内存地址相同,类似于==,而assertEquals类似于equals方法)
     方法:assertNotSame ([String message], expected,actual)
     message也是断言失败后打印的消息,expected是期望值,actual是实际值
     测试代码:

    public class Tests {
       @Test
        public void testTrue(){
            Assert.assertSame("不相等",2,4-3);
           System.out.println("test1");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    测试结果:2肯定是不等于1的,这个时候会打印错误信息。
    在这里插入图片描述

    4).运行流程

    如果我们要在每个测试之前打开数据库,又关闭数据库,这样如果在每个方法里面写流程会非常麻烦,这个时候就有专有的测试方法运行前后进行操作的方法。其中beforeClass和afterClass方法必须是静态方法

    @BeforeClass (setUpBeforeClass方法):
    注解静态方法;在运行测试类时最先运行且只执行一次。
    @AfterClass (tearDownAfterClass方法):
    注解静态方法;在运行测试类时最后个运行且只执行一次。
    @Before(setUp方法)
    在执行每个@Test之前执行,每个@Test执行前都会执行@Before。
    @Test
    要执行的测试单元
    @After(tearDown方法)
    在执行每个@Test之后执行,每个@Test执行结束后都会执行@After
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    public class Tests {
       @Test
        public void testAdd(){
           System.out.println("test1");
        }
        @Test
        public void testDelete(){
            System.out.println("test2");
        }
        @BeforeClass
        public static void beforeClass(){
            System.out.println("beforeClass.....");
        }
        @After
        public void after(){
            System.out.println("after......");
       }
        @AfterClass
        public static void afterClass(){
           System.out.println("afterClass....");
       }
        @Before
        public void before(){
            System.out.println("before.....");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    打印结果:
    在这里插入图片描述

    这里我们可以看到它的运行流程是这样的:

    在这里插入图片描述

    5)、junit测试套件(批量测试)

    有的时候我们可能不止要对一个类进行测试,这个时候就要用到测试套件,两个测试类如下
    Tests:

    public class Tests {
       @Test
        public void testAdd(){
           System.out.println("test1");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    Tests1

    import org.junit.Test;
     
    public class Tests1 {
        @Test
        public void testDelete(){
            System.out.println("test2");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    套件类Combine:

    import org.junit.runner.RunWith;
    import org.junit.runners.Suite;
     
    @RunWith(Suite.class)//用于更改测试运行器
    @Suite.SuiteClasses({Tests.class,Tests1.class})//将要测试的类作为数组传入到@Suite.SuiteClasses({})中
    public class Combine {
    	/**
    	注意,该类中不要写任何代码
    	**/
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    直接点击类名进行Debug
    运行结果如图:
    在这里插入图片描述

    三、SpringBoot Test测试类的使用

    参考我的另一篇文章:SpringBoot Test测试类的使用

  • 相关阅读:
    工控产线安全该如何进行系统加固
    osg给osg::Geometry(自己绘制的几何体)添加纹理(二)
    WebStorm安装教程
    前缀和 C++实现
    交错序列——差分:GZOI2023D2T3
    MySQL 的 NULL 值是怎么存储的?
    Vitess 部署在多节点集群怎么解决端口冲突
    怎么手写转文字?借助这3款工具轻松实现
    uniapp+地图 实现目的地导航
    【Docker-k8s学习和实战】(五)深入理解docker镜像原理
  • 原文地址:https://blog.csdn.net/munangs/article/details/127791583