详解junit

2023-08-20 09:39:22

目录

1.概述

2.断言

3.常用注解

3.1.@Test

3.2.@Before

3.3.@After

3.4.@BeforeClass

3.5.@AfterClass

4.异常测试

5.超时测试

6.参数化测试


1.概述

什么是单元测试:

单元测试,是针对最小的功能单元编写测试代码,在JAVA中最小的功能单元是方法,单元测试针对JAVA就是单个方法的测试。目的就是保证单个方法的正常运行。

JUnit是什么:

专门针对java语言设计,使用广泛的一个标准单元测试框架。使用断言+注解的方式对单个方法进行测试。注解用来控制行为,断言用来进行判断。

2.断言

名称说明示例
assertEquals相等assertEquals(100,x)
assertArrayEquals数组相等assertArrayEquals({1,2,3},x)
assertEquals浮点数相等assertEquals(3.1415926,x)
assertNullnullassertNull(x)
assertTruetrueassertTrue(x>0)
assertFalsefalseassertFalse(x<0)
assertNotEquals不相等assertNotEquals(100,x)
assertNotNull不为空assertNotNull(x)

3.常用注解

3.1.@Test

@Test,用来注解单个测试用例,每个@Test就是个独立的单元,单个@Test的生命周期是相互独立的。

代码示例:

public class Demo1Test {
    Demo1 demo1;

    public Demo1Test(){
        System.out.println("建立测试用例!");
    }

    @Before
    public void before(){
        System.out.println("测试开始!");
        demo1=new Demo1();
    }

    @Test
    public void testSum1(){
        Assert.assertEquals("65",demo1.sum("5",2,4,6));
    }

    @Test
    public void testSum2(){
        Assert.assertEquals("65",demo1.sum("5",2,4,6));
    }

    @After
    public void after(){
        System.out.println("测试结束!");
    }
}

测试结果:

3.2.@Before

@Before,@Test之前执行,一般用于准备一些资源。

代码示例:

public class Demo1Test {
    Demo1 demo1;

    @Before
    public void before(){
        demo1=new Demo1();
    }
    @Test
    public void testSum(){
        Assert.assertEquals("65",demo1.sum("5",2,4,6));
    }
}

3.3.@After

@After,@Test之后执行,一般用于释放一些资源。

代码示例:

public class Demo1Test {
    Demo1 demo1;

    @Before
    public void before(){
        demo1=new Demo1();
    }
    
    @Test
    public void testSum(){
        Assert.assertEquals("65",demo1.sum("5",2,4,6));
    }
    
    @After
    public void after(){
        System.out.println("测试结束!");
    }
}

3.4.@BeforeClass

@BeforeClass,作用于类层面,修饰静态方法,整个类的生命周期中,只在类的生命周期开始的时候执行一次。

一般用于准备一些所有用例共享的资源。

代码示例:

public class Demo1Test {
    Demo1 demo1;

    @BeforeClass
    public static void beforeClass(){
        System.out.println("beforeClass......");
    }

    public Demo1Test(){
        System.out.println("建立测试用例!");
    }

    @Before
    public void before(){
        System.out.println("测试开始!");
        demo1=new Demo1();
    }

    @Test
    public void testSum1(){
        Assert.assertEquals("65",demo1.sum("5",2,4,6));
    }

    @Test
    public void testSum2(){
        Assert.assertEquals("65",demo1.sum("5",2,4,6));
    }

    @After
    public void after(){
        System.out.println("测试结束!");
    }
}

运行结果:

3.5.@AfterClass

@AfterClass,作用于类层面,修饰静态方法,整个类的生命周期中,只在类的生命周期结束的时候执行一次。

一般用于销毁一些所有用例共享的资源。

代码示例:

public class Demo1Test {
    Demo1 demo1;

    @BeforeClass
    public static void beforeClass(){
        System.out.println("beforeClass......");
    }

    public Demo1Test(){
        System.out.println("建立测试用例!");
    }

    @Before
    public void before(){
        System.out.println("测试开始!");
        demo1=new Demo1();
    }

    @Test
    public void testSum1(){
        Assert.assertEquals("65",demo1.sum("5",2,4,6));
    }

    @Test
    public void testSum2(){
        Assert.assertEquals("65",demo1.sum("5",2,4,6));
    }

    @After
    public void after(){
        System.out.println("测试结束!");
    }

    @AfterClass
    public static void afterClass(){
        System.out.println("afterClass......");
    }
}

运行结果:

4.异常测试

通过@Test注解的expected属性可以断定该TestCase抛出的异常,抛出不匹配的异常会报错。

代码示例:

@Test(expected = NumberFormatException.class)
    public void testNumberFormat(){
        Integer.parseInt(null);
    }

5.超时测试

通过@Test注解的timeout属性可以设置每个TestCase执行耗时的时间阈值,超时会报错。

代码示例:

@Test(timeout = 3000)
    public void testNumberFormat(){
        try {
            Thread.sleep(4000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

6.参数化测试

Junit提供了输入一组参数进行测试的机制。

代码示例:

@RunWith(Parameterized.class)
public class ParameterTest {
    //用于准备一组数据的方法
    //方法严格约定为 public Collection<?> data()
    @Parameterized.Parameters
    public static Collection<?> data(){
        return Arrays.asList(new Object[][]{
                {0,0},{1,1},{-1,1}
        });
    }

    int input;
    int expected;
    //准备好的数据会在构造方法中自动传递过来
    public ParameterTest(int input,int expected){
        this.input=input;
        this.expected=expected;
    }

    @Test
    public void testAbs(){
        int r=Math.abs(this.input);
        Assert.assertEquals(this.expected,r);
    }
}

 

 

更多推荐

Blender关键帧动画简明教程

Blender3D是一款能够创建令人惊叹的动画的免费软件。Blender中的大多数动画都使用所谓的关键帧。Blender中关键帧的介绍将涵盖开始制作动画所需的一切!推荐:用NSDT编辑器快速搭建可编程3D场景1、什么是关键帧?在计算机出现之前,动画师必须手动绘制动画的每一帧——在每幅图像之间进行极其微小的更改。通过Bl

SpringBoot-AOP-Logback用切面拦截操作日志

在SpringBoot中使用切面来拦截操作日志,以及配合使用MyBatis-Plus框架进行操作,并使用Thymeleaf视图显示商品列表,同时配置Logback日志输出到文件。CREATETABLEproduct(idBIGINTAUTO_INCREMENTPRIMARYKEY,nameVARCHAR(255)NOT

typescript type 类型别名详解

TypeScript中的Type类型别名是一种强大的工具,用于创建自定义类型。通过类型别名,我们可以为复杂的类型结构创建更具可读性和可维护性的名字。TypeScript中的Type类型别名简介在TypeScript中,我们可以使用type关键字来定义一个类型的别名,这就是所谓的类型别名。通过类型别名,我们可以为复杂的类

Zookeeper集群 + Kafka集群

Zookeeper概述//Zookeeper定义*Zookeeper是一个开源的分布式的,为分布式框架提供协调服务的Apache项目。//Zookeeper工作机制*****Zookeeper从设计模式角度来理解:是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦

javascript基础第二天笔记

JavaScript基础-第2天理解什么是流程控制,知道条件控制的种类并掌握其对应的语法规则,具备利用循环编写简易ATM取款机程序能力运算符语句综合案例运算符算术运算符数字是用来计算的,比如:乘法*、除法/、加法+、减法-等等,所以经常和算术运算符一起。算术运算符:也叫数学运算符,主要包括加、减、乘、除、取余(求模)等

易基因|ONT:三代原核甲基化在痤疮杆菌噬菌体表观遗传印迹中的工程选择性研究

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。痤疮表皮杆菌(Cutibacteriumacnes,C.acnes)是一种革兰氏阳性细菌,是人类皮肤微生物组成员。尽管是最丰富的皮肤共生体,但某些成员与常见的炎症性疾病(如痤疮)有关。各种C.acnes分支的完整基因组序列可以鉴定推定的甲基转移酶,其中一些可

如何用CRM软件系统提升销售成绩

现如今,不少企业通过办公软件优化业务效率,加强销售管理。其中CRM销售管理系统能够有效提升销售人员的工作效率,提高销售成功率。为什么CRM系统能够提升销售业绩?下面小编从三个方面来概括说一下:为什么CRM系统能够提升销售业绩?1、CRM系统帮助企业建立“以客户为中心”的商业策略。传统企业大多是“以产品为中心,只管推出产

群晖 Docker版qbittorrent 下载显示错误 解决方法

这些天在折腾AIO玩,PVE虚拟机底层,核显直通,群晖安装,免不了踩些坑。今天写篇博客,讲述一下群晖Docker版qbittorrent下载显示错误的解决方法,顺便记录一下配置,以便日后折腾可以参考。直接说结论如果下载显示错误,并且由于自己更改了存储路径,那多半是由于权限设置。去相关的文件夹中添加Owner用户的完全控

透过《眼睛的故事》:需求为何成为纪录片的“价值锚点”?

我们正处在一个内容过载、追求流量的时代。对于观众来说,这是幸运的,也是不幸的。一方面,相比以前能接受到的内容指数级增长,自己的视野无限扩大,但另一方面,“流量思维”下粗制滥制的内容不在少数,对观众来说极其不友好。在内容极为丰盛的时代,观众越来越占主导地位。早在1935年,诺贝尔经济学奖得主哈耶克就提出了“soverei

springboot 调用第三方接口的方式(一)使用RestTemplate方法

简介常用的调用第三方接口的方式:方式一:使用RestTemplate方法方式二:使用原始httpClient请求方式三:使用Feign进行消费通过HTTPClient进行访问第三方接口。但是过程比较复杂,Feign比较适合在springCLoud多模块项目中使用,所以平时基本都是使用RestTemplate方式,这样比

如何使用正则表达式实现Java日志信息的抓取与收集

首先,什么是Java日志信息?简单来说,Java应用程序在运行过程中会输出一些信息,这些信息可以用来追踪程序运行状态、调试错误等。而Java日志信息就是这些输出信息的集合。那么为什么要抓取和收集Java日志信息呢?一方面,这些信息可以帮助我们更好地了解程序的运行情况,及时发现和解决问题;另一方面,对于大型应用程序来说,

热文推荐