`

IDEA创建测试类

    博客分类:
  • IDEA
阅读更多

IDEA创建测试类

本文按以下顺序讲解JUnit4的使用

  • 下载jar包
  • 单元测试初体验
  • 自动生成测试类
  • 执行顺序
  • @Test的属性
  • 代码覆盖率

下载jar包

在github上,把以下两个jar包都下载下来。下载地址:点击打开链接


 

下载junit-4.12.jar,junit-4.12-javadoc.jar(文档),junit-4.12-sources.jar(源码)。


 

下载hamcrest-core-1.3.jar,hamcrest-core-1.3-javadoc.jar(文档),hamcrest-core-1.3-sources.jar(源码)。


 

最前面那个pom是Maven的配置文件,如果你需要的话也下载下来。

单元测试初体验

先创建个简单的项目体验下单元测试是怎么一回事吧。

我创建一个项目叫JUnit4Demo,刚创建好的工程目录如下图,然后在External Libraries中导入刚下载的那两个jar包。

                        

通过Libraries添加Jar包

1.打开 File -> Project Structure ->Modules-> 在Dependencies 下添加jar包

              

2、+ -> Library... -> java -> 选择jar的路径添加。   添加jar包后如下图所示。

                   

3、创建一个类com.hera.util.Math,然后输入一个求阶乘的方法:

                    

4、创建一个队Math方法的单元测试:

        创建一个和src同级别的文件夹叫test(逻辑代码放src里,测试代码放test里是个好习惯)。
        接着在IntelliJ IDEA里还要把这个test文件夹要设置成测试文件的根目录,右键选中
        Mark Directory As - Test Sources Root。

                                     
           创建一个测试类:

            IntelliJ IDEA提供了一个快捷操作Cmd + Shift + T作为类和测试之间的导航。同时允许用户在那里创建一个测试类。IntelliJ IDEA提供了一个快捷操作Cmd + Shift + T作为类和测试之间的导航。同时允许用户在那里创建一个测试类。

          为测试类MathTest添加测试方法:

              

                 

                运行: run MathTest 。右下方一条绿色条说明测试通过,如果把120改成别的数字那么就会测试不通过显色红色条。JUnit4有一句话叫:“keeps the bar green to keep the code clean”。

        解释一下MathTest,就六个地方要讲:
                  第一,导入了org.junit.Test;和org.junit.Assert.*;这两个包,注意后者是静态导入import static。
                  第二,testFactorial是在要测试的方法名Factorial前加个test(这也是个好习惯)。
                  第三,所有测试方法返回类型必须为void且无参数。
                  第四,一个测试方法之所以是个测试方法是因为@Test这个注解。
                  第五,assertEquals的作用是判断两个参数是否相等,例子中120是预期结果,new Math().factorial(5)是实                              际结果。但是通常不应该只比较一个值,要测试多几个特殊值,特别是临界值。

                            例如Math().factorial(0)和Math().factorial(-1)等。
                 第六,assertEquals除了比较两个int,还重载了好多次可以比较很多种类型的参数。而且JUnit4包含一堆                                assertXX方法,assertEquals只是其中之一,这些assertXX统称为断言。刚不是下载了junit-4.12-                                 javadoc.jar这个文档吗,解压后打开index.html如下图还有一堆断言。

                   

      

执行顺序

 

JUnit4利用JDK5的新特性Annotation,使用注解来定义测试规则。
这里讲一下以下几个常用的注解:

  • @Test:把一个方法标记为测试方法
  • @Before:每一个测试方法执行前自动调用一次
  • @After:每一个测试方法执行完自动调用一次
  • @BeforeClass:所有测试方法执行前执行一次,在测试类还没有实例化就已经被加载,所以用static修饰
  • @AfterClass:所有测试方法执行完执行一次,在测试类还没有实例化就已经被加载,所以用static修饰
  • @Ignore:暂不执行该测试方法

 

我们来试验一下,我新建一个测试类AnnotationTest,然后每个注解都用了,其中有两个用@Test标记的方法分别是test1和test2,还有一个用@Ignore标记的方法test3。然后我还创建了一个构造方法,这个构造方法很重要一会会引出一个问题。
具体代码如下:

package com.xuhongchuan.util;

import org.junit.*;
import static org.junit.Assert.*;

/**
 * Created by xuhongchuan on 2015/7/18.
 */
public class AnnotationTest {

    public AnnotationTest() {
        System.out.println("构造方法");
    }

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

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

    @Before
    public void setUp() {
        System.out.println("Before");
    }

    @After
    public void tearDown() {
        System.out.println("After");
    }

    @Test
    public void test1() {
        System.out.println("test1");
    }

    @Test
    public void test2() {
        System.out.println("test2");
    }

    @Ignore
    public void test3() {
        System.out.println("test3");
    }

}

运行结果如下:

BeforeClass
构造方法
Before
test1
After
构造方法
Before
test2
After
AfterClass

 

        解释一下:@BeforeClass和@AfterClass在类被实例化前(构造方法执行前)就被调用了,而且只执行一次,通常用来初始化和关闭资源。@Before和@After和在每个@Test执行前后都会被执行一次。@Test标记一个方法为测试方法没什么好说的,被@Ignore标记的测试方法不会被执行,例如这个模块还没完成或者现在想测试别的不想测试这一块。
       以上有一个问题,构造方法居然被执行了两次。所以我这里要说明一下,JUnit4为了保证每个测试方法都是单元测试,是独立的互不影响。所以每个测试方法执行前都会重新实例化测试类。
      我再给你看一个实验:

 

 

      添加一个成员变量

 

 

int i = 0;

 

然后把test1改为:

    i++;
    System.out.println("test1的i为" + i);

test2改为:

    i++;
    System.out.println("test2的i为" + i);

执行结果:

BeforeClass
构造方法
Before
test1的i为1
After
构造方法
Before
test2的i为1
After
AfterClass

 

       可以看到test1和test2的i都只自增了一次,所以test1的执行不会影响test2,因为执行test2时又把测试类重新实例化了一遍。如果你希望test2的执行受test1的影响怎么办呢?把int i改为static的呗。

        最后关于这些注解还有一个要说明的就是,你可以把多个方法标记为@BeforeClass、@AfterClass、@Before、@After。他们都会在相应阶段被执行。

 

 

@Test的属性

 

最后来说一下@Test的两个属性

  • excepted
  • timeout
    excepted属性是用来测试异常的,我们回到Math类,拿其中的求阶乘方法factorial()来说。如果传进来一个负数我们是希望抛出异常的,那要测试会不会抛异常怎么办呢?
    我在测试类MathTest添加一个测试方法:    
  •                

          这个方法就是(expected = Exception.class)和fail("factorial参数为负数没有抛出异常");之间的配合。就是这个测试方法会检查是否抛出Exception异常(当然也可以检测是否抛出其它异常),如果抛出了异常那么测试通过(因为你的预期就是传进负数会抛出异常)。没有抛出异常则测试不通过执行fail("factorial参数为负数没有抛出异常");

         然后说下timeout属性,这个是用来测试性能的,就是测试一个方法能不能在规定时间内完成。
回到Math类,我创建一个数组排序的方法,用的是冒泡排序。
        
public void sort(int[] arr) {
    //冒泡排序
for (int i = 0; i < arr.length - 1; i++) { //控制比较轮数
for (int j = 0; j < arr.length - i - 1; j++) { //控制每轮的两两比较次数
if (arr[j] > arr[j + 1]) {
                int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
        }
    }
}
      然后偶在测试类MathTest创建测试方法,随机生成一个长度为50000的数组然后测试排序所用时间。timeout的值为2000,单位和毫秒,也就是说超出2秒将视为测试不通过。
@Test(timeout = 2000)
public void testSort() throws Exception {
    int[] arr = new int[50000]; //数组长度为50000
int arrLength = arr.length;
//随机生成数组元素
Random r = new Random();
    for (int i = 0; i < arrLength; i++) {
        arr[i] = r.nextInt(arrLength);
}

    new Math().sort(arr);
}
      运行结果测试不通过,且提示TestTimedOutException。
      那怎么办,修改代码提升性能呗。回到Math方法改为下sort()。这次我用快速排序,代码如下:
public void sort(int[] arr) {
    //快速排序
if (arr.length <= 1) {
        return;
} else {
        partition(arr, 0, arr.length - 1);
}
}

static void partition(int[] arr, int left, int right) {
    int i = left;
    int j = right;
    int pivotKey = arr[left]; //基准数
while (i < j) {
        while (i < j && arr[j] >= pivotKey) {
            j--;
}

        while (i < j && arr[i] <= pivotKey) {
            i++;
}

        if (i < j) {
            int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
    }

    if (i != left) {
        arr[left] = arr[i];
arr[i] = pivotKey;
}

    if (i - left > 1) {
        partition(arr, left, i - 1);
}

    if (right - j > 1) {
        partition(arr, j + 1, right);
}

}
         然后再运行一下测试类MathTest,绿色条出现了,测试通过妥妥的。

 

 

编辑测试设置

       我们可以通过Run → Edit Configurations或工具栏上的标签来调整我们的测试运行配置。

        

 

       在Configuration选项卡,用户可以选择需要运行的测试。例如,您可以从一个类、程序包、测试套件或甚至模式中运行所有的测试。这里的Fork模式让用户在一个单独的进程运行每个测试。

 

        在代码覆盖标签你可以调整覆盖率设置。目前IntelliJ IDEA支持两种测量覆盖率引擎。默认情况下它使用自己的引擎,当然用户也可以选择JaCoCo引擎。用户也可以在这里选择覆盖率模式。Tracing{span{ mode模式会增加消耗,但测量会更精确。

                 

运行覆盖

         收集覆盖率,用户需要通过Run → Run 'MyClassTest' with Coverage或工具栏上的选项运行特定模式的测试。

        当覆盖模式运行至少一个测试之后,IDE将会在Project工具窗口显示每个程序包、类的覆盖率数据,同时在Coverage工具窗和编辑器中也会显示。

         

 

编辑器中的覆盖率

如果用户添加另一个方法到MyClass,并运行覆盖率测MyClass,就会发现,没有被测试覆盖到的代码都将高亮显示为红色。覆盖的代码颜色则是绿色。如果一些代码是只覆盖部分,那没将显示为黄色。

 

 

分享到:
评论

相关推荐

    mybatis资料,传统方式创建mybatis项目1.创建java项目2.导入mybatis资源3.创建主配置文件…………

    传统方式创建mybatis项目 1.创建java项目 2.导入mybatis资源 3.创建主配置文件:mybatis.xml 4.创建分层包 5.... 6.... 7.... 8.创建sql映射文件:接口名称.xml... test 存放测试类 类/接口的格式:接口名称+方法+Test

    MySQL数据库在idea中的增删改查,JDBC简化,JDBC工具类封装,orm模式,数据库三层架构,JDBC事务

    要求使用orm框架,在其中创建一个包含全部功能需求(方法)的接口,再创建接口的实现类,再通过测试类实现功能,还有数据库三层架构:分别创建三个包为dao包负责数据库数据的存取,service业务层负责逻辑的操作,...

    SpringBoot(powernode)(教学视频+源代码)

    测试类 4.2.3 @Qualifier注解 配置类2 测试类2.1 测试类 2.2 配置类3 HelloController.java① HelloController.java② 4.2.4 @Primary 主候选的 4.2.5 @Import注解 4.2.6 @ComponentScan("com.bjpowernode")配置扫描...

    Intellij-IDEA-Tutorial-Smart:Intellij IDEA 中文教程

    前言一.Intellij IDEA 初体验二.Intellij IDEA 基本常识Debug 讲解自动生成代码选择重写,实现接口的方法自动创建 Test 测试类插件介绍打jar包和打war包三.版本控制篇版本控制总介绍svn 集成svn 简单使用git和github...

    SpringBoot AOP切面类三种写法(源代码)

    1.4 创建Javabean测试类 1.5 创建切面 1.6 测试类 1.7 测试结果 1.8 结论 1.9 代理方式的切换 1.9.1 设计一个接口ManInterface 1.9.2 javaBean目标类Man实现ManInterface接口 1.9.3 修改application.yml文件的切换...

    IDEA快捷键使用

    Ctrl+Alt+T 创建单元测试用例 Alt+Shift+F10 运行程序 Shift+F9 启动调试 Ctrl+F2 停止 Crtl+N:定位到Java类 Crtl+Shift+N:定位到文件 Crtl+Alt+Shift+N:定位到标识,这里标识主要是指Java类中的属性和函数名 ...

    SpringBoot实战:整合jUnit测试框架

    SpringBoot实战:整合jUnit测试框架一、前言二、添加依赖三、简单业务代码四、创建测试类五、运行测试类1.单个方法或类的测试2.运行整个项目的测试方法2.1.使用IDEA运行整个项目的测试类2.2.使用maven命令运行整个...

    work_space_idea:新的项目仓库

    fonts-js-unpackage // apk存放位置-audio.html-index.html // 测试住界面-manifest.jsonmobilewebvoiceChat-src-main-java-com-chat-common // 通用类-util // 工具类-sys-web-entity-service-socket-web-resources...

    MyBatis Plus学习项目-idea

    6.2 创建Service接口和实现类 6.3 测试查询记录数 6.4 测试批量插入 常用注解 1、@TableName 2、@TableId 3、@TableField 4、@TableLogic 4.1 逻辑删除 4.2 实现逻辑删除 4.3 实体类中添加逻辑删除属性 4.4 测试 ...

    springboot操作mysql操作库可运行

    是用idea开发的,有源代码,并有red说明文档,可运行的。我邮件为350038760@qq.com

    GSON入门篇(教学视频+源代码)

    四、测试类 4.1 一个对象转JSON 4.2 多个对象转JSON 4.3 JSON字符串转一个对象 4.4 JSON字符串转多个对象(List) 4.4.1 错误案例 4.4.2 正确案例 1、Java 解析 Json 最常用的类库有:google 的 Gson、阿里巴巴的 ...

    mybatis环境搭建

    打开IDEA创建一个Maven项目 注意这里我们不用模板,就直接选择jdk后点击【Next】就可以了 第四步:创建映射文件 在静态资源【resources】创建一个配置文件,它的路径要和他的接口一样...

    SSM配置demo

    使用idea和maven 整合了ssm项目的基本配置,test包中有测试类,domain只包含一个teacher类,可自行根据字段创建数据库。测试可运行

    基于Java-Springboot的bbs论坛-问答社区源码

    执行SQL,创建数据库 项目导入IDEA 启动 访问测试! 自行根据代码逻辑填充测试数据,查看即可! src/main/java/com/kuang - config 配置类 - controller controller - generator 代码生成器 - mapper mapper - pojo...

    @ConfigurationProperties注解使用方法(源代码)

    @ConfigurationProperties注解使用方法(源代码) ...3.1.2.7 测试类 3.1.3问题与解答 问题: 解答与分析: 案例实操 3.2 作用于Class类及其用法 3.2.1 数据库的创建 3.2.2创建并搭建项目 3.2.3 添加依赖 3.2.3.

    POI操作WORD 官方测试案例 DEMO.zip

    JAVA操作MS office 工具 POI操作WORD 官方测试案例 DEMO(含jar包,IDEA) 可直接运行测试。 ------------------------------------------------------ 1 什么是Apache POI 全称Apache POI,使用Java编写的免费...

    运行文件

    跑 Run.jl提供了在隔离的环境中运行测试或构建文档的功能。... 使用以下命令创建一个文件,例如.github/workflow/test.yml : name : Run testson : push : branches : - master tags : ' * ' pull_request :jobs

    SpringBoot——什么是SpringBoot、SpringBoot入门、创建SpringBoot

    四、如何通过IDEA创建SpringBoot项目 1、主程序类,主入口类 2、编写相关的Controller、Service 3、测试运行 一、回顾什么是Spring ? 跳转到目录 Spring是一个开源框架,2003 年兴起的一个轻量级的Java 开发框架,...

    Springboot开发.doc

    在项目中创建必要的包和类。 编写控制器(Controller)类来处理HTTP请求。 编写服务(Service)类来处理业务逻辑。 编写数据访问对象(DAO)或仓库(Repository)类来与数据库交互。 编写配置类(Configuration)来...

    Java课程设计大作业,包含面板设计,接口设计,各种功能植入

    创建项目:使用IDE(如Eclipse、IntelliJ IDEA)创建一个新的Java项目。 面板设计:使用Java Swing或JavaFX创建各个面板,可以使用布局管理器来布局面板上的组件。 接口设计:创建Java接口来定义系统的各个模块...

Global site tag (gtag.js) - Google Analytics