java Junit单元测试

目录

一.了解单元测试

1.1mian方法测试中的缺点

1.2使用Junit测试框架的优点

 二.Junit单元测试快速入门

2.1测试代码演示

2.2 Junit单元测试注意事项

三.深入学习Junit单元测试 

3.1单元测试断言

3.2Junit框架的常用注解


一.了解单元测试

所谓单元测试,就是针对最小的功能单元,编写测试代码对其进行正确性测试。

我们想想,咱们之前是怎么进行测试的呢?

比如说我们写了一个学生管理系统,有添加学生、修改学生、删除学生、查询学生等这些功能。要对这些功能这几个功能进行测试,我们是在main方法中编写代码来测试的。

1.1mian方法测试中的缺点

但是在main方法中写测试代码有如下的几个问题,如下图所示:

1.2使用Junit测试框架的优点

为了测试更加方便,有一些第三方的公司或者组织提供了很好用的测试框架,给开发者使用。

Junit是第三方公司开源出来的,用于对代码进行单元测试的工具(IDEA已经集成了junit框架)。相比于在main方法中测试有如下几个优点。


 二.Junit单元测试快速入门

2.1测试代码演示

 接下来,写一个测试类,测试StringUtil工具类中的方法能否正常使用。

public class TestJunit {
    @Test
    public void info(){
        System.out.println("info");
    }

}

2.2 Junit单元测试注意事项

  • 独立性:每个测试方法都应该是相互独立的,彼此之间不会互相影响。避免在一个测试方法中依赖另一个测试方法的状态。

  • 命名规范:好的命名习惯可以提高测试用例的可读性。使用清晰、描述性的命名来表示测试方法的意图和所测试的功能。

  • 覆盖率:尽量覆盖被测试代码的各个分支和边界情况,以确保测试的全面性。检查测试覆盖率报告,确保每个方法和语句都得到了正确的测试。

  • 断言选择:选择适当的断言方式来验证代码的行为。使用合适的断言方法(如assertEquals()assertTrue()等)比较实际输出和预期输出,以确保测试的准确性。

  • 测试异常:对于可能抛出异常的代码,确保编写异常测试用例,以验证异常的捕获和处理逻辑是否正确。

  • 测试数据管理:使用不同的测试数据,包括边界情况和特殊情况,以验证代码在不同输入条件下的正确性和可靠性。

  • 测试性能:虽然 JUnit 主要针对功能测试,但有时也可以在单元测试中关注代码的性能。确保代码在一定压力下仍能正常工作,不会出现性能问题。

  • 测试顺序:不要依赖于测试方法的执行顺序。每个测试方法应该是独立执行并产生一致的结果。避免在测试方法之间建立依赖关系。

  • 测试资源管理:如果测试方法需要使用到特定的资源(如文件、数据库连接等),在测试前后进行资源的正确初始化和清理操作,以保证独立性和可重复性。

三.深入学习Junit单元测试 

3.1单元测试断言

所谓断言:意思是程序员可以预测程序的运行结果,检查程序的运行结果是否与预期一致。

 先准备一个类,假设写了一个StringUtil工具类,代码如下

 public static int getMaxIndex(String data){
     if(data == null){
         return -1;
     }
     return data.length();
 }

 接下来,我们在StringUtilTest类中写一个测试方法



```java
public class StringUtilTest{
    @Test
    public void testGetMaxIndex(){
       int index1 = StringUtil.getMaxIndex(null);
       System.out.println(index1);
        
       int index2 = StringUtil.getMaxIndex("admin");
       System.out.println(index2);
        
        //断言机制:预测index2的结果
        Assert.assertEquals("方法内部有Bug",4,index2);
    }
}
```

运行测试方

运行测试方法,结果如下图所示,表示我们预期值与实际值不一致

3.2Junit框架的常用注解

 除了@Test注解,还有一些其他的注解,我们要知道其他注解标记的方法什么时候执行,以及其他注解在什么场景下可以使用。

代码演示: 

    @Test
    public void info1(){
        System.out.println("info");
    }
    @After
    public void a(){
        System.out.println("4.affter");
    }
    @Before
    public void b(){
        System.out.println("5.beffer");
    }
    @BeforeClass
    public static void ac(){
        System.out.println("acccc");
    }
    @AfterClass
    public static void op(){
        System.out.println("dddddddddd");
    }

执行上面的测试类,结果如下图所示,观察执行结果特点如下

1.被@BeforeClass标记的方法,执行在所有方法之前
2.被@AfterCalss标记的方法,执行在所有方法之后
3.被@Before标记的方法,执行在每一个@Test方法之前
4.被@After标记的方法,执行在每一个@Test方法之后

最后,我们再补充一点。前面的注解是基于Junit4版本的,再Junit5版本中对注解作了更新,但是作用是一样的。

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值