2024年自动化测试java基础

自动化测试java基础cover 原文地址 https alphahinex github io 2024 08 11 java backend test automation description 本文介绍了 Java 后端自动化测试相关概念 工具和示例代码 date 2024 08 11 10 26 categories Test tags Java Automation

大家好,我是讯享网,很高兴认识大家。



cover

原文地址:https://alphahinex.github.io/2024/08/11/java-backend-test-automation/


description: "本文介绍了 Java 后端自动化测试相关概念、工具和示例代码。"
date: 2024.08.11 10:26
categories:
- Test
tags: [Java, Automation test]
keywords: JUnit, DbUnit, Mockito, JaCoCo, Maven


自动化测试相关概念

测试用例

测试用例是一组输入、执行条件和预期结果的集合,用于验证软件系统的正确性。

自动化测试

自动化测试是指使用自动化工具或脚本来执行测试用例,以减少人工测试的工作量,提高测试效率和准确性。

测试金字塔

测试金字塔 是一种指导自动化测试策略的框架,它建议在不同层次上分配不同数量和类型的测试,以确保成本效益、减轻团队负担并提高测试准确性。这个概念最初由 Mike Cohn 提出,主要分为三个层次:单元测试(Unit Tests)、服务测试(Service Tests,也称为集成测试)、以及用户界面测试(UI Tests)。越靠近塔底的测试类型执行的速度越快、越稳定(不易发生变化);越靠近塔尖的测试类型编写成本越高、收益越低。

人们对测试金字塔中测试的类型有不同的划分,但是总体的思想是一致的。

pyramid

单元测试

单元测试是金字塔的基础层,它们不依赖外部资源(如数据库、网络等)快速、独立,并且数量众多,专注于单个代码单元的行为验证。

集成测试

集成测试位于中间层,测试不同组件之间的交互,数量相对较少。

用户界面测试

UI测试或端到端测试位于金字塔的顶层,覆盖从用户角度的完整交互流程,但数量最少,因为它们成本高且维护难度大。

Mocking & Stubbing

Mocking(模拟)是指创建一个模拟对象来代替实际的依赖对象。这个模拟对象会按照测试的需要来行为,通常用于验证被测试代码是否按照预期与依赖项交互。

Stubbing(存根)与 Mocking 类似,但更侧重于提供预定义的返回值或行为,而不是验证交互。Stub 对象用于替换实际的依赖对象,以便在测试中控制或预测它们的输出。

在实际的软件开发中,Mocking 和 Stubbing 通常结合使用,以创建一个可控的测试环境。

区别

  • 目的:Mocking 主要用于验证代码与依赖项的交互,而 Stubbing 主要用于控制测试环境,提供可预测的输出。
  • 行为:Mock 可以在测试中模拟更复杂的行为,如条件返回或引发异常,而 Stub 通常只提供简单的固定返回值。
  • 验证:Mock 对象可以在测试后验证方法是否被正确调用,包括调用次数和参数,而 Stub 通常不进行这种验证。

测试覆盖率

测试覆盖率,反映了测试用例对软件代码的覆盖程度,通常以百分比来表示。

测试覆盖率是一种度量标准,用于衡量测试是否覆盖了代码的各个部分,例如语句覆盖、分支覆盖、条件覆盖、路径覆盖等。

测试覆盖率越高,意味着测试用例覆盖的代码越多,但并不意味着测试用例的质量越高,100% 的测试覆盖率也不能保证软件完全没有缺陷,所以在设计测试用例时,应该注重测试用例的质量。

测试驱动开发

测试驱动开发(Test-Driven Development,简称TDD)是一种软件开发流程,其核心理念是先编写测试用例,再编写能够通过这些测试用例的代码。TDD的目的是确保代码的可测试性、可维护性和质量。

自动化测试常用工具

Build Tool

通常情况下,构建工具(如 Maven、Gradle)会在项目构建过程中自动执行测试用例。

以 Maven 为例,可在 https://start.spring.io/ 生成一个 Spring Boot 项目,解压后可以找到一个 测试类:

 
讯享网 

使用 Maven 运行测试用例:

讯享网

执行 命令时也会自动执行测试用例,如果测试用例失败,构建过程会终止。如果需要跳过测试用例,可以使用 参数:

 

JUnit

JUnit 是一个 Java 编程语言的单元测试框架,用于编写和运行重复测试。JUnit 提供了注解和断言来编写测试用例,可以方便地进行测试驱动开发。

当前 Junit 的主要版本是 JUnit 5,上一个主要版本 JUnit 4 的最后发布版 4.13.2 是 2021 年发布的。

JUnit5

不同于之前版本的 JUnit,JUnit 5 是由三个不同的子项目组成的模块化测试框架:

  • 负责在 JVM 中启动测试框架。它定义了 TestEngine API 用来开发可在其平台上运行的测试框架。
  • 包含了对 JUnit 5 新注解的支持,并提供了一个能够运行 JUnit 5 测试用例的 实现。
  • 提供了用于运行 JUnit 3 和 JUnit 4 的测试用例的 实现。
JUnit 5 常用注解 作用 JUnit 4 对应注解 标记一个方法是测试方法 在 每个测试方法之前都执行的方法 在 每个测试方法之后都执行的方法 在所有测试方法之前执行一次的方法,需要 在所有测试方法之后执行一次的方法,需要 禁用测试类或方法

更多注解可见 2.1. Annotations 。

JUnit5 基础注解

讯享网
 

从输出的日志信息可以看到, 和 的日志只打印了一次, 和 的日志在每个没 的 方法执行前后都会打印。

JUnit5 断言

断言是测试用例最重要的组成部分。

断言可以用来验证方法的行为是否符合预期,并在断言失败时使测试用例失败,进而体现到最终的测试报告中。

可以说没有断言的测试用例没有任何意义,因为测试用例始终会执行通过。

JUnit 5 的断言都包含在 类的静态方法中,并支持了 Lambda 表达式等 Java 新特性,常见的断言包括:

  • :用于验证条件是否为 。
  • :用于验证条件是否为 。
  • :用于验证对象是否为 。
  • :用于验证对象是否不为 。
  • :用于验证两个对象是否相等。
  • :用于验证两个对象是否不相等。
  • :用于验证两个数组是否相等。
  • :用于验自动化测试java基础证两个对象是否是同一个对象。
  • :用于验证两个对象是否不是同一个对象。
  • :用于验证方法是否抛出了指定的异常。
  • :用于组合多个断言,当其中一个断言失败时,后续断言不会执行。
 

JUnit5 假设

假设用来在测试方法中定义前提条件,如果假设不成立,则测试方法会被忽略。

JUnit 5 的假设方法包含在 类中,有三类静态方法:

  1. :假设条件为 ,否则忽略测试方法。
  2. :假设条件为 ,否则忽略测试方法。
  3. :假设条件为 ,否则忽略测试方法。
 

JUnit5 验证异常

JUnit 5 中不再使用之前的 和 规则来设定期待抛出的异常。异常的验证都通过 方法实现:

 

DbUnit

DbUnit 是一个 JUnit 4 的扩展,可以在测试过程中基于 XML 数据集管控测试数据库中数据状态,最后的发布版本是 2024年06月02日 的 v2.8.0。

基本思路是继承 基类后,通过实现 方法,将准备的 XML 格式数据文件加载到测试库中,之后通过 中的断言进行数据验证。

如果想在 JUnit 5 中使用 DbUnit,需要在依赖中添加 JUnit 4 和 JUnit Vintage 引擎:

 

以下是一个使用 DbUnit 的示例:

:

 

:

 

:

 

更多 DbUnit 用法可参见 Introduction to DBUnit 及 Getting Started 等文档。

个人感觉 Spring Framework 下的 Spring TestContext Framework 中所提供的 Executing SQL Scripts 方式面向 SQL,相比 XML 更加直观,且无需引入三方依赖,对 JUnit 版本也没有限制。

Mockito

Mockito 是 Java 生态常用的 Mock 框架,用于创建和配置 Mock 对象,以及验证测试中的行为。Mockito 会被 Spring Boot Starter 自动依赖,无需额外引入。

类中常用的静态方法包括:

  • :创建一个 Mock 对象。
  • :验证 Mock 对象的行为。
  • :创建一个部分 Mock 的对象,真实方法会被调用,但依然可以进行验证和 stub。
  • :配置 Mock 对象的行为。
 

JaCoCo

JaCoCo 是 Java 的代码覆盖率工具,可与 Maven 或 Gradle 集成,用于生成代码覆盖率报告。

在 Maven 中使用 JaCoCo 插件,只需在 中添加以下配置:

 

执行 后,JaCoCo 会生成一个 的代码覆盖率报告。

jacoco

示例代码

小讯
上一篇 2024-12-30 11:45
下一篇 2024-12-26 09:45

相关推荐

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