当前位置: 首页 > news >正文

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

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

  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路径根本不存在,应该返回404assert_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 功能

相关文章:

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

我们需要从访客那里收集哪些信息&#xff0c;以便将其登记为电子邮件通讯的订阅者&#xff1f; 电子邮件地址&#xff1a;这是最基本的要求&#xff0c;因为我们需要通过电子邮件地址向订阅者发送内容。姓名&#xff1a;虽然这不是强制性的&#xff0c;但我们希望收集一个名字…...

SpringCloudAlibaba | Sentinel从基础到进阶

一、Sentinel简介 Sentinel是SpringCloudAlibaba的一个组件&#xff0c;主要用于解决微服务架构中的高可用性和稳定性问题&#xff08;雪崩问题&#xff09;。 常见的使用场景有&#xff1a; 流量控制舱壁模式&#xff08;线程隔离&#xff09;超时处理熔断降级 二、流量控…...

算法刷题Day18: BM41 输出二叉树的右视图

题目链接 描述 思路&#xff1a; 递归构造二叉树在Day15有讲到。复习一下&#xff0c;就是使用递归构建左右子树。将中序和前序一分为二。 接下来是找出每一层的最右边的节点&#xff0c;可以利用队列层次遍历。 利用队列长度记录当前层有多少个节点&#xff0c;每次从队列里…...

【信息系统项目管理师-论文真题】2015下半年论文详解(包括解题思路和写作要点)

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 论题一:大项目或多项目的成本管理解题思路写作要点论题二:项目的采购管理解题思路写作要点论题一:大项目或多项目的成本管理 随着移动互联网、物联网、云计算、大数据等新一代信息技术的广泛应用,我国目前…...

Windows如何安装go环境,离线安装beego

一、安装go 1、下载go All releases - The Go Programming Language 通过网盘分享的文件&#xff1a;分享的文件 链接: https://pan.baidu.com/s/1MCbo3k3otSoVdmIR4mpPiQ 提取码: hxgf 下载amd64.zip文件&#xff0c;然后解压到指定的路径 2、配置环境变量 需要新建两个环境…...

JavaScript网络请求( XMLHttpRequest 对象,进度事件, 跨源资源共享)

一、 XMLHttpRequest 对象 IE5 是第一个引入 XHR 对象的浏览器。这个对象是通过 ActiveX 对象实现并包含在 MSXML 库中 的。为此&#xff0c; XHR 对象的 3 个版本在浏览器中分别被暴露为 MSXML2.XMLHttp 、 MSXML2.XMLHttp.3.0 和 MXSML2.XMLHttp.6.0 。 所有现代…...

计算机网络信息系统安全问题及解决策略

目 录 摘 要 前 言 一、计算机网络信息系统研究现状及安全技术 &#xff08;一&#xff09;计算机网络信息系统研究现状 &#xff08;二&#xff09;计算机网络信息系统全技术概述 二、计算机网络信息系统安全问题 &#xff08;一&#xff09;环境危害引发的安全问…...

解决并发情况下调用 Instruct-pix2pix 模型推理错误:index out of bounds 问题

解决并发情况下调用 Instruct-pix2pix 模型推理错误&#xff1a;index out of bounds 问题 背景介绍 在对 golang 开发的 图像生成网站 进行并发测试时&#xff0c;调用基于 Instruct-pix2pix 模型和 FastAPI 的图像生成 API 遇到了以下错误&#xff1a; Model inference er…...

你了解TCP/IP参考模型吗

前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在歌唱 你了解TCP/IP参考模型吗 一. TCP/IP参考模型二. TCP/IP模型图解三. TCP/IP模型的对比与OSI模型四. TCP/IP协议族五. 总结 TCP/IP参考…...

高斯混合模型及最大期望算法(EM)聚类

混合高斯分布&#xff08;Gaussian Mixture Model&#xff0c;GMM&#xff09;是一种概率模型&#xff0c;用于表示具有多个高斯分布的加权组合的数据集。它被广泛应用于模式识别、聚类分析和密度估计等领域。 定义 混合高斯分布由多个单变量或多变量高斯分布的线性组合组成。…...

批处理命令的语法与功能

目录 案例一 echo命令语法及应用 案例二 命令语法及应用 案例三 goto命令语法及应用 案例四 pause命令语法及应用 案例五 call命令语法及应用 案例六 start命令语法及应用 案例七 rem命令语法及应用 案例八 if命令语法及应用 案例九 set命令的语法及应用 案例十 setl…...

33. Three.js案例-创建带阴影的球体与平面

33. Three.js案例-创建带阴影的球体与平面 实现效果 知识点 WebGLRenderer (WebGL渲染器) WebGLRenderer 是 Three.js 中用于渲染 3D 场景的核心类。它负责将场景中的对象绘制到画布上。 构造器 new THREE.WebGLRenderer(parameters)参数类型描述parametersObject可选参数…...

Three.js材质纹理扩散过渡

Three.js材质纹理扩散过渡 import * as THREE from "three"; import { ThreeHelper } from "/src/ThreeHelper"; import { LoadGLTF, MethodBaseSceneSet } from "/src/ThreeHelper/decorators"; import { MainScreen } from "/src/compone…...

免费开源!推荐一款网页版数据库管理工具!

免费开源&#xff01;推荐一款网页版数据库管理工具&#xff01; DBGate 是一个开源的数据库管理工具&#xff0c;DBGate 的最大特点是可以 Web 访问&#xff01;&#xff0c;轻松实现一台机器部署&#xff0c;所有人使用&#xff01; 无论是 MySQL、PostgreSQL、SQLite 还是…...

生态系统NPP及碳源、碳汇模拟实践技术应用(土地利用变化、未来气候变化、空间动态模拟)

由于全球变暖、大气中温室气体浓度逐年增加等问题的出现&#xff0c;“双碳”行动特别是碳中和已经在世界范围形成广泛影响。碳中和可以从碳排放&#xff08;碳源&#xff09;和碳固定&#xff08;碳汇&#xff09;这两个侧面来理解。陆地生态系统在全球碳循环过程中有着重要作…...

Mvc、Springmvc框架

一.Mvc&#xff1a; 1.概念&#xff1a; MVC它是一种设计理念。把程序按照指定的结构来划分: Model模型 、View视图 、Controller控制层&#xff1b; 结构图&#xff1a; 二.Springmvc: 1.概念&#xff1a; springmvc框架它是spring框架的一个分支。它是按照mvc架构思想设计…...

MATLAB2021B APP seriallist 串口通信

文章目录 前言一、项目需要二、使用步骤1.查找串口填写到查找列表2.发送函数3. 接收函数4.检测串口按钮5.选择串口号 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 项目需要&#xff1a; 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面…...

【Python爬虫系列】_033.Scrapy_分布式爬虫

课 程 推 荐我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)教程合集 👈👈…...

2025erp系统开源免费进销存系统搭建教程/功能介绍/上线即可运营软件平台源码

系统介绍 基于ThinkPHP与LayUI构建的全方位进销存解决方案 本系统集成了采购、销售、零售、多仓库管理、财务管理等核心功能模块&#xff0c;旨在为企业提供一站式进销存管理体验。借助详尽的报表分析和灵活的设置选项&#xff0c;企业可实现精细化管理&#xff0c;提升运营效…...

Android实战经验篇-busybox小工具

Android开发系列文章请转如下链接 Android实战经验篇-系列文章 Android Display Graphics系列文章-汇总 俗话说“工欲善其事&#xff0c;必先利其器&#xff01;” 在原生Android系统中&#xff0c;提供的基础调试命令是基于toybox的。支持的命令不够全面&#xff0c;而Busy…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...