如何使用 Builder 设计模式和 DataFaker 库在自动化测试中生成测试数据

在自动化 API/Web 或移动应用程序时,您可能会遇到这样的情况:在注册用户时,您可能正在设置用于在测试自动化的端到端用户旅程中签出产品的地址。

那么,你是怎么做到的呢?

通常,我们在 Java 中创建一个 POJO 类,其中包含注册用户或设置签出产品地址所需的字段,然后使用 POJO 类的构造函数在测试中设置值。

让我们看一个注册用户的示例,其中以下字段是填写注册表单所需的必填字段:

  1. 名字

  2. 地址

  3. 城市

  4. 国家

  5. 手机号码

        由于我们需要在自动化测试中处理这些字段,因此在执行测试时,我们必须在字段中传递相应的值。

使用构建器模式之前

        将使用该 POJO 类中的 Getter 和 Setter 方法创建具有上述必填字段的 POJO 类,并使用构造函数在相应字段中设置值。

查看下面给出的代码示例,了解我们正在讨论的内容。RegisterUser class

1
public class RegisterUser {
2
    private String firstName;
3
    private String lastName;
4
    private String address;
5
    private String city;
6
    private String state;
7
    private String country;
8
    private String mobileNumber;
9


10
    public RegisterUser (final String firstName, final String lastName, final String address, final String city,
11
        final String state, final String country, final String mobileNumber) {
12
        this.firstName = firstName;
13
        this.lastName = lastName;
14
        this.address = address;
15
        this.city = city;
16
        this.state = state;
17
        this.country = country;
18
        this.mobileNumber = mobileNumber;
19
    }
20


21
    public String getFirstName () {
22
        return firstName;
23
    }
24


25
    public void setFirstName (final String firstName) {
26
        this.firstName = firstName;
27
    }
28


29
    public String getLastName () {
30
        return lastName;
31
    }
32


33
    public void setLastName (final String lastName) {
34
        this.lastName = lastName;
35
    }
36


37
    public String getAddress () {
38
        return address;
39
    }
40


41
    public void setAddress (final String address) {
42
        this.address = address;
43
    }
44


45
    public String getCity () {
46
        return city;
47
    }
48


49
    public void setCity (final String city) {
50
        this.city = city;
51
    }
52


53
    public String getState () {
54
        return state;
55
    }
56


57
    public void setState (final String state) {
58
        this.state = state;
59
    }
60


61
    public String getCountry () {
62
        return country;
63
    }
64


65
    public void setCountry (final String country) {
66
        this.country = country;
67
    }
68


69
    public String getMobileNumber () {
70
        return mobileNumber;
71
    }
72


73
    public void setMobileNumber (final String mobileNumber) {
74
        this.mobileNumber = mobileNumber;
75
    }
76
}

        现在,如果我们想使用这个 POJO,我们必须创建一个 class 的实例并传递以下代码示例中给出的值,以在相应的字段中设置数据。RegisterUserconstructor parameters

看看下面的测试示例,了解我们如何做到这一点。Register User

1
public class RegistrationTest {
2


3
    @Test
4
    public void testRegisterUser () {
5
        RegisterUser registerUser = new RegisterUser ("John", "Doe", "302, Adam Street, 1st Lane", "New Orleans",
6
            "New Jersey", "US", "52145364");
7


8
        assertEquals (registerUser.getFirstName (), "John");
9
        assertEquals (registerUser.getCountry (), "US");
10
    }
11
}

        在我们用于注册用户的示例中,只有七个字段。但是,并非每个应用程序都是如此。还需要一些额外的字段,并且随着字段每次都在不断增加,我们需要使用相应的 Getter 和 Setter 方法更新 POJO 类,并更新 constructor 中的参数。

        最后,我们需要将值添加到这些字段中,以便数据可以在所需的实际字段中传递。

        长话短说,即使添加了一个新字段,我们也需要更新代码,而且,在测试中添加值作为参数看起来并不干净。

幸运的是,Java 中的 Builder Design Pattern 在这里派上了用场。

f7758af3edcfb4b16ca301e1930e625d.png

什么是 Java 中的构建器设计模式?

        构建器设计模式是一种创建性设计模式,可让您逐步构造复杂的对象。该模式允许您使用相同的构造代码生成对象的不同类型和表示形式。

        Builder Pattern 通过提供一种返回可在实际测试中使用的最终对象的方法,提供一种逐步构建对象的方法,帮助我们解决设置参数的问题。

什么是Project Lombok?

        Project Lombok 是一个 Java 库,它会自动插入您的编辑器并构建工具,为您的 Java 增添趣味。它是一个基于注释的 Java 库,有助于减少样板代码。

        它可以帮助我们编写简短明了的代码,而无需编写样板代码。绕过类上的注释,它会自动生成 Getter 方法。同样,您也不必为 Setter 方法编写代码注释在类上更新会自动生成 Setter 方法@Getter@Setter

        它还支持使用 Builder 设计模式,因此我们只需要将注释放在类的上方,其余的将由 Lombok 库处理。@Builder

要在项目中使用 Lombok 注解,我们需要添加以下 Maven 依赖项:

<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.32</version>
    <scope>provided</scope>
</dependency>

在 Lombok 中使用 Builder 设计模式

    在我们开始重构我们编写的代码之前,让我向您介绍一下 DataFaker 库,以及它如何帮助生成可用于测试的虚假数据。理想情况下,在我们的示例中,每个新注册用户的数据都应该是唯一的,否则我们可能会收到重复的数据错误,测试将失败。

在这里,DataFaker库将帮助我们在每次测试执行中提供唯一的数据,从而帮助我们在每次运行注册测试时注册具有唯一数据的新用户。

    要使用 DataFaker 库,我们需要将以下 Maven 依赖项添加到我们的项目中。

XML格式

1
<!-- https://mvnrepository.com/artifact/net.datafaker/datafaker -->
2
<dependency>
3
    <groupId>net.datafaker</groupId>
4
    <artifactId>datafaker</artifactId>
5
    <version>2.2.2</version>
6
</dependency>
7

        现在,让我们开始重构代码。首先,我们将对类进行更改。我们将删除所有 Getter 和 Setter 方法以及构造函数,并在 .RegisterUser@Getter@BuilderRegisterUser class

这是重构后现在的样子RegisterUser class

1
@Getter
2
@Builder
3
public class RegisterUserWithBuilder {
4
    private String firstName;
5
    private String lastName;
6
    private String address;
7
    private String city;
8
    private String state;
9
    private String country;
10
    private String mobileNumber;
11
}

        完成重构后,它看起来多么干净和清晰。多行代码被删除,但它仍然以与之前相同的方式工作,这要归功于龙目岛。

        我们必须添加一个新的 Java 类,以便使用 Builder 设计模式在运行时生成虚假数据。我们将这个新类称为 .DataBuilder class

1
public class DataBuilder {
2


3
    private static final Faker FAKER = new Faker();
4


5
    public static RegisterUserWithBuilder getUserData () {
6
        return RegisterUserWithBuilder.builder ()
7
            .firstName (FAKER.name ()
8
                .firstName ())
9
            .lastName (FAKER.name ()
10
                .lastName ())
11
            .address (FAKER.address ()
12
                .streetAddress ())
13
            .state (FAKER.address ()
14
                .state ())
15
            .city (FAKER.address ()
16
                .city ())
17
            .country (FAKER.address ()
18
                .country ())
19
            .mobileNumber (String.valueOf (FAKER.number ()
20
                .numberBetween (9990000000L, 9999999999L)))
21
            .build ();
22
    }
23
}

        该方法将返回使用 DataFaker 库注册用户所需的测试数据。请注意类名之后使用的方法。之所以出现它,是因为我们在 RegisterUserWithBuilder 类的顶部使用了批注getUserData()builder()RegisterUserWithBuilder@Builder

        在方法之后,我们必须传递我们在 中声明的变量,并相应地传递我们需要为相应变量生成的假数据。builder()RegisterUserWithBuilder class

1
RegisterUserWithBuilder.builder ()
2
    .firstName (FAKER.name ()
3
    .firstName ());

    上面的一段代码将生成一个假的名字,并将其设置在名字变量中。同样,我们在所有其他变量中都设置了假数据。

    现在,让我们来看看如何在测试中使用这些数据。这很简单,下面的代码片段解释了这一切。

1
    @Test
2
    public void testRegisterUserWithBuilder () {
3
        RegisterUserWithBuilder registerUserWithBuilder = getUserData ();
4
      
5
        System.out.println (registerUserWithBuilder.getFirstName ());
6
        System.out.println (registerUserWithBuilder.getLastName ());
7
        System.out.println (registerUserWithBuilder.getAddress ());
8
        System.out.println (registerUserWithBuilder.getCity ());
9
        System.out.println (registerUserWithBuilder.getState ());
10
        System.out.println (registerUserWithBuilder.getCountry ());
11
        System.out.println (registerUserWithBuilder.getMobileNumber ());
12
    }

只需要在实例化 接下来,我们将为我们在 . 请记住,我们已经传递了顶部的注释,这实际上有助于在此处调用 Getter 方法。getUserData()RegisterUserWithBuilder classRegisterUserWithBuilder class@GetterRegisterUserWithBuilder class

        此外,我们不需要传递多个数据作为类的构造函数参数,而只需要实例化类并调用该方法即可!RegisterUserWithBuildergetUserData()

生成唯一数据并在测试中传递是多么容易,而无需编写多行样板代码。

运行测试

        运行测试并检查用户详细信息是否打印在控制台中。在以下测试执行的屏幕截图中,我们可以看到假数据是成功生成的。

bfa796a5f28bc375cfced4b170276cad.png

        如何利用 Java 中的构建器设计模式以及 Lombok 和 DataFaker 库在运行时生成虚假测试数据,并将其用于我们的自动化测试。它将通过消除在运行测试之前更新测试数据的需要来简化测试数据生成过程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/766418.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙开发设备管理:【@ohos.distributedHardware.deviceManager (设备管理)】

设备管理 本模块提供分布式设备管理能力。 系统应用可调用接口实现如下功能&#xff1a; 注册和解除注册设备上下线变化监听发现周边不可信设备认证和取消认证设备查询可信设备列表查询本地设备信息&#xff0c;包括设备名称&#xff0c;设备类型和设备标识 说明&#xff1a…

检索增强生成RAG系列5--RAG提升之路由(routing)

在系列3和系列4我讲了关于一个基本流程下&#xff0c;RAG的提高准确率的关键点&#xff0c;那么接下来&#xff0c;我们再次讲解2个方面&#xff0c;这2个方面可能与RAG的准确率有关系&#xff0c;但是更多的它们是有其它用途。本期先来讲解RAG路由。 目录 1 基本思想2 Logica…

Linux基础 - LNMP 架构部署动态网站环境

目录 零. 简介 一. 部署 二. 安装 Nginx 三. 安装MySQL 四. 安装PHP 五. 配置网站目录 六. 测试环境 零. 简介 LNMP 是指 Linux Nginx MySQL PHP 这一组合架构&#xff0c;用于部署动态网站环境。 Linux 作为操作系统&#xff0c;提供了稳定、安全和高效的基础平台。…

Swift 中强大的 Key Paths(键路径)机制趣谈(上)

概览 小伙伴们可能不知道&#xff1a;在 Swift 语言中隐藏着大量看似“其貌不扬”实则却让秃头码农们“高世骇俗”&#xff0c;堪称卧虎藏龙的各种秘技。 其中&#xff0c;有一枚“不起眼”的小家伙称之为键路径&#xff08;Key Paths&#xff09;。如若将其善加利用&#xff…

MYSQL函数进阶详解:案例解析(第19天)

系列文章目录 一、MySQL的函数&#xff08;重点&#xff09; 二、MySQL的窗口函数&#xff08;重点&#xff09; 三、MySQL的视图&#xff08;熟悉&#xff09; 四、MySQL的事务&#xff08;熟悉&#xff09; 文章目录 系列文章目录前言一、MySQL的函数1. 聚合函数2. group_c…

Linux基础 - MariaDB 数据库管理系统

目录 零. 简介 一. 安装 二. 基本使用 1. 设置root密码 2. 创建库 3. 创建表 4.添加数据 5. 查看数据 三. 管理表单及数据 四. 数据库的备份及恢复 零. 简介 MariaDB 是一种流行的开源数据库管理系统&#xff0c;它是 MySQL 的一个分支。 MariaDB 保留了与 MySQL 的…

HarmonyOS APP应用开发项目- MCA助手(Day01持续更新中~)

简言&#xff1a; gitee地址&#xff1a;https://gitee.com/whltaoin_admin/money-controller-app.git端云一体化开发在线文档&#xff1a;https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/agc-harmonyos-clouddev-view-0000001700053733-V5 注&#xff1…

激光粒度分析仪校准步骤详解:提升测量精度的秘诀

在材料科学、环境监测、医药研发等众多领域&#xff0c;激光粒度分析仪以其高精度、高效率的测量性能&#xff0c;成为了不可或缺的测试工具。然而&#xff0c;为了保持其测量结果的准确性和可靠性&#xff0c;定期校准是不可或缺的步骤。 接下来&#xff0c;佰德将为您详细介…

可视化低代码平台之:RayData光启元的震撼作品。

RayData家的可视化作品&#xff0c;贝格前端工场是经常碰到&#xff0c;制作十分的精良&#xff0c;业内很有影响力。他们也有自己的低代码平台&#xff0c;分为了桌面版和网页版&#xff0c;本期分享一下他们的作品。

【单片机毕业设计选题24043】-可旋转式电视支架控制系统设计与实现

系统功能: 系统操作说明&#xff1a; 上电后OLED显示 “欢迎使用电视支架系统请稍后”&#xff0c;两秒后进入正常界面显示 第一页面第一行显示 Mode:Key&#xff0c; 第二行显示 TV:Middle 短按B5按键可控制步进电机左转&#xff0c; 第二行显示 TV:Left 后正常显示 TV:…

六、资产安全—信息分级资产管理与隐私保护练习题(CISSP)

六、资产安全—信息分级资产管理与隐私保护(CISSP): 六、资产安全—信息分级资产管理与隐私保护(C

语义检索-BAAI Embedding语义向量模型深度解析:微调Cross-Encoder以提升语义检索精度

语义检索-BAAI Embedding语义向量模型深度解析:微调Cross-Encoder以提升语义检索精度 语义向量模型(Embedding Model)已经被广泛应用于搜索、推荐、数据挖掘等重要领域。在大模型时代,它更是用于解决幻觉问题、知识时效问题、超长文本问题等各种大模型本身制约或不足的必要…

【Python】已解决:ModuleNotFoundError: No module named ‘pyhanlp’

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例五、注意事项 已解决&#xff1a;ModuleNotFoundError: No module named ‘pyhanlp’ 一、分析问题背景 在使用Python进行自然语言处理时&#xff0c;有时我们可能会用到pyhanlp这个库&#xff0c;它是一个基于J…

煤矿安全大模型:微调internlm2模型实现针对煤矿事故和煤矿安全知识的智能问答

煤矿安全大模型————矿途智护者 使用煤矿历史事故案例,事故处理报告、安全规程规章制度、技术文档、煤矿从业人员入职考试题库等数据,微调internlm2模型实现针对煤矿事故和煤矿安全知识的智能问答。 本项目简介: 近年来,国家对煤矿安全生产的重视程度不断提升。为了确…

STM32 中断编程入门

目录 一、中断系统 1、中断的原理 2、中断类型 外部中断 定时器中断 DMA中断 3、中断处理函数 中断标志位清除 中断服务程序退出 二、实际应用 中断控制LED 任务要求 代码示例 中断控制串口通信 任务要求1 代码示例 任务要求2 代码示例 总结 学习目标&…

【第三版 系统集成项目管理工程师】第5 章 软件工程

持续更新。。。。。。。。。。。。。。。 【第三版】第五章 软件工程 5.1软件工程定义练习 5.2软件需求5.2.1雾求的层次1.业务需求-P2032.用户需求-P2033.系统需求-P203 5.2.2质量功能部署 P2035.2.3需求获取 P2045.2.4需求分析1.结构化分析-P2042.面向对象分析-P207 5.2.5号求…

第二证券:可转债基础知识?想玩可转债一定要搞懂的交易规则!

可转债&#xff0c;全称是“可转化公司债券”&#xff0c;是上市公司为了融资&#xff0c;向社会公众所发行的一种债券&#xff0c;具有股票和债券的双重特点&#xff0c;投资者可以选择按照发行时约定的价格将债券转化成公司一般股票&#xff0c;也可作为债券持有到期后收取本…

格式化选NTFS还是exFAT 格式化NTFS后Mac不能用怎么办 移动硬盘格式化ntfs和exfat的区别

面对硬盘、U盘或移动硬盘的格式化决策&#xff0c;NTFS与exFAT作为主流的文件系统&#xff0c;用户在选择时可以根据它们的不同特点来选择适用场景。下面我们来看看格式化选NTFS还是exFAT&#xff0c;格式化NTFS后Mac不能用怎么办的相关内容。 一、格式化选NTFS还是exFAT 在数…

DevOps认证是什么?DevOps工具介绍

DevOps 这个词是由Development&#xff08;开发&#xff09; 和 Operations&#xff08;运维&#xff09;组合起来的&#xff0c;你可以把它理解成为一种让开发团队和运维团队紧密合作的方法。 DevOps从2009年诞生到现在已经14年多了&#xff0c;一开始大家还在摸索&#xff0…

Webpack: 插件架构之Hook体系

概述 Webpack 之所以能够应对 Web 场景下极度复杂、多样的构建需求&#xff0c;关键就在于其健壮、扩展性极强的插件架构&#xff0c;而插件架构的精髓又在于其灵活多变的 Hook 体系&#xff0c;可以说&#xff0c;只有真正掌握 Hook 底层设计与实现逻辑&#xff0c;深入理解不…