IntelliJ IDEA单元测试入门

IntelliJ IDEA单元测试入门参考文章地址地址 JUnit4 单元测试入门教程 IDEA 单元测试及代码覆盖率 IDEA 添加 jar 包的三种方式本文按以下顺序讲解 JUnit4 的使用下载 jar 包单元测试初体验自动生成测试类执行顺序 Test 的属性

参考文章地址地址:JUnit4单元测试入门教程

                                IDEA单元测试及代码覆盖率

                                                IDEA添加jar包的三种方式

 

 

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

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

下载jar包

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

IntelliJ IDEA单元测试入门

 

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

IntelliJ IDEA单元测试入门

 

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

IntelliJ IDEA单元测试入门

 

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

 

单元测试初体验

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

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

                        

通过Libraries添加Jar包

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

              IntelliJ IDEA单元测试入门

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

                   IntelliJ IDEA单元测试入门

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

                    IntelliJ IDEA单元测试入门

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

                    IntelliJ IDEA单元测试入门                 
           创建一个测试类:

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

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

              IntelliJ IDEA单元测试入门

                 IntelliJ IDEA单元测试入门

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

                   IntelliJ IDEA单元测试入门

      

执行顺序

 

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

 

 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

 

 

 

 

 

      添加一个成员变量

 

 

 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添加一个测试方法:    



  •                IntelliJ IDEA单元测试入门

          这个方法就是(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或工具栏上的标签来调整我们的测试运行配置。

        IntelliJ IDEA单元测试入门

 

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

 

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

             IntelliJ IDEA单元测试入门    

运行覆盖

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

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

         IntelliJ IDEA单元测试入门

 

编辑器中的覆盖率

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

 
 

 

       

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/205330.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午6:16
下一篇 2026年3月19日 下午6:17


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号