java 单元测试Junit

本文介绍了Junit测试框架在单元测试中的应用,包括如何编写测试类和方法,使用@Test注解,以及单元测试断言的重要性。此外,还展示了如何利用@Before,@BeforeClass,@After,@AfterClass等注解控制测试方法的执行顺序和资源管理。
摘要由CSDN通过智能技术生成

所谓单元测试,就是针对最小的功能单元,编写测试代码对其进行正确性测试。为了测试更加方便,有一些第三方的公司或者组织提供了很好用的测试框架,给开发者使用。这里介绍一种Junit测试框架。Junit是第三方公司开源出来的,用于对代码进行单元测试的工具(IDEA已经集成了junit框架)。相比于在main方法中测试有如下几个优点。
1.可以灵活的编写测试代码,可以针对某个方法执行测试,也支持一键完成对全部方法的自动化测试,且各自独立。
2.不需要程序员去分析测试的结果,会自动生成测试报告出来。

请添加图片描述

接下来,我们就按照上面的步骤,来使用一下.

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

public class StringUtil{
    public static void printNumber(String name){//这里为了方便用了静态方法 不是静态的则需要在测试方法里new一个对象测试
        System.out.println("名字长度:"+name.length());
    }
}

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

public class StringUtilTest{//名字这样写 就知道测试什么类
    @Test//必须添加Test注解 可以alt+回车导入Junit包 建议使用4.0版本 经典版本
    public void testPrintNumber(){//名字这样写 就知道测试什么方法
        StringUtil.printNumber("admin");
        StringUtil.printNumber(null);
    }
}

写完代码之后,我们会发现测试方法左边,会有一个绿色的三角形按钮。点击这个按钮,就可以运行测试方法。也可以右键在选项里运行,在不同的地方右键可以显示运行不同的测试方法或者运行整个测试类中的方法。甚至,当以后我们的项目里有几百个测试方法几百个测试类,可以右键模块的位置,一键运行模块里所有的测试类里的测试方法,非常强大。

请添加图片描述

运行,测试失败,因为有null出现空指针异常。

请添加图片描述





单元测试断言
所谓断言:意思是程序员可以预测程序的运行结果,检查程序的运行结果是否与预期一致。
能跑通的代码不一定就没有错误,比如看下面的例子。

我们在StringUtil类中新增一个测试方法

 public static int getMaxIndex(String data){//要求返回字符串最大索引
     if(data == null){
         return -1;
     }
     return data.length();//错误的
 }

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

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);
    }
}

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

请添加图片描述





Junit框架的常用注解

刚才我们以及学习了@Test注解,可以用来标记一个方法为测试方法,测试才能启动执行。
除了@Test注解,还有一些其他的注解,我们要知道其他注解标记的方法什么时候执行,以及其他注解在什么场景下可以使用。

请添加图片描述

接下来,我们演示一下其他注解的使用。我们在StringUtilTest测试类中,再新增几个测试方法。代码如下

public class StringUtilTest{
    @Before
    public void test1(){
        System.out.println("--> test1 Before 执行了");
    }
    @BeforeClass
    public static void test11(){
        System.out.println("--> test11 BeforeClass 执行了");
    }
    @After
    public void test2(){
        System.out.println("--> test2 After 执行了");
    }
    @AfterCalss
    public static void test22(){
        System.out.println("--> test22 AfterCalss 执行了");
    }
}

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

请添加图片描述

观察执行结果,特点如下

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

我们现在已经知道每一个注解的作用了,那他们有什么用呢?应用场景在哪里?

我们来看一个例子,假设我想在每个测试方法中使用Socket对象,并且用完之后,需要把Socket关闭,就可以在@Before和@After里申请和释放。,如果是公用管道,代码就可以按照下面的结构来设计

public class StringUtilTest{
    private static Socket socket;
    @Before
    public void test1(){
        System.out.println("--> test1 Before 执行了");
    }
    @BeforeClass
    public static void test11(){
        System.out.println("--> test11 BeforeClass 执行了");
        //初始化Socket对象
        socket = new Socket();
    }
    @After
    public void test2(){
        System.out.println("--> test2 After 执行了");
    }
    @AfterCalss
    public static void test22(){
        System.out.println("--> test22 AfterCalss 执行了");
         //关闭Socket
        socket.close();
    }
}

最后,我们再补充一点。前面的注解是基于Junit4版本的,再Junit5版本中对注解作了更新,但是作用是一样的。所以这里就不做演示了

请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值