在 Java 中使用JUnit5进行单元测试和自动化测试

这篇具有很好参考价值的文章主要介绍了在 Java 中使用JUnit5进行单元测试和自动化测试。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、前言

单元测试和自动化测试是现代软件开发过程中必不可少的环节,可以提高代码质量和开发效率。JUnit5是Java中流行的单元测试框架,本文将介绍如何在Java中使用JUnit5进行单元测试和自动化测试。

二、单元测试

2.1 单元测试的基本概念和原理

单元测试是一种测试方法,用于对软件系统中的最小可测试单元进行测试。这些单元通常是函数、方法或类,是软件系统的构建块。单元测试的目的是验证代码的正确性,以便在将代码发布到生产环境之前检测和纠正错误。

单元测试的基本原理是将被测试的代码单元与它的输入数据进行配对,运行测试并检查输出结果是否符合预期。在单元测试中,测试代码不应该依赖于外部因素(如数据库、文件系统等),而应该只测试代码单元本身的行为和逻辑。因此,单元测试需要使用一些工具和技术,如mock和stub对象等,来模拟外部依赖项和控制测试环境。

单元测试通常采用自动化测试的方式进行,即编写测试代码和测试脚本,使用自动化测试工具进行自动化测试。自动化测试可以大大提高测试效率和质量,使得在开发过程中可以快速反馈和解决问题。同时,单元测试还可以作为代码文档,提供一个实际的例子来展示代码的使用方法和行为。

总之,单元测试是软件开发过程中必不可少的环节,可以提高代码质量和可维护性,降低缺陷率和维护成本。

2.2 使用JUnit5实现单元测试

2.2.1 JUnit5的基本使用方法
  1. 添加JUnit5依赖

在项目的构建文件中添加JUnit5依赖,例如在Maven项目中,在pom.xml文件中添加以下依赖:

<dependency>

<groupId>org.junit.jupiter</groupId>

<artifactId>junit-jupiter-api</artifactId>

<version>5.8.2</version>

<scope>test</scope>

</dependency>

<dependency>

<groupId>org.junit.jupiter</groupId>

<artifactId>junit-jupiter-params</artifactId>

<version>5.8.2</version>

<scope>test</scope>

</dependency>

  1. 编写测试代码

在测试类中编写测试方法,每个测试方法需要使用@Test注解进行标注。例如:

importorg.junit.jupiter.api.Test;

publicclassMyTest {

@Test

voidmyTest() {

// 测试代码

}

}

  1. 运行测试

在IDE中运行测试类,JUnit5会自动执行所有标注了@Test注解的测试方法,并输出测试结果。

2.2.2 断言
  1. JUnit5提供了多种断言来验证测试结果,例如:

  • ​assertEquals(expected, actual)​:验证两个值是否相等。

  • ​assertNotEquals(expected, actual)​:验证两个值是否不相等。

  • ​assertTrue(condition)​:验证条件是否为真。

  • ​assertFalse(condition)​:验证条件是否为假。

  • ​assertNull(object)​:验证对象是否为空。

  • ​assertNotNull(object)​:验证对象是否不为空。

  • ​assertThrows(expectedType, executable)​:验证执行代码是否抛出了指定类型的异常。

2.2.3 参数化测试

JUnit5的参数化测试功能可以让我们使用不同的输入参数多次运行相同的测试方法。这个功能特别适合测试输入参数可能有多个值的情况,以此来确保代码的正确性。下面是JUnit5中使用参数化测试的步骤:

  1. 创建测试类:创建一个Java类,并使用​@RunWith​注解标记测试类,然后使用​@ParameterizedTest​注解标记测试方法。

importorg.junit.jupiter.params.ParameterizedTest;

importorg.junit.jupiter.params.provider.ValueSource;

publicclassMyTest {

@ParameterizedTest

publicvoidmyTestMethod(Stringinput) {

// 测试代码

}

}

  1. 创建参数源:使用​@ValueSource​注解创建一个参数源,它可以为测试方法提供输入参数。

importorg.junit.jupiter.params.ParameterizedTest;

importorg.junit.jupiter.params.provider.ValueSource;

publicclassMyTest {

@ParameterizedTest

@ValueSource(strings= {"Hello", "World", "JUnit5"})

publicvoidmyTestMethod(Stringinput) {

// 测试代码

}

}

  1. 编写测试方法:在测试方法中执行测试代码,然后使用断言来验证结果。

importorg.junit.jupiter.api.Assertions;

importorg.junit.jupiter.params.ParameterizedTest;

importorg.junit.jupiter.params.provider.ValueSource;

publicclassMyTest {

@ParameterizedTest

@ValueSource(strings= {"Hello", "World", "JUnit5"})

publicvoidmyTestMethod(Stringinput) {

intlength=input.length();

Assertions.assertTrue(length>0);

}

}

  1. 运行测试:在JUnit5中,可以使用IDE或者构建工具(例如Maven或Gradle)来运行测试。运行参数化测试后,JUnit5会为每个输入参数分别运行测试方法,并输出测试结果。

除了​@ValueSource​注解外,JUnit5还提供了其他的参数源注解,例如:

  • ​@CsvSource​:使用CSV格式的数据源。

  • ​@MethodSource​:使用一个方法作为数据源。

  • ​@ArgumentsSource​:使用自定义的参数源类。

2.2.4 重复测试

JUnit5的重复测试功能可以让我们多次运行相同的测试方法,以便测试代码在不同条件下的行为。这个功能特别适合测试需要多次执行的场景,例如测试随机数生成器或者测试重复的网络请求等。下面是JUnit5中使用重复测试的步骤:

  1. 创建测试类:创建一个Java类,并使用​@RunWith​注解标记测试类,然后使用​@RepeatedTest​注解标记测试方法。

importorg.junit.jupiter.api.RepeatedTest;

publicclassMyTest {

@RepeatedTest(5)

publicvoidmyTestMethod() {

// 测试代码

}

}

  1. 编写测试方法:在测试方法中执行测试代码,然后使用断言来验证结果。

importorg.junit.jupiter.api.Assertions;

importorg.junit.jupiter.api.RepeatedTest;

publicclassMyTest {

@RepeatedTest(5)

publicvoidmyTestMethod() {

intresult=myMathService.add(2, 3);

Assertions.assertEquals(5, result);

}

}

  1. 运行测试:在JUnit5中,可以使用IDE或者构建工具(例如Maven或Gradle)来运行测试。运行重复测试后,JUnit5会多次运行测试方法,并输出测试结果。

除了​@RepeatedTest​注解外,JUnit5还提供了其他的重复测试注解,例如:

  • ​@ParameterizedTest​:使用多个参数运行相同的测试方法。

  • ​@TestFactory​:动态创建测试方法。

使用JUnit5的重复测试功能能够让我们更加高效地测试代码,并且能够覆盖更多的测试用例。

2.2.5 条件测试

JUnit5的条件测试功能可以让我们在测试时动态地决定是否运行特定的测试或测试类,以及是否跳过某些测试或测试类。这在一些情况下非常有用,例如当我们需要根据操作系统、环境变量或者其他一些条件来控制测试的执行。

在JUnit5中,条件测试需要使用​@Enabled​和​@Disabled​注解来标注测试类或测试方法,并配合一些条件表达式来控制测试的执行。下面是一些常用的条件表达式:

  • ​@EnabledOnOs({OS.WINDOWS, OS.MAC})​:只有在Windows或者Mac OS上才能运行测试。

  • ​@EnabledIfEnvironmentVariable("ENV")​:只有当环境变量"ENV"被设置时才能运行测试。

  • ​@EnabledIfSystemProperty(named = "property", matches = "value")​:只有当系统属性"property"的值匹配"value"时才能运行测试。

  • ​@EnabledIf​和​@DisabledIf​:可以根据自定义的条件表达式来控制测试的执行。

下面是一个示例,展示如何使用条件测试来控制测试的执行:

importorg.junit.jupiter.api.Test;

importorg.junit.jupiter.api.condition.EnabledOnOs;

importorg.junit.jupiter.api.condition.OS;

importstaticorg.junit.jupiter.api.Assertions.assertTrue;

publicclassMyTest {

@Test

@EnabledOnOs(OS.WINDOWS)

voidonlyOnWindows() {

assertTrue(true);

}

@Test

@EnabledOnOs(OS.MAC)

voidonlyOnMac() {

assertTrue(true);

}

@Test

@EnabledIfSystemProperty(named="property", matches="value")

voidonlyWithProperty() {

assertTrue(true);

}

}

在上面的示例中,我们定义了三个测试方法,分别使用了不同的条件表达式来控制测试的执行。例如,​onlyOnWindows()​方法只有在Windows操作系统上才能执行。

2.2.6 测试生命周期

JUnit5的测试生命周期指的是测试框架在运行测试时的一系列步骤和顺序。JUnit5通过一些特定的注解和接口来定义测试生命周期的不同阶段和执行顺序,开发人员可以使用这些注解和接口来扩展测试框架,以满足特定的测试需求。下面是JUnit5的测试生命周期及相关注解和接口:

  1. 测试类生命周期:​@TestInstance​注解

  • PER_CLASS:测试类只会被实例化一次。

  • PER_METHOD:测试类每个测试方法都会被实例化一次(默认)。

  1. 生命周期回调方法:​@BeforeAll​、​@AfterAll​、​@BeforeEach​、​@AfterEach​注解

  • @BeforeAll:在所有测试方法之前运行一次。

  • @AfterAll:在所有测试方法之后运行一次。

  • @BeforeEach:在每个测试方法之前运行。

  • @AfterEach:在每个测试方法之后运行。

  1. 条件测试:​@Enabled​和​@Disabled​注解

  • @EnabledOnOs(OS.LINUX):只有在Linux系统上运行测试。

  • @Disabled("Reason"):禁用测试,可以添加一个理由。

  1. 参数化测试:​@ParameterizedTest​注解

  • @CsvSource:从CSV文件中读取参数。

  • @MethodSource:从方法返回值中读取参数。

  • @ValueSource:从值列表中读取参数。

  1. 测试执行顺序:​@TestMethodOrder(MethodOrderer.class)​和​@Order​注解

  • @TestMethodOrder(MethodOrderer.OrderAnnotation.class):使用​@Order​注解指定测试方法执行顺序。

  • @Order:指定测试方法的执行顺序。

JUnit5的测试生命周期非常灵活,可以通过注解和接口的组合使用来定义测试的执行顺序和执行方式,可以满足不同场景下的测试需求。

2.3 单元测试的适用场景

  1. 对于关键代码单元,特别是那些容易出现错误的代码单元,可以使用单元测试来确保其正确性。

  1. 对于需要频繁修改的代码单元,可以使用单元测试来确保修改后的代码单元的正确性。

  1. 对于需要与其他代码单元进行集成的代码单元,可以使用单元测试来确保它们能够正确地集成。

  1. 对于需要进行自动化测试的代码单元,可以使用单元测试来实现自动化测试。

三、自动化测试

3.1 自动化测试的基本概念和原理

自动化测试是指使用自动化测试工具或脚本来执行测试过程,而不是手动测试。它的目的是提高测试效率、降低测试成本,并保证软件质量。

自动化测试包括以下几点:

  1. 测试脚本编写:自动化测试需要编写测试脚本,测试脚本是一组指令,用于模拟用户行为、执行测试用例、收集测试结果等操作。

  1. 测试工具:自动化测试需要使用测试工具,测试工具是用于执行测试脚本、收集测试结果、生成测试报告等操作的软件。

  1. 自动化测试类型:自动化测试包括单元测试、集成测试、功能测试、性能测试、安全测试等多种类型。

  1. 测试用例设计:自动化测试需要根据需求和设计文档编写测试用例,测试用例是一组输入数据和期望输出结果的组合。

  1. 自动化测试执行:自动化测试需要执行测试脚本和测试用例,收集测试结果并生成测试报告。

  1. 自动化测试维护:自动化测试需要不断更新和维护测试脚本和测试用例,以适应软件变化。

总之,自动化测试是通过使用自动化工具和脚本来执行测试过程,提高测试效率、降低测试成本,并保证软件质量。

3.2 使用JUnit5实现自动化测试

3.2.1 如何结合Selenium WebDriver实现Web应用的自动化测试

下面是使用JUnit5结合Selenium WebDriver实现Web应用自动化测试的步骤:

  1. 安装浏览器驱动程序:Selenium WebDriver需要浏览器驱动程序来控制浏览器。您需要安装与您使用的浏览器相应的驱动程序,并将其添加到系统路径中。例如,如果您要使用Chrome浏览器进行测试,则需要下载ChromeDriver并将其添加到系统路径中。

https://chromedriver.chromium.org/downloads Chrome驱动下载位置,下载后配置环境变量Path。

您可以通过启动驱动程序来测试其是否被正确添加:

chromedriver.exe

如果​PATH​配置正确, 您将看到一些与驱动程序启动相关的输出:

Starting ChromeDriver 111.0.5563.64 (c710e93d5b63b7095afe8c2c17df34408078439d-refs/branch-heads/5563@{#995}) on port 9515
Only local connections are allowed.
Please see https://chromedriver.chromium.org/security-considerations for suggestions on keeping ChromeDriver safe.
ChromeDriver was started successfully.
  1. 引入JUnit5和Selenium WebDriver的相关依赖,例如在Maven项目中可以在pom.xml中添加以下依赖:

<dependencies>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.141.59</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.5.2</version>
<scope>test</scope>
</dependency>
</dependencies>
  1. 编写测试用例,例如:

importstaticorg.junit.jupiter.api.Assertions.assertEquals;
importorg.junit.jupiter.api.Test;
importorg.openqa.selenium.By;
importorg.openqa.selenium.WebDriver;
importorg.openqa.selenium.WebElement;
importorg.openqa.selenium.chrome.ChromeDriver;

publicclassMyTest {
@Test
publicvoidtest() {
// 创建WebDriver对象
WebDriverdriver=newChromeDriver();
// 打开网页
driver.get("https://www.baidu.com");
// 找到输入框和按钮
WebElementinput=driver.findElement(By.id("kw"));
WebElementbutton=driver.findElement(By.id("su"));
// 输入关键字并点击搜索按钮
input.sendKeys("Selenium WebDriver");
button.click();
// 断言搜索结果页的标题是否正确
assertEquals("百度一下,你就知道", driver.getTitle());
// 关闭浏览器
driver.quit();
    }
}
  1. 运行测试用例,可以在命令行中使用Maven命令运行,也可以在IDE中使用JUnit运行器运行。运行测试用例时,会启动Chrome浏览器,在浏览器中输入关键字并点击搜索按钮,然后断言搜索结果页的标题是否正确。

3.2.2 如何编写测试脚本和执行测试用例
  1. 确定测试目标和测试范围:首先需要明确要测试的功能或系统,以及测试的具体范围。这将有助于确定需要编写哪些测试脚本和用例。

  1. 设计测试用例:基于测试目标和测试范围,设计测试用例,即确定针对每个功能或系统应该执行哪些测试步骤。测试用例通常包括输入、操作、预期输出和实际输出等关键信息。

  1. 编写测试脚本:根据设计的测试用例,编写测试脚本,即实现测试用例中的操作步骤,用于自动化执行测试用例。测试脚本可以使用各种编程语言和自动化测试框架进行编写,例如Python、Java、Selenium等。

  1. 执行测试用例:在编写好测试脚本后,可以使用自动化测试工具或测试框架执行测试用例。测试工具会根据测试脚本中定义的操作步骤自动模拟用户行为进行测试,并将实际输出与预期输出进行比较,以检测是否存在问题或错误。

  1. 分析测试结果:测试执行完毕后,需要分析测试结果,即查看测试报告,找出问题所在,并记录问题的详细信息。测试结果分析有助于确定需要改进的地方,并为下一次测试提供改进方向。

3.3 自动化测试的缺点及适用场景

缺点:

  1. 自动化测试需要一定的技术和编程知识:自动化测试需要编写测试脚本,需要具备一定的编程和自动化测试工具的技术知识。

  1. 需要投入一定的时间和资源:在自动化测试中,需要花费一定的时间和资源来编写测试脚本,以及选择和配置测试工具。

  1. 无法涵盖所有测试场景:自动化测试不能涵盖所有的测试场景和测试用例,因为有些测试需要手动测试,例如人工视觉检查等。

适用场景:

  1. 频繁的回归测试:自动化测试特别适合频繁的回归测试,以确保软件在多个版本之间的稳定性和一致性。

  1. 大规模的测试:自动化测试可以快速地执行大量的测试用例,适用于需要对软件进行全面测试的场景。

  1. 复杂的测试:自动化测试可以自动化执行复杂的测试场景和测试用例,以减少测试工程师的工作量和错误率。

  1. 需要频繁的数据变更和数据检查的测试:自动化测试可以自动化地执行数据变更和数据检查的测试,以节省测试时间和测试资源。

四、总结

总的来说,JUnit5是一个功能强大、易于使用的测试框架,可用于编写和运行单元测试和自动化测试。它提供了许多有用的特性,例如生命周期、参数化测试、断言等,可以帮助开发人员更快速、可靠地测试代码,并提高代码的质量和稳定性。文章来源地址https://www.toymoban.com/news/detail-777346.html

到了这里,关于在 Java 中使用JUnit5进行单元测试和自动化测试的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • spring boot 单元测试JUnit5使用Mockito模拟Mock数据调用

    spring boot 单元测试JUnit5使用Mockito模拟Mock数据调用 好大一批新用法,大家静下心来好好看看吧 1. spring boot 使用 Mockito.when().thenReturn()模拟返回值 Mockito 是一种 Java mock 框架,他主要就是用来做 mock 测试的,他可以模拟任何 Spring 管理的 bean、模拟方法的返回值、模拟抛出异常…

    2024年02月15日
    浏览(36)
  • spring boot 单元测试JUnit5使用断言Assertions和假定Assumptions、嵌套、参数测试

    spring boot 单元测试JUnit5使用断言Assertions和假定Assumptions、嵌套、参数测试 本文基于spirng boot 2.7.11, 大家注意自己的版本 Spring Boot 2.2.0 版本开始引入 JUnit 5 作为单元测试默认库 SpringBoot 2.4 以上版本移除了默认对 Vintage 的依赖 源码地址:https://gitcode.net/qq_39339588/springboot.git 1.

    2024年02月11日
    浏览(35)
  • Java中的JUnit是什么?如何使用JUnit进行单元测试

    JUnit是Java中最流行的单元测试框架之一。它可以帮助开发人员在代码编写过程中检测出错误和异常,从而提高代码的质量和可靠性。 JUnit是一个由Kent Beck和Erich Gamma创建的开源Java单元测试框架,它已经成为Java开发中最常用的测试框架之一。这个框架的主要目的是为了简化单元

    2024年02月12日
    浏览(45)
  • 自动化测试之JUnit单元测试框架

    目录 一、什么是 JUnit 二、JUnit5 相关技术 1.注解 1.1 @Test 1.2 @Disabled 1.3 @BeforeAll、@AfterAll 1.4 @BeforeEach、@AfterEach 2.参数化 2.1 单参数 2.2 CSV 获取参数 2.3 方法获取参数 2.4 多参数 3.测试用例的执行顺序 3.1 顺序执行:@TestMethodOrder(MethodOrderer.OrderAnnotation.class) 3.2 随机执行:@TestMetho

    2024年02月06日
    浏览(47)
  • 单元测试框架——Junit5

    Junit是一个开源的用于Java语言的单元测试框架,也是Java方向使用最广泛的单元测试框架。 在pom.xml中引入Junit5相关依赖 @Test :表示一个方法/用例 BeforeEach :表示被注解的方法在其它所有方法执行前都要执行一遍,也就是说其它方法有3个它就要执行3遍 @BeforeAll :表示被注解的

    2024年02月11日
    浏览(35)
  • springboot项目使用Junit5 + mockito + jacoco 实现单元测试以及代码覆盖率检查

    在创建springboot项目时会默认添加spring-boot-starter-test依赖,其中已经包含了junit、mockito依赖,根据springboot版本的不同junit和mockito的版本也会有所不同 先说一下各自功能: junit只说一点,junt4和junit5的注解不同,使用方式略有差异,其他不赘述了,基本用法都懂。 mockito是mock的

    2023年04月23日
    浏览(41)
  • Junit5单元测试框架详解

    前面我们学习了Selenium自动化测试框架,但是有的时候测试用例会很多,我们需要一个工具来管理这些测试用例,而Junit就是一个很好的管理工具,简单点来说,Junit就是一个针对Java的单元测试框架; 目录 一. 关于Junit5 二. Junit使用 2.1 添加Maven依赖 2.2 注解 2.3 断言 2.4 套件

    2024年02月06日
    浏览(35)
  • JUnit5-单元测试操作详解

    JUnit 5是JUnit测试框架的下一个主要版本,用于编写和运行单元测试。 与以前版本的 JUnit 不同,JUnit 5 由来自三个不同子项目的多个不同模块组成。 JUnit 5 =  JUnit 平台 +  JUnit Jupiter  +  JUnit Vintage JUnit 平台 是在 JVM 上启动测试框架的基础。它还定义了 TestEngine 用于开发在平台

    2024年04月10日
    浏览(41)
  • Junit5+Mockito单元测试详解

    1.宏观层面:AIR原则 A:Automatic(自动化) 全自动执行,输出结果无需人工检查,而是通过断言验证。 I:Independent(独立性) 分层测试,各层之间不相互依赖。 R:Repeatable(可重复) 可重复执行,不受外部环境( 网络、服务、中间件等)影响。 2.微观层面:BCDE原则 B: Bord

    2024年01月17日
    浏览(33)
  • SpringBoot2---单元测试(Junit5)(1)

    org.junit.vintage junit-vintage-engine test org.hamcrest hamcrest-core org.springframework.boot spring-boot-starter-test test 现在版本: @SpringBootTest class Boot05WebAdminApplicationTests { @Test void contextLoads() { } } 以前: @SpringBootTest + @RunWith(SpringRunner.class) SpringBoot整合Junit以后。 编写测试方法:@Test标注(注意需要

    2024年04月29日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包