`

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,就会发现,没有被测试覆盖到的代码都将高亮显示为红色。覆盖的代码颜色则是绿色。如果一些代码是只覆盖部分,那没将显示为黄色。

 

 

分享到:
评论

相关推荐

    使用IDEA创建的一个简单的react项目

    - 按照向导设置项目名称、位置和配置其他选项,如选择React版本和是否创建测试文件。 - IDEA将自动执行`create-react-app`命令,生成一个基础的React项目结构。 2. **项目结构** - `demo-react01`:这是你的项目...

    IDEA创建ssm项目

    2. **创建测试类**:编写JUnit测试类,对服务层方法进行单元测试。 四、项目结构 项目结构通常如下: ``` - src - main - java - com.example (根据你的GroupId和ArtifactId) - controller (Controller层) -...

    idea下test自动测试profiles配置

    你可以为每个profile指定不同的测试类或者排除某些测试。 ```xml ... &lt;id&gt;helloProfile &lt;groupId&gt;org.apache.maven.plugins &lt;artifactId&gt;maven-surefire-plugin &lt;version&gt;3.0.0-M5 &lt;include&gt;...

    用idea创建的maven web项目

    通过IDEA创建的Maven项目,可以方便地进行代码编写、编译、测试和部署,同时也支持多种框架和库的集成,为开发者提供了便利。 【标签】"java,idea"提示我们这个项目是基于Java语言,并且使用了IDEA作为开发工具。...

    2.idea创建一个web项目.rar

    本资源"2.idea创建一个web项目.rar"是一个关于如何使用IDEA创建Web项目的视频教程,以下是基于这个主题的详细知识点讲解: 1. **IDEA简介**:IDEA是JetBrains公司推出的一款专业级Java IDE,它具有代码自动补全、...

    idea单元测试jar包

    接着,我们可以在JUnit测试类中编写测试方法,利用JUnit的注解和Hamcrest的匹配器来编写断言。IDEA会自动识别这些测试,并在运行或调试时执行它们。 单元测试的重要性在于它能够帮助我们尽早发现和修复代码中的问题...

    Intelli idea 创建 SpringMVC 工程

    **SpringMVC 框架在 IntelliJ IDEA 中的创建步骤** SpringMVC 是一个轻量级的、基于组件的 Web 应用框架,它作为 Spring 框架的一部分,为开发 MVC(Model-View-Controller)模式的应用程序提供了强大支持。在 ...

    IntelliJ IDEA上创建Maven Spring MVC项目

    在本文中,我们将深入探讨如何使用IntelliJ IDEA创建一个基于Maven的Spring MVC项目。首先,我们需要了解几个核心概念: 1. **IntelliJ IDEA**:这是一款强大的Java集成开发环境(IDE),广泛用于Java应用程序的...

    IntelliJ IDEA中创建Spring boot项目,定时任务测试

    通过以上步骤,我们便能在IntelliJ IDEA中成功创建一个Spring Boot项目,并实现定时任务的测试。这种集成方式不仅提高了开发效率,也使得项目管理和调试变得更加便捷。在实际开发中,还可以结合其他Spring Boot特性...

    idea中创建ssm项目

    9. **创建DAO和Service**:根据业务需求,创建MyBatis的Mapper接口和实现类,以及对应的Service接口和实现类。 10. **编写Controller**:在Spring MVC的Controller层处理HTTP请求,调用Service进行业务逻辑处理。 ...

    Idea创建的Servlet工程

    在这个"Idea创建的Servlet工程"中,提供的文件`servletTest02`可能是一个测试用例或者包含了特定的Servlet实现。通过阅读和理解这个文件,可以更深入地学习如何在Idea中创建和调试Servlet。 总结来说,Servlet是...

    IDEA创建JSF项目所需jar包.zip

    这个“IDEA创建JSF项目所需jar包.zip”文件包含了两个关键的库文件,它们对于在IDEA中成功搭建JSF项目至关重要。下面我们将详细探讨这两个jar包的作用以及JSF项目的构建过程。 1. javax.faces(1).jar: 这个jar...

    idea spring boot 多模块项目创建

    本文将深入探讨如何在IntelliJ IDEA(Idea)中创建一个基于Spring Boot的多模块项目,以及这样做的好处。 首先,我们来理解Spring Boot多模块项目的概念。一个Spring Boot项目可以被拆分成多个独立的模块,每个模块...

    idea工具创建的Spring+SpringMVC+Hibernate+maven项目

    标题中的"idea工具创建的Spring+SpringMVC+Hibernate+maven项目"指的是使用IntelliJ IDEA这个集成开发环境(IDE)构建的一个Java Web项目,该项目整合了四个关键的技术框架:Spring、SpringMVC、Hibernate以及Maven...

    idea 创建springboot.doc

    ### 使用IntelliJ IDEA创建Spring Boot项目教程 #### 一、前言 随着Spring Boot的流行,越来越多的开发者选择使用Spring Boot来构建他们的应用程序。Spring Boot简化了开发过程中的许多繁琐步骤,使得开发者能够更...

    Idea搭建EJB架构Demo项目源代码

    【描述】中的"Idea搭建EJB架构Demo项目源代码"表明,这个压缩包可能包含了创建EJB项目的所有必要文件,包括但不限于`.java`源代码文件、配置文件、Maven或Gradle构建脚本等,这些资源可以帮助开发者了解如何在Idea中...

    在idea中创建项目,使用jdbc进行连接mysql

    创建一个新的Java类,如`JdbcConnectionExample.java`,在其中编写连接MySQL的代码。首先导入必要的库: ```java import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; ...

    hello idea项目

    IntelliJ IDEA创建新项目时,通常会自动生成一系列文件和目录,包括源代码目录(src/main/java)、资源文件目录(src/main/resources)、测试代码目录(src/test/java)以及构建配置文件(如pom.xml或build.gradle)...

    IDEA创建AIDL示例

    本教程将通过IDEA这个强大的Android开发工具,演示如何创建和使用AIDL来构建服务与客户端之间的通信桥梁。** **步骤1:创建AIDL接口** 1. 打开IDEA,创建一个新的Android项目,确保在项目中包含一个Service组件。 2...

    IDEA创建SSM

    本文将详细介绍如何使用IDEA创建一个基于SSM框架的项目,即整合Spring、SpringMVC和Mybatis的Web应用。 **一、Spring框架** Spring是Java企业级应用的事实标准,它提供了全面的编程和配置模型,旨在简化企业级Java...

Global site tag (gtag.js) - Google Analytics