构建一个rust生产应用读书笔记四(实战1)
我们需要从访客那里收集哪些信息,以便将其登记为电子邮件通讯的订阅者?
- 电子邮件地址:这是最基本的要求,因为我们需要通过电子邮件地址向订阅者发送内容。
- 姓名:虽然这不是强制性的,但我们希望收集一个名字,以便在电子邮件中个性化问候(例如,“您好 {{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中正确传输和解析。
将需求转化为测试用例,在实际开发过程中也是如此,测试先行
测试用例
- 验证电子邮件地址的有效性
- 描述:确保用户提供的电子邮件地址是有效的。
- 测试用例:
- 输入:email=example@example.com
- 期望输出:订阅成功。
- 输入:email=invalidemail
- 期望输出:显示错误消息,提示电子邮件格式无效。
- 验证姓名字段的灵活性
- 描述:确保用户可以使用任何形式的姓名,包括空值。
- 测试用例:
- 输入:email=example@example.com&name=John Doe
- 期望输出:订阅成功。
- 输入:email=example@example.com&name=DenverCoder9
- 期望输出:订阅成功。
- 输入:email=example@example.com&name=
- 期望输出:订阅成功,姓名字段为空。
- 验证表单提交的编码方式
- 描述:确保表单数据以 application/x-www-form-urlencoded 格式正确编码。
- 测试用例:
- 输入:email=example%40example.com&name=John%20Doe
- 期望输出:订阅成功,电子邮件地址和姓名正确解析。
- 验证重复订阅
- 描述:确保同一电子邮件地址不能多次订阅。
- 测试用例:
- 输入:第一次订阅 email=example@example.com&name=John Doe
- 期望输出:订阅成功。
- 输入:第二次订阅 email=example@example.com&name=John Doe
- 期望输出:显示错误消息,提示该电子邮件地址已订阅。
- 验证错误处理
- 描述:确保系统能够正确处理各种错误情况。
- 测试用例:
- 输入:email=example@example.com&name=
- 期望输出:订阅成功,姓名字段为空。
- 输入:email=&name=John Doe
- 期望输出:显示错误消息,提示电子邮件地址不能为空。
- 输入:email=example@example.com&name=<>
- 期望输出:显示错误消息,提示姓名字段包含非法字符。
编写测试用例代码
本文结合表驱动测试(Table-Driven Testing)方法,它通过使用一个数据表来组织测试用例。每个测试用例通常包含输入数据、预期输出结果以及可能的其他信息,如测试描述或标签。这种方法使得测试代码更加简洁、易于理解和维护,同时也方便扩展新的测试用例。
表驱动测试的优势
- 代码简洁:通过将测试用例组织成表格形式,可以避免大量的重复代码,使测试逻辑更加清晰。
- 易于维护:当需要添加新的测试用例或修改现有测试用例时,只需更新表格中的数据,而不需要改动测试逻辑。
- 便于扩展:可以轻松地向表格中添加新的行,以涵盖更多的测试场景。
- 更好的可读性:将测试用例组织成表格形式,使得测试意图更加明确,更容易理解。
///! 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)
我们需要从访客那里收集哪些信息,以便将其登记为电子邮件通讯的订阅者? 电子邮件地址:这是最基本的要求,因为我们需要通过电子邮件地址向订阅者发送内容。姓名:虽然这不是强制性的,但我们希望收集一个名字…...

SpringCloudAlibaba | Sentinel从基础到进阶
一、Sentinel简介 Sentinel是SpringCloudAlibaba的一个组件,主要用于解决微服务架构中的高可用性和稳定性问题(雪崩问题)。 常见的使用场景有: 流量控制舱壁模式(线程隔离)超时处理熔断降级 二、流量控…...

算法刷题Day18: BM41 输出二叉树的右视图
题目链接 描述 思路: 递归构造二叉树在Day15有讲到。复习一下,就是使用递归构建左右子树。将中序和前序一分为二。 接下来是找出每一层的最右边的节点,可以利用队列层次遍历。 利用队列长度记录当前层有多少个节点,每次从队列里…...
【信息系统项目管理师-论文真题】2015下半年论文详解(包括解题思路和写作要点)
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 论题一:大项目或多项目的成本管理解题思路写作要点论题二:项目的采购管理解题思路写作要点论题一:大项目或多项目的成本管理 随着移动互联网、物联网、云计算、大数据等新一代信息技术的广泛应用,我国目前…...

Windows如何安装go环境,离线安装beego
一、安装go 1、下载go All releases - The Go Programming Language 通过网盘分享的文件:分享的文件 链接: https://pan.baidu.com/s/1MCbo3k3otSoVdmIR4mpPiQ 提取码: hxgf 下载amd64.zip文件,然后解压到指定的路径 2、配置环境变量 需要新建两个环境…...
JavaScript网络请求( XMLHttpRequest 对象,进度事件, 跨源资源共享)
一、 XMLHttpRequest 对象 IE5 是第一个引入 XHR 对象的浏览器。这个对象是通过 ActiveX 对象实现并包含在 MSXML 库中 的。为此, XHR 对象的 3 个版本在浏览器中分别被暴露为 MSXML2.XMLHttp 、 MSXML2.XMLHttp.3.0 和 MXSML2.XMLHttp.6.0 。 所有现代…...
计算机网络信息系统安全问题及解决策略
目 录 摘 要 前 言 一、计算机网络信息系统研究现状及安全技术 (一)计算机网络信息系统研究现状 (二)计算机网络信息系统全技术概述 二、计算机网络信息系统安全问题 (一)环境危害引发的安全问…...

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

你了解TCP/IP参考模型吗
前言 这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。 作者:神的孩子都在歌唱 你了解TCP/IP参考模型吗 一. TCP/IP参考模型二. TCP/IP模型图解三. TCP/IP模型的对比与OSI模型四. TCP/IP协议族五. 总结 TCP/IP参考…...
高斯混合模型及最大期望算法(EM)聚类
混合高斯分布(Gaussian Mixture Model,GMM)是一种概率模型,用于表示具有多个高斯分布的加权组合的数据集。它被广泛应用于模式识别、聚类分析和密度估计等领域。 定义 混合高斯分布由多个单变量或多变量高斯分布的线性组合组成。…...

批处理命令的语法与功能
目录 案例一 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…...

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

生态系统NPP及碳源、碳汇模拟实践技术应用(土地利用变化、未来气候变化、空间动态模拟)
由于全球变暖、大气中温室气体浓度逐年增加等问题的出现,“双碳”行动特别是碳中和已经在世界范围形成广泛影响。碳中和可以从碳排放(碳源)和碳固定(碳汇)这两个侧面来理解。陆地生态系统在全球碳循环过程中有着重要作…...

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

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

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

2025erp系统开源免费进销存系统搭建教程/功能介绍/上线即可运营软件平台源码
系统介绍 基于ThinkPHP与LayUI构建的全方位进销存解决方案 本系统集成了采购、销售、零售、多仓库管理、财务管理等核心功能模块,旨在为企业提供一站式进销存管理体验。借助详尽的报表分析和灵活的设置选项,企业可实现精细化管理,提升运营效…...

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

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

day36-多路IO复用
一、基本概念 (服务器多客户端模型) 定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用:应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标…...

Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...
Vue 模板语句的数据来源
🧩 Vue 模板语句的数据来源:全方位解析 Vue 模板(<template> 部分)中的表达式、指令绑定(如 v-bind, v-on)和插值({{ }})都在一个特定的作用域内求值。这个作用域由当前 组件…...
鸿蒙(HarmonyOS5)实现跳一跳小游戏
下面我将介绍如何使用鸿蒙的ArkUI框架,实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...

Matlab实现任意伪彩色图像可视化显示
Matlab实现任意伪彩色图像可视化显示 1、灰度原始图像2、RGB彩色原始图像 在科研研究中,如何展示好看的实验结果图像非常重要!!! 1、灰度原始图像 灰度图像每个像素点只有一个数值,代表该点的亮度(或…...
土建施工员考试:建筑施工技术重点知识有哪些?
《管理实务》是土建施工员考试中侧重实操应用与管理能力的科目,核心考查施工组织、质量安全、进度成本等现场管理要点。以下是结合考试大纲与高频考点整理的重点内容,附学习方向和应试技巧: 一、施工组织与进度管理 核心目标: 规…...
2025年低延迟业务DDoS防护全攻略:高可用架构与实战方案
一、延迟敏感行业面临的DDoS攻击新挑战 2025年,金融交易、实时竞技游戏、工业物联网等低延迟业务成为DDoS攻击的首要目标。攻击呈现三大特征: AI驱动的自适应攻击:攻击流量模拟真实用户行为,差异率低至0.5%,传统规则引…...