构建一个rust生产应用读书笔记四(实战1)

news2024/12/19 13:51:18

我们需要从访客那里收集哪些信息,以便将其登记为电子邮件通讯的订阅者?

  1. 电子邮件地址:这是最基本的要求,因为我们需要通过电子邮件地址向订阅者发送内容。
  2. 姓名:虽然这不是强制性的,但我们希望收集一个名字,以便在电子邮件中个性化问候(例如,“您好 {{subscriber.name}}!”)。这有助于增加邮件的亲和力和互动性。

为什么收集这些信息?

  • 电子邮件地址:这是发送消息的唯一标识符。
  • 姓名:用于个性化邮件,使订阅者感到更亲切。我们不强制要求真实姓名,允许用户使用任何他们喜欢的标识符(例如,coderLZ)。

表单提交的编码方式

假设数据是通过HTML表单收集的,并通过POST请求传递给后端API,表单数据的编码方式可以选择 application/x-www-form-urlencoded。这是最常见的表单数据编码方式,适用于大多数简单的表单提交场景。

示例HTML表单

<form action="/subscribe" method="post">
  <label for="email">电子邮件地址:</label>
  <input type="email" id="email" name="email" required>
  
  <label for="name">姓名 (可选):</label>
  <input type="text" id="name" name="name">
  
  <button type="submit">订阅</button>
</form>

后端API接收的数据格式

当表单提交时,数据将以 application/x-www-form-urlencoded 格式编码,并通过POST请求的请求体(body)传递给后端API,比如

email=example%40example.com&name=DenverCoder9

通常在URL编码中使用%20替换空格,%40替换@符号,以确保URL的标准化、兼容性和安全性。通过URL编码,可以确保各种字符在URL中正确传输和解析。

将需求转化为测试用例,在实际开发过程中也是如此,测试先行

测试用例

  1. 验证电子邮件地址的有效性
    1. 描述:确保用户提供的电子邮件地址是有效的。
    2. 测试用例:
      1. 输入:email=example@example.com
      2. 期望输出:订阅成功。
      3. 输入:email=invalidemail
      4. 期望输出:显示错误消息,提示电子邮件格式无效。
  2. 验证姓名字段的灵活性
    1. 描述:确保用户可以使用任何形式的姓名,包括空值。
    2. 测试用例:
      1. 输入:email=example@example.com&name=John Doe
      2. 期望输出:订阅成功。
      3. 输入:email=example@example.com&name=DenverCoder9
      4. 期望输出:订阅成功。
      5. 输入:email=example@example.com&name=
      6. 期望输出:订阅成功,姓名字段为空。
  3. 验证表单提交的编码方式
    1. 描述:确保表单数据以 application/x-www-form-urlencoded 格式正确编码。
    2. 测试用例:
    3. 输入:email=example%40example.com&name=John%20Doe
    4. 期望输出:订阅成功,电子邮件地址和姓名正确解析。
  4. 验证重复订阅
    1. 描述:确保同一电子邮件地址不能多次订阅。
    2. 测试用例:
      1. 输入:第一次订阅 email=example@example.com&name=John Doe
      2. 期望输出:订阅成功。
      3. 输入:第二次订阅 email=example@example.com&name=John Doe
      4. 期望输出:显示错误消息,提示该电子邮件地址已订阅。
  5. 验证错误处理
    1. 描述:确保系统能够正确处理各种错误情况。
    2. 测试用例:
      1. 输入:email=example@example.com&name=
      2. 期望输出:订阅成功,姓名字段为空。
      3. 输入:email=&name=John Doe
      4. 期望输出:显示错误消息,提示电子邮件地址不能为空。
      5. 输入:email=example@example.com&name=<>
      6. 期望输出:显示错误消息,提示姓名字段包含非法字符。

编写测试用例代码

本文结合表驱动测试(Table-Driven Testing)方法,它通过使用一个数据表来组织测试用例。每个测试用例通常包含输入数据、预期输出结果以及可能的其他信息,如测试描述或标签。这种方法使得测试代码更加简洁、易于理解和维护,同时也方便扩展新的测试用例。

表驱动测试的优势

  1. 代码简洁:通过将测试用例组织成表格形式,可以避免大量的重复代码,使测试逻辑更加清晰。
  2. 易于维护:当需要添加新的测试用例或修改现有测试用例时,只需更新表格中的数据,而不需要改动测试逻辑。
  3. 便于扩展:可以轻松地向表格中添加新的行,以涵盖更多的测试场景。
  4. 更好的可读性:将测试用例组织成表格形式,使得测试意图更加明确,更容易理解。
///! src/health_check.rs
#[tokio::test]
async fn subscribe_returns_a_200_for_valid_form_data() {
    let app_address = spawn_app();
    let client = reqwest::Client::new();

    let body = "name=le%20guin&email=ursula_le_guin%40gmail.com";
    let response = client
        .post(&format!("{}/subscriptions", &app_address))
        .header("Content-Type", "application/x-www-form-urlencoded")
        .body(body)
        .send()
        .await
        .expect("Failed to execute request .");
    //此处我们希望返回200,但是很明显/subscriptions路径根本不存在,应该返回404
    assert_eq!(200, response.status().as_u16());
}

#[tokio::test]
async fn subscribe_returns_a_400_when_data_is_missing() {
    let app_address = spawn_app();
    let client = reqwest::Client::new();
///```test_cases:定义了一个包含多个测试用例的向量。每个测试用例是一个元组,包含两个字符串:
///   invalid_body:无效的请求体,用于模拟缺少某些必要字段的情况。
///```error_message:描述该测试用例的错误信息,用于在断言失败时提供更详细的错误信息。
    let test_cases = vec![
        ("name=le%20guin", "missing the email"),
        ("email=ursula_le_guin%40gmail.com", "missing the name"),
        ("", "missing both name and email"),
    ];

    for (invalid_body, error_message) in test_cases {
        let response = client
            .post(&format!("{}/subscriptions", &app_address))
            .header("Content-Type", "application/x-www-form-urlencoded")
            .body(invalid_body)
            .send()
            .await
            .expect("Failed to execute request.");
        assert_eq!(
            400,
            response.status().as_u16(),
            "The API did not fail with 400 bad Request when the payload was {}.",
            error_message
        );
    }
}

这段代码通过表驱动测试的方法,验证了一个 HTTP API 在接收到缺少必要数据的请求时是否会正确返回 400 Bad Request 状态码。每个测试用例都包含一个无效的请求体和一个描述性的错误信息,以便在断言失败时提供详细的错误提示。虽然并没有覆盖到所有的测试用例,但是这种测试方法不仅提高了代码的可读性和可维护性,还确保了 API 的健壮性。

下一节我们将开始实现/subscriptions 功能

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI技术在演示文稿制作中的应用一键生成PPT

在快节奏的现代工作环境中&#xff0c;时间就是金钱。为了提高工作效率&#xff0c;许多专业人士都在寻找能够快速生成演示文稿&#xff08;PPT&#xff09;的工具。本文将探讨AI技术如何帮助用户自动生成演示文稿&#xff0c;从文案撰写到排版&#xff0c;最终输出成品&#x…

中国当代印章孙溟㠭篆刻锤凿印《无题Ⅵ》

孙溟㠭篆刻锤凿印《无题Ⅵ》 孙溟㠭篆刻锤凿印《无题Ⅵ》 此作品有人说看到了流星雨&#xff0c;有人说看到了战争&#xff0c;有人说看到了疾风暴雨&#xff0c;有人说看到了烟花庆新年&#xff0c;有人说是天气突变下的冰雹……&#xff01;至于是什么仁者见仁智者见智。 孙…

游戏引擎学习第54天

仓库: https://gitee.com/mrxiao_com/2d_game 回顾 我们现在正专注于在游戏世界中放置小实体来代表所有的墙。这些实体围绕着世界的每个边缘。我们有活跃的实体&#xff0c;这些实体位于玩家的视野中&#xff0c;频繁更新&#xff0c;而那些离玩家较远的实体则以较低的频率运…

STM32F407ZGT6-UCOSIII笔记2:UCOSIII任务创建实验-Printf 函数卡住 UCOSIII 系统问题解决

今日简单编写熟悉一下UCOSIII系统的任务创建代码&#xff0c;理解一下OS系统&#xff1a; 并发现以及解决了 Printf 函数卡住 UCOSIII 系统问题解决 文章提供测试代码讲解、完整工程下载、测试效果图 目录 文件结构解释&#xff1a; 任务函数文件&#xff1a; 目前各个文件任…

linux centos 7 安装 mongodb7

MongoDB 是一个基于文档的 NoSQL 数据库。 MongoDB 是一个文档型数据库&#xff0c;数据以类似 JSON 的文档形式存储。 MongoDB 的设计理念是为了应对大数据量、高性能和灵活性需求。 MongoDB使用集合&#xff08;Collections&#xff09;来组织文档&#xff08;Documents&a…

kafka的处理的一些问题 消费延迟

kafka的处理的一些问题 消费者客户端不但没有背压而且内存充足&#xff0c;但产生的消费延迟越来越大在Kafka的Leader副本宕机时 消费者客户端不但没有背压而且内存充足&#xff0c;但产生的消费延迟越来越大 比如我们这个kakfa集群一共有3个Broker节点 TOp1有5个分区&#xf…

计算机网络技术基础:3.计算机网络的拓扑结构

网络拓扑结构是指用传输媒体互连各种设备的物理布局&#xff0c;即用什么方式把网络中的计算机等设备连接起来。将工作站、服务站等网络设备抽象为点&#xff0c;称为“节点”&#xff1b;将通信线路抽象为线&#xff0c;称为“链路”。由节点和链路构成的抽象结构就是网络拓扑…

Vue3源码笔记阅读1——Ref响应式原理

本专栏主要用于记录自己的阅读源码的过程,希望能够加深自己学习印象,也欢迎读者可以帮忙完善。接下来每一篇都会从定义、运用两个层面来进行解析 定义 运用 例子:模板中访问ref(1) <template><div>{{str}}</div> </template> <script> impo…

STM32F407寄存器点灯

背景描述&#xff1a; 最近用32开发遇到问题不得不看寄存器了&#xff0c;就回顾了一下寄存器手册的查看方式和寄存器的使用方法&#xff1b; 上一次这么细致的记录还是在刚学习STM32的时候&#xff0c;之前觉得看寄存器手册以及配置寄存器是有点难度的事情&#xff0c;现在回头…

2024年12月11日Github流行趋势

项目名称&#xff1a;maigret 项目维护者&#xff1a;soxoj, kustermariocoding, dependabot, fen0s, cyb3rk0tik项目介绍&#xff1a;通过用户名从数千个站点收集个人档案信息的工具。项目star数&#xff1a;12,055项目fork数&#xff1a;870 项目名称&#xff1a;uv 项目维护…

Halcon中histo_2dim(Operator)算子原理及应用详解

在Halcon中&#xff0c;histo_2dim算子是一个用于计算双通道灰度值图像的直方图的工具。以下是对该算子的原理及应用的详细解释&#xff1a; 一、原理 histo_2dim算子的函数原型为&#xff1a;histo_2dim(Regions, ImageCol, ImageRow : Histo2Dim : : )。 输入参数&#xff…

mysql免安装版配置教程

一、将压缩包解压至你想要放置的文件夹中&#xff0c;注意&#xff1a;绝对路径中要避免出现中文 二、在解压目录下新建my.ini文件&#xff0c;已经有的就直接覆盖 my.ini文件内容 [mysqld] # 设置3306端口 port3306 # 设置mysql的安装目录 basedirD:\\tools\\mysql-8.1.0-win…

(六)- DRM驱动开发(qcom)

一&#xff0c;Linux Android Display 1&#xff0c;Linux Android Display Software Subsystem 密 2&#xff0c;Linux Android Display Architecture 密 二&#xff0c;DRM/KMS Adreno DPU 1&#xff0c;硬件框图 密 1.1 Qualcomm Adreno DPU 8-Series Overview 密 …

手眼标定工具操作文档

1.手眼标定原理介绍 术语介绍 手眼标定&#xff1a;为了获取相机与机器人坐标系之间得位姿转换关系&#xff0c;需要对相机和机器人坐标系进行标定&#xff0c;该标定过程成为手眼标定&#xff0c;用于存储这一组转换关系的文件称为手眼标定文件。 ETH&#xff1a;即Eye To …

CTFshow-文件上传(Web151-170)

CTFshow-文件上传(Web151-170) 参考了CTF show 文件上传篇&#xff08;web151-170&#xff0c;看这一篇就够啦&#xff09;-CSDN博客 Web151 要求png&#xff0c;然后上传带有一句话木马的a.png&#xff0c;burp抓包后改后缀为a.php&#xff0c;然后蚁剑连接&#xff0c;找fl…

基于YOLOv8模型监控视频中的车辆检测与识别应用

1.摘要 该项目旨在通过技术手段加强交通纪律&#xff0c;提供一种更为人性化和智能化的交通监控方法。具体而言&#xff0c;通过利用PyQt5、YOLOv8和TensorFlow等技术栈&#xff0c;实现了对车辆的高效检测与识别&#xff0c;主要实现车辆类型识别以及速度监测等功能&#xff0…

CISC RISC

CISC&#xff1a;设计目标是通过复杂的指令来提高代码密度&#xff0c;减少指令数量&#xff0c;适合内存资源较为有限的系统。CISC处理器的硬件复杂度较高&#xff0c;但在某些应用场合&#xff08;如桌面计算机&#xff09;能够提供足够的性能。 RISC&#xff1a;设计目标是…

AI Agent与MEME:技术与文化融合驱动Web3创新

AI Agent如何引领Web3新时代&#xff1f; 随着Web3与区块链技术的迅速发展&#xff0c;AI Agent作为人工智能与区块链的交汇点&#xff0c;正在逐步成为推动去中心化生态的重要力量。同时&#xff0c;MEME文化凭借其强大的社区驱动力和文化渗透力&#xff0c;在链上生态中扮演着…

前端的知识(部分)

11 前端的编写步骤 第一步:在HTML的页面中声明方法 第二步:在<script>中定义一个函数,其中声明一个data来为需要的数据 赋值一个初始值 第三步:编写这个方法实现对应的功能

【鸿睿创智开发板试用】移植OpenCV 4到OpenHarmony 4.1

目录 目录 引言 编译系统镜像 (1) 下载代码后解压SDK (2) 下载docker镜像   (3) 编译OH 编译OpenCV 下载OpenCV源代码 构建编译配置文件 执行编译命令 安装库和头文件 测试 结语 引言 最近有个需求是在基于RK3568的OpenHarmony 4.1系统中使用OpenCV&#xff0c…