单元测试_JUnit常用单元测试注解介绍及代码演示 2

简介: 单元测试_JUnit常用单元测试注解介绍及代码演示

 

5. 单元测试实践

被测类BinarySearch

 

package org.shouke.demo;

 

publicclass BinarySearch {

 

   publicint binarySearch(long[] a, long key) {

       int low = 0;

       int high = a.length - 1;

       

       while (low <= high) {

           int mid = (low + high) >>> 1;

           

           long midVal = a[mid];

           

           if (midVal < key)

               low = mid + 1;

           elseif (midVal > key)

               high = mid - 1;

           else

               return mid;

       }

       return -1;

   }

   

 

}

 

测试类BinarySearchTest

 

package org.shouke.test;

 

import org.junit.After;

import org.junit.AfterClass;

import org.junit.Assert;

import org.junit.Ignore;

import org.junit.Test;

import org.junit.Before;

import org.junit.BeforeClass;

import org.junit.runner.RunWith;

import org.junit.runners.JUnit4;

 

import org.shouke.demo.BinarySearch;

 

//@RunWith(SpringRunner.class)

@RunWith(JUnit4.class)

//@SpringBootTest

//@TestPropertySource("classpath:test-application.properties")

public class BinarySearchTest {

 

   private BinarySearch binarySearch = new BinarySearch();

 

   private long[] array1 = new long[] {};

 

   

   @Test

   public void testBinarySearch1() {

       System.out.println("执行方法 testBinarySearch1");

 

    int index = binarySearch.binarySearch(array1, 401L);

       Assert.assertEquals(-1, index);

 

   }

 

   private long[] array2 = new long[] {123L,123L,123L,123L,123L,123L,123L,123L};

   

   @Ignore

   public void testBinarySearch2() {

       System.out.println("执行方法 testBinarySearch2");

    int index = binarySearch.binarySearch(array2, 401L);

       Assert.assertEquals(-1, index);

   }

 

 private long[] array3 = new long[] {123L, 456L};

 

 

 @Test

 public void testBinarySearch3() {

     System.out.println("执行方法 testBinarySearch3");

 int index = binarySearch.binarySearch(array3, 401L);

     Assert.assertEquals(-1, index);

 }

 

 private long[] array4 = new long[] {123L, 456L};

 

 

 @Test

 public void testBinarySearch4() {

     System.out.println("执行方法 testBinarySearch4");

     

     int index = binarySearch.binarySearch(array4, 40L);

     Assert.assertEquals(-1, index);

 }

 

 

 private long[] array5 = new long[] {123L, 456L};

 

 @Test

 public void testBinarySearch5() {

     System.out.println("执行方法 testBinarySearch5");

 

 int index = binarySearch.binarySearch(array5, 123L);

     Assert.assertEquals(0, index);

 }

 

 private long[] array6 = new long[] {123L, 123L};

 

 @Test

 public void testBinarySearch6() {

     System.out.println("执行方法 testBinarySearch6");

 

 int index = binarySearch.binarySearch(array6, 123L);

     Assert.assertEquals(0, index);

 }

 

 

 

 

 @Before

 public void testBeforeMethod() {

     System.out.println("执行每个方法前先执行该函数");

 }

 

 

 

 @After

 public void testAfterMethod() {

     System.out.println("执行完每个方法后都会执行该函数");

 }

 

 

 

 @BeforeClass

 public static void testBeforeClass() {

     System.out.println("执行测试类的所有方法前先执行该函数");

 }

 

 

 

 @AfterClass

 public static void testAfterClass() {

     System.out.println("执行完测试类的所有方法后都会执行该函数");

 }

 

 

}

 

 

被测类Caculator

package org.shouke.demo;

 

 

publicclass Caculator {

 

   publicint caculate(int arg1, int arg2) {

       if (arg1 > arg2) {

        return arg1 - arg2;

       } elseif (arg1 < arg2) {

        return arg1 + arg2;

       } else {

        return arg1;

       }

 

   }

   

 

}

 

测试类CaculatorTest

package org.keshou.test;

 

import org.junit.Assert;

import org.junit.Test;

import org.junit.runner.RunWith;

import org.junit.runners.Parameterized;

 

import org.shouke.demo.Caculator;

import java.util.Arrays;

import java.util.Collection;

 

@RunWith(Parameterized.class)

public class CaculatorTest {

 

   private Caculator caculator = new Caculator();

 

   public int arg1;

   public int arg2;

   

   public CaculatorTest(int arg1, int arg2) {

    this.arg1 = arg1;

    this.arg2 = arg2;

   }

   

//  @Parameterized.Parameters

   @Parameterized.Parameters(name = "{index}: (arg1: {0} arg2: {1}")

   public static Collectiondata() {

      return Arrays.asList(new Object[][] {

              { 10, 1}, { 5, 1 }

      });

   }

 

 

 

   @Test

   publicvoid testCaculate1() {

    int result = caculator.caculate(arg1, arg2);

    System.out.println("执行方法 testCaculate1  参数:" + arg1 + " " + arg1);

    Assert.assertEquals(result, arg1-arg2);

   }

 

 

   @Test

   publicvoid testCaculate2() {

    int result = caculator.caculate(arg1, arg2);

    System.out.println("执行方法 testCaculate2   参数:" + arg1 + " " + arg1);

    Assert.assertEquals(result, arg1+arg2);

   }

}

 

说明:被@Parameters 注解修饰用于提供参数的方法有多少个参数,那么就需要为其所在类提供对应数量的类属性,及一个包含对应数量的参数的构造函数,否则会报错:java.lang.IllegalArgumentException: wrong number of arguments

 

 

 

测试套件类RunAllTestClass

package org.keshou.test;

 

import org.junit.runner.RunWith;

import org.junit.runners.Suite;

 

 

@RunWith(Suite.class)

@Suite.SuiteClasses({CaculatorTest.class, org.shouke.test.BinarySearchTest.class})

public class RunAllTestClass {

 

}

 

说明:如果需要运行多个测试类,只需要把目标测试类名称.class放入如下的 {}中即可,测试类之间使用逗号分隔,如果不是同一个包中的测试类,记得加上对应的package名称,或者使用import提前导入对应类。

 

@Suite.SuiteClasses({A.class, B.class, ...})

 

 

 

运行单元测试

如下图,右键整个项目、单个测试类、测试套件 ->  Coverage As  ->  JUnit Test

 

或者

如下图,右键整个项目、单个测试类、测试套件 -> Run As  ->  JUnit Test

 

 

 

 

 

说明:

1、如果右键时选择的是整个项目,那么项目src\test\;font-size:10.5000pt;mso-font-kerning:0.0000pt;">目录下的都有测试类都会被执行。

 

2、Coverage as 和 Run as 这两种运行方式的区别在于前者运行完成,会在控制台端自动打开 Coverage 界面,展示覆盖率,后者需要手动打开,打开方式如下:

Window -> Show View -> Java -> Coverage

 

 

 

运行结果展示

 

运行测试套件

 

 


目录
相关文章
|
1月前
|
测试技术 开发者 Python
Python单元测试入门:3个核心断言方法,帮你快速定位代码bug
本文介绍Python单元测试基础,详解`unittest`框架中的三大核心断言方法:`assertEqual`验证值相等,`assertTrue`和`assertFalse`判断条件真假。通过实例演示其用法,帮助开发者自动化检测代码逻辑,提升测试效率与可靠性。
201 1
|
2月前
|
算法 IDE Java
Java 项目实战之实际代码实现与测试调试全过程详解
本文详细讲解了Java项目的实战开发流程,涵盖项目创建、代码实现(如计算器与汉诺塔问题)、单元测试(使用JUnit)及调试技巧(如断点调试与异常排查),帮助开发者掌握从编码到测试调试的完整技能,提升Java开发实战能力。
328 0
|
10天前
|
安全 Java 测试技术
《深入理解Spring》单元测试——高质量代码的守护神
Spring测试框架提供全面的单元与集成测试支持,通过`@SpringBootTest`、`@WebMvcTest`等注解实现分层测试,结合Mockito、Testcontainers和Jacoco,保障代码质量,提升开发效率与系统稳定性。
|
19天前
|
Java 测试技术 数据库连接
【SpringBoot(四)】还不懂文件上传?JUnit使用?本文带你了解SpringBoot的文件上传、异常处理、组件注入等知识!并且带你领悟JUnit单元测试的使用!
Spring专栏第四章,本文带你上手 SpringBoot 的文件上传、异常处理、组件注入等功能 并且为你演示Junit5的基础上手体验
514 2
|
1月前
|
人工智能 边缘计算 搜索推荐
AI产品测试学习路径全解析:从业务场景到代码实践
本文深入解析AI测试的核心技能与学习路径,涵盖业务理解、模型指标计算与性能测试三大阶段,助力掌握分类、推荐系统、计算机视觉等多场景测试方法,提升AI产品质量保障能力。
|
3月前
|
安全 Java 测试技术
Java 项目实战中现代技术栈下代码实现与测试调试的完整流程
本文介绍基于Java 17和Spring技术栈的现代化项目开发实践。项目采用Gradle构建工具,实现模块化DDD分层架构,结合Spring WebFlux开发响应式API,并应用Record、Sealed Class等新特性。测试策略涵盖JUnit单元测试和Testcontainers集成测试,通过JFR和OpenTelemetry实现性能监控。部署阶段采用Docker容器化和Kubernetes编排,同时展示异步处理和反应式编程的性能优化。整套方案体现了现代Java开发的最佳实践,包括代码实现、测试调试
173 0
|
4月前
|
Java 测试技术 容器
Jmeter工具使用:HTTP接口性能测试实战
希望这篇文章能够帮助你初步理解如何使用JMeter进行HTTP接口性能测试,有兴趣的话,你可以研究更多关于JMeter的内容。记住,只有理解并掌握了这些工具,你才能充分利用它们发挥其应有的价值。+
828 23
|
9月前
|
数据可视化 前端开发 测试技术
接口测试新选择:Postman替代方案全解析
在软件开发中,接口测试工具至关重要。Postman长期占据主导地位,但随着国产工具的崛起,越来越多开发者转向更适合中国市场的替代方案——Apifox。它不仅支持中英文切换、完全免费不限人数,还具备强大的可视化操作、自动生成文档和API调试功能,极大简化了开发流程。
|
6月前
|
SQL 安全 测试技术
2025接口测试全攻略:高并发、安全防护与六大工具实战指南
本文探讨高并发稳定性验证、安全防护实战及六大工具(Postman、RunnerGo、Apipost、JMeter、SoapUI、Fiddler)选型指南,助力构建未来接口测试体系。接口测试旨在验证数据传输、参数合法性、错误处理能力及性能安全性,其重要性体现在早期发现问题、保障系统稳定和支撑持续集成。常用方法包括功能、性能、安全性及兼容性测试,典型场景涵盖前后端分离开发、第三方服务集成与数据一致性检查。选择合适的工具需综合考虑需求与团队协作等因素。
851 24