测试

本文详细介绍了Junit单元测试框架在Java开发中的应用,包括白盒测试的概念、Junit4与Junit5的区别、测试类与方法的定义,以及使用示例。重点讲解了如何编写单元测试,如添加注解、结果判定和测试策略调整。
摘要由CSDN通过智能技术生成

测试概述

就是产品发布之前对已经开发好的功能记性差提前的测试,检测功能方法是否有漏洞,是否有bug,对于后端开发人员,我们可以使用junit单元测试对我们的代码就行测试.

Junit是java语言的单元测试框架,属于第三方的工具,一般情况下我们需要导入相应的jar包.对于开发人员,我们是用集成开发工具,一般来说都是自带的junit.是编写可重复测试的简单框架。它是单元测试框架的 xUnit 架构的一个实例。

junit属于白盒测试----->属于程序员的测试

测试分类

  • 黑盒测试
    一般是通过软件来完成测试,一般是看不见步骤的,
  • 白盒测试—junit(程序员主要学习目标)
    一般是通过代码来完成的测试,能够明确的看到每一步的测试步骤,我们能够看见测试的流程和细节

黑白盒测试图解

在这里插入图片描述

junit4的使用(完成白盒测试)

  1. 首先------去https://github.com/junit-team/junit4/wiki/Download-and-Install下载两个jar包
  2. 添加jar依赖到工程里面--------可以使用new modules模块---->找到Libraries—>+ 号---->java---->找到想要的jar包对应的文件---->把文件加入到相应的项目里面就可以了.
  3. 定义一个测试类
    • 建议:测试包放到测试文件夹里面----->右击项目—>new---->Directory---->右击创建好的文件夹---->Mark Directory as---->Test Source root ---->就建立好了一个测试文件夹

      • 测试类名:被测试的类Test 例如:UserTest
      • 测试类:应该放到测试资源包里面
      • 测试包:XXX.xxx.test 例如:com.zhiyou100.user.test.user
    • 定义测试方法有要求:测试方法区别于之前的main函数.测试方法可以实现独立运行(不管是junit4或者junit5都可以独立运行)不依靠main方法

      • 测试方法名字:test被测试的功能方法 例如: testGetName()
      • 返回值统一要求为void
      • 参数列表: junit4 只能是空参 junit5 参数列表可要可不要
      • 修饰符: 一般来说 junit4 使用public junit5中使用范围很广.可以使用多种修饰符几乎不限制
  4. 给方法上面添加注解 @Test
  5. 结果判定:如何判断测试是否成功
  Assert.assertEquals(期望值,实际值)
Assert.assertEquals("小孙-----20",result);//然后点击运行小图标,能运行出来表示测试成功
 Assert.assertEquals("小孙-----30",result);//这个表示相同才成功,不同就不成功就会报红
 Assert.assertNotEquals("小孙-----30",result);//表示不同就成功

红色---->测试失败,中间可能出现异常

橘黄色—>测试失败,实际值和期望值不一样

绿色—>测试成功.

junit4和junit5的区别

junit4中

@Test 把一个方法标记为测试方法
@Before 每一个测试方法执行前会调用一次该方法(搭配@Test一起使用)
@After 每一个测试方法执行后会调用一次该方法(搭配@Test一起使用)
@BrforeClass 所有测试方法执行之前执行一次,在测试类没有进行实例化之前已经被加载到,他标记的方法为静态方法(必须用static修饰)(搭配@Test一起使用) 就类似于静态方法 ,可以用于资源加载
@AfterClass 所有测试方法执行之后执行一次,在测试类没有进行实例化之前已经被加载到,他标记的方法为静态方法,(必须用static修饰,(搭配@Test一起使用),可以用于资源释放
@Ignore 是忽略的意思 被这个注解标注的方法,在测试执行的时候暂时不执行这个测试方法.待定执行(搭配@Test一起使用)

junit4代码演示

首先在测试文件夹,测试包里面写一个Calculator类,junit4里面就是测试这里面的方法

//计算器
public class Calculator {

    //测试相加
    public int addNum(int x,int y){
        return x+y;
    }

    //测试相减
    public int Subtract(int x,int y){
        return x-y;
    }

    //测试相乘
    public int multiply(int x,int y){
        return x*y;
    }

    //测试相除
    public int divide(int x,int y){
        return x*y;
    }


}

然后再去测试文件夹测试包里面写一个测试类CalcyulatorTest

package com.zhiyou100.test.junit4;
import com.zhiyou100.pojo.Calculator;
import org.junit.*;

public class CalcyulatorTest {  //点击这里的绿标就会执行所有的测试方法

    private final Calculator calculator=new Calculator();
    @Before
    public void testBefore(){//每一个测试方法执行之前都会执行一次这个方法
        System.out.println("@Before方法被加载");
    }

    @After
    public void testAfter(){//每一个测试方法执行之后都会执行一次这个方法
        System.out.println("@After方法被加载");
    }

    @BeforeClass  //注意必须用static修饰
    public static void testBeforeClass(){//在所有测试方法执行之前执行一次,只会执行一次
        System.out.println("@BeforeClass方法被加载");
    }

    @AfterClass //注意必须用static修饰
    public static void testAfterClass(){//在所有测试方法执行之后执行一次,只会执行一次
        System.out.println("@AfterClass方法被加载");
    }

    //测试相加
    @Test
    public void testAddNum(){
        //获取实际值
        int actul = calculator.addNum(10, 3);
        //使用断言验证数据是否正确
        Assert.assertEquals("测试值是否为13",13,actul);//正确的
        //Assert.assertEquals("测试值是否为13",12,actul);//不正确的
    }

    //测试相减
    @Test(timeout = 1)//超时测试 单位为毫秒,超过指定时间就是失败,一般是用来测试性能的,
    public void tsstSubtract(){
        int actul = calculator.Subtract(10, 3);
        Assert.assertEquals("期望值未7",7,actul);//正确的
        //Assert.assertEquals("期望值未7",6,actul);//不正确的
//        for(int i=0;i<100000;i++){
//            System.out.println(i);
//        }
    }

    //测试相除
    @Ignore //表示测试的时候不测试这个功能,表示葛洪能还没有写完不在测试范围之内
    public void testDivide(){
        System.out.println("改方法被加载到了");
        int actual = calculator.divide(10, 3);
        Assert.assertEquals("结果只未3",3,actual);//正确的
        //Assert.assertEquals("结果只未3",2,actual);//不正确的
    }

    //测试相乘
    @Test (expected = NullPointerException.class)  //如果出现了空指针异常就测试成功,否则测试失败
    public void testCheng(){
        System.out.println("改方法被加载到了");
        int actual = calculator.multiply(10, 3);
        Assert.assertEquals("结果只未30",30,actual);//正确的
        //Assert.assertEquals("结果只未3",2,actual);//不正确的
    }
}

junit5中

@Test 把一个方法标记为测试方法
@BeforeEach 每一个测试方法执行之前都会自动调用该方法(搭配@Test一起使用)
@AfterEach 每一个测试方法执行后会调用一次该方法(搭配@Test一起使用)
@BrforeAll 所有测试方法执行之前执行一次,在测试类没有进行实例化之前已经被加载到,他标记的方法为静态方法,必须用static修饰,(搭配@Test一起使用) 就类似于静态方法,可以用于资源加载
@AfterAll 所有测试方法执行之后执行一次,在测试类没有进行实例化之前已经被加载到,他标记的方法为静态方法(搭配@Test一起使用),必须用static修饰,可以用于资源释放
@Disabled 是忽略的意思 被这个注解标注的方法,在测试执行的时候暂时不执行这个测试方法.待定执行(搭配@Test一起使用)

junit5代码演示

首先先在测试文件夹的测试包里面写一个测试类Calculator

package com.zhiyou100.pojo;
//计算器
public class Calculator {

    //测试相加
    public int addNum(int x,int y){
        return x+y;
    }

    //测试相减
    public int Subtract(int x,int y){
        return x-y;
    }

    //测试相乘
    public int multiply(int x,int y){
        return x*y;
    }

    //测试相除
    public int divide(int x,int y){
        return x*y;
    }
}

然后再去测试报里面写一个测试类CalculatorTest

package com.zhiyou100.test.junit5;

import com.zhiyou100.pojo.Calculator;
import org.junit.Assert;
import org.junit.jupiter.api.*;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;


//junit5里面的jar包与四不同
public class CalcyulatorTest {

    private final Calculator calculator=new Calculator();


    @BeforeEach
    void testBefore(){//每一个测试方法执行之前都会执行一次这个方法,在junit5中修饰符可以不加,private不能修饰,但是在junit4里面必须被加,
        System.out.println("@BeforeEach方法被加载");
    }

    @AfterEach
    void testAfter(){//每一个测试方法执行之后都会执行一次这个方法,在junit5中修饰符可以不加,private不能修饰,但是在junit4里面必须被加,
        System.out.println("@AfterEach方法被加载");
    }

    @BeforeAll  //注意必须用static修饰
    static void testBeforeClass(){//在所有测试方法执行之前执行一次,只会执行一次,在junit5中修饰符可以不加,private不能修饰,但是在junit4里面必须被加,
        System.out.println("@BeforeAll方法被加载");
    }

    @AfterAll //注意必须用static修饰
    static void testAfterClass(){//在所有测试方法执行之后执行一次,只会执行一次,在junit5中修饰符可以不加,private不能修饰,但是在junit4里面必须被加,
        System.out.println("@AfterAll方法被加载");
    }



    //测试相加
    @Test
    void testAddNum(){//,在junit5中修饰符可以不加,private不能修饰,但是在junit4里面必须被加,
        //获取实际值
        int actul = calculator.addNum(10, 3);
        //使用断言验证数据是否正确
        Assert.assertEquals("测试值是否为13",13,actul);//正确的
        //Assert.assertEquals("测试值是否为13",12,actul);//不正确的
    }

    //测试相减
    @Test
    void tsstSubtract(){//,在junit5中修饰符可以不加,private不能修饰,但是在junit4里面必须被加,
        int actul = calculator.Subtract(10, 3);
        Assert.assertEquals("期望值未7",7,actul);//正确的
        //Assert.assertEquals("期望值未7",6,actul);//不正确的
    }

    //测试相除
    @Disabled //表示测试的时候不测试这个功能,表示葛洪能还没有写完不在测试范围之内,在junit5中修饰符可以不加,private不能修饰,但是在junit4里面必须被加,
    void testDivide(){
        System.out.println("改方法被加载到了");
        int actual = calculator.divide(10, 3);
        Assert.assertEquals("结果只未3",3,actual);//正确的
        //Assert.assertEquals("结果只未3",2,actual);//不正确的
    }
    
//    重复测试10次
    @RepeatedTest(10)
    void repeatedTest() {
        System.out.println("hello world!");
    }
}

静态导入

jdk5之后出现的新特性,只要在import后面加上关键字static就可以把后面的类的static修饰的变量和方法导入到本类中,调用的时候和调用被类中的静态成员没有区别,可以直接通过 类名.属性名调用,,或者直接省略

静态导入格式----import static 包名.类名.静态成员名------>import static 包名.类名.* * 表示导入所有的静态成员

注意事项----方法必须是静态的,如果有多个静态方法重名,就必须添加前缀类名来调用。

@Test里面的属性操作

expected属性,期望测试中有异常信息,格式:@Test(excepted = NullPointerException.class),如果出现了我们想要的异常就测试成功,如果没有出现这个异常就算测试失败。

 @Test (expected = NullPointerException.class)  //如果出现了空指针异常就测试成功,否则测试失败

Timeout属性,测试方法的执行时间,格式:@Test(Timeout = 5) 单位为毫秒值,表示五毫秒,如果允许时间在设置值之内表示设置成功,如果超出了测试值范围就表示测试失败。

 @Test(timeout = 1)//超时测试 单位为毫秒,超过指定时间就是失败,一般是用来测试性能的,
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值