全面的自动化在应用程序测试中至关重要,以确保云原生应用的可靠性和高性能,特别是在通过持续交付优先快速上市的情况下。
在最近在班加罗尔举行的测试自动化研讨会上(https://speakerdeck.com/arafkarsh/ai-based-test-automation-strategies),我在会上进行了一次投票,以便了解企业技术领域中自动化测试的状况。
虽然向微服务架构转型的趋势非常强劲,但大多数组织仍有一段很长的路要走,才能达到DORA标准定义的精英团队级别。
你的架构图是怎样的?
你在测试自动化方面使用了多少百分比?
你通常多久部署一次?
我鼓励你探索 Google 2024 年的 DORA 报告 以获取更深入的理解。本系列将主要关注可操作的策略,帮助团队达到精英级别,尤其是推进测试自动化实践。
来源::"Google 2024 DORA — 加速 DevOps 发展状况**
在本系列的第二部分,我们将深入探讨根据DORA标准定义的顶尖团队的特点。目前,我们来探讨一下针对云原生架构(也称为微服务架构)的自动化测试策略。
一旦我们确定了关键关注点,我们将深入了解目前市场上可用的人工智能驱动的测试自动化工具。
云原生应用(又称为微服务架构)测试自动化策略这种方法包括单元测试、集成测试、合约测试,以及端到端测试。
来源:幻灯片: 微服务测试策略
- 单元测试:单元测试是用于检测应用程序中最小的可测试软件组件,以确定其是否按预期工作。
- 组件测试:组件测试将测试范围限制在一部分待测系统,通过内部代码接口操作系统,并使用测试替身来隔离待测代码与其他组件。
- 契约测试,通过工具如Pact来支持,确保服务符合预定的API契约。
- 集成测试:集成测试是在外部服务边界处进行的测试,验证它是否符合消费服务期望的契约。
- 端到端测试:端到端测试验证系统是否满足外部需求并实现其目标,从端到端测试整个系统。
GitHub Repo:微服务测试快速开始
此外,工具如Kubernetes可以用于容器编排和Istio可以用于服务网格可以帮助创建更加真实的测试环境,使测试过程更加稳健可靠。
在深入探讨测试自动化之前,首先了解软件开发的整体范围将帮助我们理解自动化在过程中的作用以及不同类型的自动化。
如下图所示,说明了软件开发生命周期(SDLC)中的SpecOps工作流程,强调从规格说明到运维的旅程。
来源:演讲文稿幻灯片: 微服务架构讲座 — 测试策略 点击此处查看
设计与开发规范绿地项目:
- 这些涉及从零开始构建应用程序。重点在于:
- 领域驱动设计 (DDD):围绕核心业务领域来构建项目。
- 事件溯源和CQRS:分别处理状态的变更和查询的职责。
褐地项目:
- 涉及现代化或改进现有系统。技术包括:
- 迁移模式:如使用绞杀藤模式等策略,逐步分阶段替换旧系统。
- 变更数据捕获(CDC):实时捕获数据变更,无缝迁移。
这一部分自动化了各种SDLC阶段(软件开发生命周期),以确保高效和可靠性。
- 搭建:
专注于整理、打包和准备源代码以便部署。包括:
- 源代码:包含功能代码和配置的依赖处理,例如使用Maven、NPM和Docker Hub进行依赖管理。
2. 自动化测试:
通过多层测试来保证质量和性能。
- 单元测试:测试单个单元。
- 组件测试:测试应用中的独立部分。
- 契约测试:验证微服务间的API契约。
- 集成测试:确保组件能协同工作。
3. 基础设施自动化(基础设施即代码)
自动化并管理基础设施,包括:
- 容器(例如,Docker)。
- 编排(例如,Kubernetes)。
- 无服务器架构(例如,AWS Lambda),用于可扩展和成本效益高的解决方案。
服务网格(例如,Istio):用于实现可观测性(Observability)、安全和流量管理
- 流量管理:高效管理并引导应用流量。
- 安全:实施 mTLS(双向 TLS)以确保安全通信,并使用 JWT(JSON Web 令牌)进行身份验证。
- 策略:网络和安全策略必须得到应用,以保持合规性,同时拥有强大的纵深防御安全架构。
4. 步骤:
准备把应用部署到一个接近实际生产条件的环境里。
Ops(运营及维护)一旦应用部署完成,重点就转向了运营可靠性。
- 可观察性:通过日志、指标及跟踪监控性能并识别问题。
- 容错能力:确保系统可以从故障中恢复。
- 可靠性:在各种条件下保持一致的性能。
- 可扩展性:无缝地扩展以适应需求的变化。
该工作流突出了一个CI/CD流程,并特别强调了自动化的流程。
它将建筑学原则与开发、测试和运营实践联系起来,以在云原生的环境中提供可扩展、可靠且易于维护的软件产品。
AI驱动的最佳测试自动化软件让我们重新关注测试自动化,特别是探讨AI驱动的测试自动化这一领域,以及这些工具如何提升测试过程。下面举几个这样的工具的例子。
1. Diffblue Cover(差蓝覆盖),一个由Diffblue公司提供的代码覆盖率工具。目的: 自动生成Java应用程序的单元测试。
主要特点:
- 支持生成高代码覆盖率的智能测试。
- 兼容 JUnit 和 TestNG。
- 与 IntelliJ IDEA 和 Maven 集成。
使用场景: 功能自动创建Spring Boot服务、控制器和存储库中的单元测试代码。
2. Testim (测试姆,一个自动化测试平台)目的:基于AI的工具,用于创建、执行及维护自动化的功能测试
一些主要特点:
- 具备自愈能力的测试,能够适应UI变化。
- 与CI/CD流水线无缝集成。
- 支持对微服务的API进行测试。
案例: 具有动态UI的Spring Boot应用程序的功能测试和端到端测试。
3. Mabl目的: 基于云和人工智能的功能测试自动化。
主要特点:
- 支持 REST API 测试,非常适合于 Spring Boot 微服务。
- 具有 AI 动力的缺陷检测。
- 与 CI/CD 流水线无缝集成。
场景: 确保对Spring Boot应用程序中的微服务及其API层进行全面测试。
4. Katalon Studio目的: 一个多功能的测试平台,具备人工智能增强功能,适用于网页、API和移动应用的测试。
主要特点:
- 支持使用Java和Groovy编写的测试脚本。
- 具有基于AI的物体检测和智能测试建议功能。
- 内置API测试功能支持。
使用案例: 在Spring Boot应用程序中的自动执行RESTful API的测试。
5. Functionize(功能化)- 官方网站用途: 一个由人工智能驱动的功能及性能测试平台。
主要特点:
- 使用自然语言处理来创建测试用例。
- 由AI驱动的测试执行和维护工作。
- 与如Jenkins和GitLab等CI/CD工具集成。
使用案例: Spring Boot 应用程序的前端界面和 API 的功能测试。
6. Applitools - 一个提供视觉自动化测试的平台。目的: 基于人工智能的视觉测试工具。
主要特点:
- 支持Java和Spring Boot应用程序的无缝SDK集成。
- 用于检测不同环境中UI变化的视觉AI工具。
- 可与Selenium、Cypress和TestNG等工具集成。
用例: 确保前端组件在 Spring Boot web 应用程序中的视觉一致性。
7. Tricentis Tosca,一款自动化持续测试的工具。目的: 一个基于AI的持续测试平台。
关键特性:
- 支持Java应用程序的API和UI测试。
- 具有自愈功能的测试和智能优化测试。
- 与CI/CD流水线集成。
场景: Spring Boot应用程序的全面测试,包括REST API和前端部分。
8. Selenium + AI(Healenium)目的:借助AI来增强Selenium测试功能。
主要特点:
- Healenium: 自动修复的测试,用来修复失效的定位器。
场景示例: 自动对具有动态界面的Spring Boot应用程序的网站UI进行测试。
9. SmartBear TestComplete (智能完成测试工具)目的: 使用基于AI的自动化测试来进行功能测试与回归测试。
关键特性:
- 支持带有脚本和录制回放功能的Java应用。
- 基于AI的UI元素对象识别。
- 可与Jenkins和Git集成。
用例:Spring Boot 应用的前端和后端组件的功能测试。
10. ReTest目的: 基于人工智能的回归测试工具,用于检查软件更新后是否影响原有功能。
主要特点:
- 使用AI进行智能测试维护。
- 适用于Java的应用程序。
- 自动检测应用程序的变化。
示例: 不断演进的Spring Boot应用的回归测试(Regression Testing)。
GitHub 仓库页面 — Java 23 版本, SpringBoot 3.3.4 版本 测试示例项目首先,让我们先来介绍一下GitHub代码库,并展示一些在不同平台和测试自动化库中使用的示例测试用例。
以下图像突出了每个工具及其对应的可用测试用例数量。
GitHub仓库:微服务测试快速入门指南微服务测试快速入门
软件依赖项
所需技术:
- Java 版本 21+
- SpringBoot 3.3.4
- Jakarta EE 10
测试平台
• JUnit 5 (版本 5.10.2)
• TestNG 7 (版本 7.10.2)
• Spring Spock 2 (Spring Spock 2 版本 2.4.0)
测试套组
我们使用了以下技术工具:
- Mockito(5.12.0),例如
- Cucumber(7.18.0)
- Selenium(4.12.0)
- Rest Assured(5.4.0)
- WireMock(3.6.0)
- Pact(4.0.10)
pom.xml 文件中的版本
<!-- 测试平台 (Testing Platforms) ============================================= -->
<junit.jupiter.version>5.10.2</junit.jupiter.version>
<testng.version>7.10.2</testng.version>
<spock.version>2.4-M1-groovy-4.0</spock.version>
<!-- 测试框架 (Testing Frameworks) =========================================== -->
<hamcrest.version>2.2</hamcrest.version>
<truth.version>1.0.1</truth.version>
<mockito.version>5.12.0</mockito.version>
<wiremock.version>3.6.0</wiremock.version>
<cucumber.version>7.18.0</cucumber.version>
<selenium.version>4.12.0</selenium.version>
<restassured.version>5.4.0</restassured.version>
<pact.version>4.0.10</pact.version>
<assertj.version>3.26.3</assertj.version>
<!-- 仅显示相关部分代码 -->
依赖项
<!-- 显示相关代码片段 -->
<!-- ================================================================= -->
<!--
1. 你应在 pom.xml 或 build.gradle 文件中将 rest-assured 依赖声明置于 JUnit 之前,
以确保使用正确的 Hamcrest 版本。
2. REST Assured 包含 JsonPath 和 XmlPath 作为传递依赖
-->
<!-- ================================================================= -->
<!-- REST Assured 框架 -->
<!-- ================================================================= -->
<!-- https://mvnrepository.com/artifact/io.rest-assured/rest-assured -->
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>rest-assured</artifactId>
<version>${restassured.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.github.scribejava</groupId>
<artifactId>scribejava-apis</artifactId>
<version>8.3.3</version>
</dependency>
<!-- 单元测试 ==================================================== -->
<!-- ================================================================= -->
<!-- JUnit 5 框架(Jupiter API) -->
<!-- ================================================================= -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<!-- 版本在 Properties 中定义 -->
<version>${junit.jupiter.version}</version>
<!-- JUnit 依赖仅用于测试范围,不会在最终构建中出现。 -->
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>${junit.jupiter.version}</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-engine -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>${junit.jupiter.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
<version>${junit.jupiter.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-migrationsupport</artifactId>
<version>${junit.jupiter.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>${junit.jupiter.version}</version>
<scope>test</scope>
</dependency>
<!-- JUnit 外部依赖 -->
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-core</artifactId>
<version>${hamcrest.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.google.truth</groupId>
<artifactId>truth</artifactId>
<version>${truth.version}</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.assertj/assertj-core -->
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>${assertj.version}</version>
<scope>test</scope>
</dependency>
<!-- 组件和合同测试 ==================================== -->
<!-- ================================================================= -->
<!-- Cucumber 测试框架 -->
<!-- ================================================================= -->
<!-- https://mvnrepository.com/artifact/io.cucumber/cucumber-java -->
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-java</artifactId>
<version>${cucumber.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.cucumber/cucumber-junit -->
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-junit</artifactId>
<version>${cucumber.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.cucumber/cucumber-core -->
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-core</artifactId>
<version>${cucumber.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.cucumber/cucumber-java8 -->
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-java8</artifactId>
<version>${cucumber.version}</version>
</dependency>
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-junit-platform-engine</artifactId>
<version>${cucumber.version}</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/io.cucumber/cucumber-picocontainer -->
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-picocontainer</artifactId>
<version>${cucumber.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-testng</artifactId>
<version>${cucumber.version}</version>
<scope>test</scope>
</dependency>
<!-- ================================================================= -->
<!-- Selenium 测试框架 -->
<!-- ================================================================= -->
<!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>${selenium.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-api -->
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-api</artifactId>
<version>${selenium.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-support -->
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-support</artifactId>
<version>${selenium.version}</version>
</dependency>
<!-- ================================================================= -->
<!-- Mockito 测试框架 -->
<!-- ================================================================= -->
<!-- https://mvnrepository.com/artifact/org.mockito/mockito-core -->
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>${mockito.version}</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mockito/mockito-junit-jupiter -->
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-junit-jupiter</artifactId>
<version>${mockito.version}</version>
<scope>test</scope>
</dependency>
<!-- ================================================================= -->
<!-- 集成和合同测试 ================================== -->
<!-- ================================================================= -->
<!-- ================================================================= -->
<!-- Spring Boot 测试支持 -->
<!-- ================================================================= -->
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-test -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>${spring.boot.version}</version>
<scope>test</scope>
<!-- 排除 JUnit,因为 Spring Boot Starter Test 使用 JUnit 4 -->
<exclusions>
<exclusion>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- ================================================================= -->
<!-- WireMock 测试框架 -->
<!-- ================================================================= -->
<!-- https://mvnrepository.com/artifact/org.wiremock/wiremock -->
<dependency>
<groupId>org.wiremock</groupId>
<artifactId>wiremock</artifactId>
<version>${wiremock.version}</version>
<scope>test</scope>
</dependency>
<!-- ================================================================= -->
<!-- Pact 测试框架 -->
<!-- ================================================================= -->
<dependency>
<groupId>au.com.dius</groupId>
<artifactId>pact-jvm-provider-junit5</artifactId>
<version>${pact.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>au.com.dius</groupId>
<artifactId>pact-jvm-consumer-junit5</artifactId>
<version>${pact.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/au.com.dius/pact-jvm-provider -->
<dependency>
<groupId>au.com.dius</groupId>
<artifactId>pact-jvm-provider</artifactId>
<version>${pact.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/au.com.dius/pact-jvm-consumer-junit -->
<dependency>
<groupId>au.com.dius</groupId>
<artifactId>pact-jvm-consumer-junit</artifactId>
<version>${pact.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/au.com.dius/pact-jvm-consumer -->
<dependency>
<groupId>au.com.dius</groupId>
<artifactId>pact-jvm-consumer</artifactId>
<version>${pact.version}</version>
</dependency>
<!-- 显示相关代码片段 -->
Diffblue覆盖
Diffblue Cover 是一个 专为自主生成 Java 应用程序单元测试而设计的 AI 工具,包括用 Spring Boot 框架构建的应用程序。
利用强化学习,它生成可靠且易于维护的单元测试,这些测试能正确编译和运行,从而提高代码质量和加快开发周期。原文来源:_Diffblue.com_
参考来源:Diffblue.com
Diffblue Cover 的主要功能:- 自动测试生成: Diffblue Cover 自动为Java代码编写全面的单元测试,有效地减少了通常在创建测试时所需的大量手动工作。
- 与开发环境集成: 它提供了一个 IntelliJ IDEA插件 ,使开发人员能够直接在其集成开发环境(IDE)中生成单元测试。这种集成简化了测试流程,使得测试可以在编写或修改代码时立即生成。
- 支持Spring Boot应用程序: Diffblue Cover支持 Spring Boot应用程序 ,能够为各种 组件(如控制器和服务)生成单元测试。它利用 如Mockito这样的模拟框架 来处理依赖关系,确保测试是隔离的并专注于被测单元。
- 提高开发人员生产力: 通过自动生成单元测试,开发人员能更多地专注于编写应用程序代码,从而提高整体生产力并加快高质量软件的交付。
- 打开 IntelliJ IDEA。
- 进入 文件 菜单 → 设置(或在 macOS 上,选择 IntelliJ IDEA → 设置)。
- 在设置窗口中,从左侧菜单选择 插件。
- 在 市场 选项卡中,搜索 Diffblue Cover。
- 点击 安装 按钮,位于 Diffblue Cover 插件旁边。
- 重启 IntelliJ IDEA 完成安装。
- 点单服务
@Service
public class OrderServiceImpl implements OrderService {
@Autowired
private OrderRepository orderRepo;
@Autowired
private PaymentService paymentService;
/**
* 用于自动绑定Order Repository和Payment Service
* @param _orderRepo
* @param _paymentService
*/
public OrderServiceImpl(OrderRepository _orderRepo, PaymentService _paymentService) {
orderRepo = _orderRepo;
paymentService = _paymentService;
}
// 这只是为了PACT演示
@Autowired
private ExternalGateWay externalGateWay;
@Override
public OrderEntity getOrderById(String _id) {
// return orderRepo.getOrderById(_id);
return mockGetOrderById(_id);
}
/**
* 用于PACT演示
* @param _order
* @return
*/
public OrderEntity saveOrderExternal(OrderEntity _order) {
return externalGateWay.saveOrder(_order);
}
@Override
public OrderEntity processOrder(OrderEntity _order) {
// 保存订单
OrderEntity order = orderRepo.saveOrder(_order);
if (order != null) {
// 进行支付
PaymentStatus payStatus = paymentService.processPayments(order.getPaymentDetails());
// 更新支付状态
order.setPaymentStatus(payStatus);
}
return order;
}
// ...
/**
* 更新订单状态
*/
public OrderEntity updateOrderStatus(String _id, String _status) {
// 根据订单ID获取订单
// OrderEntity order = orderRepo.getOrderById(_id);
OrderEntity order = mockGetOrderById(_id);
// 检查订单状态并设置状态
if (_status.equalsIgnoreCase(OrderStatus.READY_FOR_SHIPMENT.name())) {
order.orderReadyForShipment();
} else if (_status.equalsIgnoreCase(OrderStatus.PAYMENT_EXPECTED.name())) {
order.orderWaitingForPayment();
}
return orderRepo.saveOrder(order);
}
/**
* 添加新方法以测试DiffBlue Cover
* 发货订单
* @param _id
* @return
*/
public OrderEntity shipOrder(String _id) {
// 根据订单ID获取订单
OrderEntity order = mockGetOrderById(_id);
order.orderReadyForShipment();
return order;
}
@Override
public PaymentStatus processPayments(PaymentDetails _paymentDetails) {
return paymentService.processPayments(_paymentDetails);
}
// ... 仅显示相关代码...
}
2. 右键点击代码中的(控制器或服务)以生成测试案例
点击“写测试”或“写骨架测试”
3. 测试用例生成中...
编写测试用例
测试生成中
测试生成中
4. 测试用例生成完毕
测试已完成
5. 测试自动生成的订单系统代码
Diffblue Cover 主要是一个生成单元测试的工具,它通常依赖于 Mockito(或其他类似的模拟框架)来隔离依赖。
以下是Diffblue生成的OrderService自动生成的代码。虽然它可能还不是完美的,但它提供了一个起点,使你能够快速在此基础上扩展功能。 你可以很容易地通过添加任何缺失的功能模块来补齐其功能。通过添加任何缺失的功能模块来完善功能。 这种方法大大节省了编写测试用例的时间。
自动产生的测试案例
@ContextConfiguration(classes = {OrderServiceImpl.class})
@ExtendWith(SpringExtension.class)
@DisabledInAotMode
class OrderServiceImplDiffblueTest {
@MockBean
private ExternalGateWay externalGateWayService; // 外部网关服务
@MockBean
private OrderRepository orderRepository; // 订单存储库
@Autowired
private OrderServiceImpl orderServiceImpl;
@MockBean
private PaymentService paymentService; // 支付服务接口
/**
* 测试 {@link OrderServiceImpl#getOrderById(String)}.
* <p>
* 被测方法: {@link OrderServiceImpl#getOrderById(String)}
*/
@Test
@DisplayName("测试 getOrderById(String)")
void testGetOrderById() {
System.out.println("设置与执行: 通过ID获取订单");
// 设置与执行
OrderEntity actualOrderById = orderServiceImpl.getOrderById(" id");
System.out.println("执行: 订单已获取");
System.out.println("断言: 检查 OrderEntity 的值");
// 断言
assertEquals(" id", actualOrderById.getOrderId());
assertNull(actualOrderById.getPaymentStatus());
assertEquals(2248.0d, actualOrderById.getTotalValue());
assertEquals(3, actualOrderById.getTotalItems());
assertEquals(3, actualOrderById.getOrderItems().size());
assertEquals(OrderStatus.INITIATED, actualOrderById.getOrderStatus()); // 订单状态类型
assertEquals(PaymentType.CREDIT_CARD, actualOrderById.getPaymentType()); // 支付方式
assertTrue(actualOrderById.isCustomerAvailable());
assertTrue(actualOrderById.isShippingAddressAvailable());
System.out.println("测试结束");
}
// ... 只显示相关代码 ...
}
当我尝试生成REST控制器的代码时,结果远未如我所愿。然而,对于代码仓库和服务,Diffblue的表现非常出色,生成了一个功能齐全的代码库,其中包含了所有关键元素。
只需再花20%到30%的时间和精力来完善和最终确定测试用例,你就能实现全面覆盖测试。
最后的感想我和Diffblue没有任何关系,也不持有该公司的任何股份。我决定评估Diffblue完全是因为Forbes将其评为领先的人工智能驱动的测试自动化工具 。这使得Diffblue成为我分析的合理起点。
我们刚刚开始探索由人工智能工具增强的测试自动化领域。然而,不仅应关注单元测试用例,还应扩展到组件测试、契约测试和集成测试。实现这一目标需要全面自动化这些方面,这是实现精英团队状态的关键步骤,正如谷歌的DORA报告中所指出的。
接下来的部分中,我们将深入探讨每一类测试,了解如何学习如何编写有效的代码,来实现提高您的测试自动化的覆盖率。
(Note: There is a slight redundancy "学习如何编写有效的代码,来实现" and "提高您的测试自动化的覆盖率", which could be simplified for better fluency. However, following the provided expert suggestions closely, the above translation is crafted.)
优化后的版本可以是:
接下来的部分中,我们将深入探讨每一类测试,了解如何编写有效的代码,来提高您的测试自动化的覆盖率。
随着年底临近,希望你们在这系列关于Java 23、Spring Boot 和 AI 驱动的测试的新文章中找到了价值。敬请期待更多精彩内容!
Java 23系列教程 Java 23, SpringBoot 3.3.4:AI 驱动的测试生成系列圣诞快乐,2025新年也快乐
GitHub 仓库: MS Test Quick Start: 微服务自动化测试示例,使用 SpringBootTest 3.3.4、JUnit 5、TestNG 7、Spock 3、DiffBlue Cover、RestAssured 5、Cucumber 6、Selenium 4、Mockito 3、WireMock 2 和 Pact 4 等测试框架。这些测试框架可以帮助实现微服务应用的全面自动化测试。
演讲文稿在 SpeakerDeck.Com: 基于 AI 的测试自动化策略。
- Java 23, SpringBoot 3.3.4: AI 驱动的测试生成 — 第 1 部分(本文)
- Java 23, SpringBoot 3.3.4: 测试框架 — JUnit 5, TestNG, Spock — 第 2 部分(即将上线)
- Java 23, SpringBoot 3.3.4: Mockito — 第 3 部分(即将上线)
- Java 23, SpringBoot 3.3.4: Cucumber, Selenium — 第 4 部分(即将上线)
- Java 23, SpringBoot 3.3.4: WireMock — 第 5 部分(即将上线)
- Java 23, SpringBoot 3.3.4: Pact — 第 6 部分(即将上线)
- Java 23, SpringBoot 3.3.4 & Jakarta 10 — Part 1
- Java 23, SpringBoot 3.3.4: AOP 异常处理 — Part 2
- Java 23, SpringBoot 3.3.4: Logback 配置 — Part 3
- Java 23, SpringBoot 3.3.4: 日志与事件: API 流程与日志记录 — Part 4
- Java 23, SpringBoot 3.3.4: 指标: Micrometer, Prometheus, Actuator — Part 5
- Java 23, SpringBoot 3.3.4: 指标: Micrometer & AOP — Part 6
- Java 23, SpringBoot 3.3.4: 跟踪: OpenTelemetry — Part 7
- Java 23, SpringBoot 3.3.4: 跟踪: OpenTelemetry 实战 — Part 8 即将推出
- Java 23, SpringBoot 3.3.4: 安全过滤器与日志 — Part 9 即将发布
- Java 23, SpringBoot 3.3.4: Spring Security 的 AOP — Part 10 即将发布
- Java 23, SpringBoot 3.3.4: CRUD — Part 11 即将发布
- Java 23, SpringBoot 3.3.4: CRUD 查询及分页排序 — Part 12 即将发布
- Mike Cohen — 测试金字塔
- Martin Fowler: 测试策略
- Forbes: 2024年4月,顶级15款AI驱动的自动化测试工具
- JUnit: JUnit 5 — 测试平台
- TestNG: 理解TestNG
- Spring Spock: 使用Spring Spock进行测试
- Mockito: 模拟库
- Cucumber: 用自然语言的自动化测试
- Selenium: 自动化浏览器
- WireMock: 模拟你所依赖的API
- Pact: 契约测试