Java的简单单元测试例子

Java的简单单元测试例子


单元测试是什么?

      百度百科的解释是这样的:单元测试(模块测试)是开发者编写的一小段代码,用于检验被测代码的一个很小的、很明确的功能是否正确。通常而言,一个单元测试是用于判断某个特定条件(或者场景)下某个特定函数的行为。例如,你可能把一个很大的值放入一个有序list 中去,然后确认该值出现在list 的尾部。或者,你可能会从字符串中删除匹配某种模式的字符,然后确认字符串确实不再包含这些字符了。

     简单的说,单元测试就是对你程序中最小的功能模块进行测试,在c语言里可能是一个函数,java中可能是一个方法或者类。

     目的就是为了提高代码的质量。

junit是什么?

     JUnit是一个Java语言的单元测试框架。它由Kent Beck和Erich Gamma建立,逐渐成为源于Kent Beck的sUnit的xUnit家族中最为成功的一个。 JUnit有它自己的JUnit扩展生态圈。多数Java的开发环境都已经集成了JUnit作为单元测试的工具。

也就是说junit就是别人写好的单元测试框架,使用此框架你可以大大缩短你的测试时间和准确度(笔者现在还记得大一刚来的的时候,c语言写的小程序,每次都是重启测试,那种编译-输入--停止-编译的苦日子,很痛苦,今天用junit这个单元测试框架好多了)。

  JUnit的当前常用版本分为3.X(需要手动添加),4.X(支持注解)

如何写单元测试

1 首先在pom.xml中添加依赖

    <!-- https://mvnrepository.com/artifact/junit/junit -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>

2 添加 SubArray.java 

下面以 “求最大子数组之和”的例子,简单的介绍一下单元测试是什么,junit如何入门。在实际项目中就是具体的业务代码或其它代码

package com.lfb.Bll;

/**
 * Created by xxx on 2017/7/30.
 */
public class SubArray {
    //求两个数中的最大
    public int max(int x, int y){
        if(x>y)
            return x;
        else
            return y;
    }

    //最大子数组之和
    public int  maxSubArr(int[] arr){
        int sum = arr[0];  //最大值子数组和
        int sub_sum = arr[0];//中间值

        for(int i = 1; i<arr.length; i++){
            sub_sum = max(arr[i],sub_sum+arr[i] );
            sum = max(sub_sum,sum);
        }
        return sum;
    }
}

3 再添加TestMaxinum 

下面是手动添加的测试类代码

/**
 * Created by hqj on 2017/7/30.
 */

import com.lfb.Bll.SubArray;
import junit.framework.TestCase;

/**.sau.maximun.SubArray;
 import junit.framework.TestCase;

 /**
 * @author m
 * @单元测试
 * @time 2016/10/7
 */
public class TestMaximun extends TestCase {

    //对方法max进行测试
    public void testMax(){
        int x = 1;  //测试数据
        int y = 2;
        int z = -1;
        SubArray sub = new SubArray();
        int result1 = sub.max(x, y);
        int result2 = sub.max(y,x);
        int result3 = sub.max(z, x);
        assertTrue(result1 == y);
        assertTrue(result2 == y);
        assertTrue(result3 == 1);
    }

    //对方法maxSubArr测试
    public void testMaxSubArr(){

        int arr1[] ={1,2,3,-1}; //测试用例
        int arr2[] = {1,2,-4,8,4,-4,6,-2,1};
        int  arr3[] ={-4,-2,-1,-3};
        int arr4[] = {-4,2,-4,2,-1};
        SubArray sub = new SubArray();


        assertTrue(sub.maxSubArr(arr1) == 6);
        assertTrue(sub.maxSubArr(arr2) == 14);
        assertTrue(sub.maxSubArr(arr3) == -1);
        assertTrue(sub.maxSubArr(arr4) == 2);
    }
}

运行或调试测试

点击左边的绿色箭头,会出现run test or debug test,如下图



运行结果:(Errors:0,Failure:0 说明测试通过,如果出错,Failure是单元测试所期望的错误,说明你的代码结果不满足你的要求,Errors需要你查看系统的配置,检查代码。是不是手动输入快好多?)
总结:测试类需要继承junit.framework.TestCase类,测试方法命名需要按照public void TestXXXX格式,通过断言来判断结果的正确行。

自动生成单元测试类模板

1 Settings -Plugins,在browse里找到并安装 JunitGenerator V2.0插件 ,安装后会提示需要重启

2 在要生成测试的类名上右键,Generate(alt+insert) 会让你选择JUnit Test -- JUnit4,这样就生成了测试类的模板,但你会发现生成的路径有问题,且有日期乱码

3 通过修改配置解决上面遇到的问题,如图:



可以看到,Output Path 中有几个属性,分别解释一下

${SOURCEPATH}    原类的路径,就是你自己写的类
${PACKAGE}       原类的包名,java包命名规范就是按照包名一级一级创建文件夹的嘛
${filename}      测试类的类名
所以 Output Path 改成这样  ${SOURCEPATH}/../../test/java/${PACKAGE}/${FILENAME}
然后再修改 Junit4 选项卡中包的申明,把默认的 package test.$entry.packageName; 改成 package $entry.packageName;  还有@since <pre>$date</pre> 改为@since <pre>$today</pre>

这样再生成的测试类代码就没什么问题了


--- end ---


  • 8
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
下面是一个使用Spring Boot进行单元测试例子: ```java import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.http.MediaType; import org.springframework.test.context.junit.jupiter.SpringJUnitConfig; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.result.MockMvcResultMatchers; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; @SpringBootTest @AutoConfigureMockMvc public class UserControllerTest { @Autowired private MockMvc mockMvc; @Test public void getUserByIdTest() throws Exception { mockMvc.perform(MockMvcRequestBuilders.get("/users/{id}", 1) .accept(MediaType.APPLICATION_JSON)) .andExpect(MockMvcResultMatchers.status().isOk()) .andExpect(MockMvcResultMatchers.jsonPath("$.id").value(1)) .andExpect(MockMvcResultMatchers.jsonPath("$.name").value("John")) .andDo(print()); } } ``` 这个例子是针对一个UserController进行测试的。使用`@SpringBootTest`注解启动Spring Boot的上下文,`@AutoConfigureMockMvc`注解自动配置MockMvc对象。在`getUserByIdTest`方法中,使用`MockMvc`对象模拟发送GET请求,然后通过`MockMvcResultMatchers`断言返回的结果。最后通过`andDo(print())`方法输出请求与返回的详细信息。 这是一个简单例子,具体的测试方法可以根据业务需求编写。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值