使用 Python 进行测试(4)为什么要测试?测什么?

总结

要知道测试的内容,首先要知道测试的原因。下面是测试的几个主要目的:

  1. 避免回归
  2. 质量管理
  3. 匹配规格
  4. 淡化责任
  5. 让你放心
  6. 学习测试
  7. 选中一个框

在这里插入图片描述

你为什么要测试?

要决定测试什么、测试多少以及以什么顺序测试,您需要首先弄清楚测试的原因。
测试是一项艰巨的工作,需要时间、精力和资源。为了证明它的合理性,它必须服务于一个目的,你必须为每个项目定义它是什么。

目的1:避免回归

这是测试最常见的目的:确保当有人修改代码时,我们不会破坏现有的代码。这也是最帕累托和最现实的目的,因为它不需要 100% 覆盖所有边缘情况就可以给你带来良好的回报。对代码最常用的路径进行一些良好的测试将确保大多数用户在大多数时候不会生气。
大多数人都专注于单元测试,但经验告诉我,一些好的端到端测试(我们将在后面定义)可以让你走得很远。

目的2:质量管理

添加测试可能会提高软件的质量,前提是您不会过度使用并定期发布。😃
这是一个很好的副作用,但你也可以故意选择利用它来达到这个目的:

  • 它将通过迫使你检查你的假设,将边缘情况摆在你面前并定期练习代码来减少代码库中的错误。
  • 它将迫使你考虑你的 API,并使其可测试,从而减少耦合。
  • 它会让你重新考虑你的项目范围,因为测试成本很高,所以你将不得不思考,“这个功能值得吗?

不幸的是,这引出了一个问题:什么是质量?您的质量目标是什么?你如何衡量它?
这是一个兔子洞,公司很少有客观的、可测试的质量指标清单。当他们这样做时,这些指标往往最终会被玩弄。除非你是美国宇航局,否则就顺其自然吧,特别是如果你在另一边有一个客户,他们会一路影响它。经验有很大帮助,所以如果你一开始很糟糕,不要气馁。

决定进行低级质量检查是一个完美的决定。但你必须有意识地去做。

目的3:匹配规格

测试是关于系统如何工作的实用、可读且始终保持最新状态的演示。因此,它们非常适合证明您遵循规格或标准。如果这是你的目标,你需要现在就做出决定,因为这需要纪律和整个团队的参与。在某种程度上,它比“管理质量”更容易,因为你是否匹配它更客观(尽管 IRL 实践也有办法用它来玩弄)。但这可能是一项繁琐的工作,繁琐、重复、注重细节,并且需要大量文档。

它有一个不同的、成本更低的、有点美妙的结果:它是关于代码如何工作的文档和参考。它可以帮助初学者了解您的代码库是如何滴答作响的,使入门更容易,并为您和您的 AI 插件提供参考。

即使你不符合规范,我建议你至少要牢记这个文档目标,因为它很快就会带来回报。这意味着,涵盖最常见的用例,在测试中使用好名称并执行公共 API。我甚至把一些测试做得有点太大了,这样它们读起来就像一个可执行文件,并保证是正确的教程。

目的4:淡化责任

目的5:让你放心

如果一个项目至关重要,如果人们的生活受到影响,如果你的职业生涯岌岌可危,那么看到成千上万的测试通过亮绿色支票将对你的血压产生非常积极的影响。

目的6:学习测试

目的 7:选中一个框

生活有时可能很愚蠢,是的,就像斯科特·尤雷克(Scott Jurek)在《吃就跑》中所说的那样:“有时,你只是做事。”

你的限制是什么?

你想做什么?你能做的到吗?
你需要了解你可以使用的人力,测试花费的时间,在什么条件(使用笔记本?使用特定的测试工具?什么权限?)下进行测试。

测试多少?

你应该测试多少东西?
对我来说,测试的黄金标准是SQLite代码库。他们的测试次数是代码行的 590 倍,在代码行中,他们检查诸如断电时会发生什么!但他们最近还在添加新的测试!

因此,你无法真正地全面测试!
你该测试多少取决于你希望你的项目需要什么,如果你不在乎错误,你甚至可以不进行测试,在出现问题时修复。

经验法则

如果您有产品,通过自动化 GUI 进行端到端测试是脆弱的,但也会带来最大的收益。当您没有太多时间进行测试时,您可以从此开始。与公共 Web API、cmd接口等相同。奖励:当您是初学者时,这种类型的测试更容易概念化,因为它非常具体,而且您不必解决副作用,因为您正在测试副作用。首先快速而肮脏地完成是完全可以的。但是,通过 e2e 测试,您不会获得更好的代码和架构的好处。

如果您有库,请优先测试公共 API(如果可以)。从上到下尽早锻炼你的大部分筹码,同时防止你迷失在细节中。它还将迫使您考虑程序的边界及其提供的服务,这是极客很难做到的。对一个干净的、完美的小函数进行单元测试要漂亮得多。这并不总是可行的,因为如果您从头开始启动系统,您可能需要先创建大量低级工具。

如果可靠性至关重要,并且您有一个规范,则首先按照指定测试组件,并根据其匹配的规范部分命名/注释/引用每个测试。使用类型提示,尤其是对于模型和单元。如果您必须支持规范的多个版本,则还要测试版本和命名空间。质量要求越高,就越需要通过验收测试、回溯测试、模糊测试和属性测试来补充单元测试。

纯洁往往是决定优先事项的一种糟糕方式。在项目早期,100% 的测试覆盖率很少是一个好目标,不要过分关注这一点,因为最后的百分比是昂贵的,而且带来的好处最少。这个耗资5亿欧元的项目上限为95%。混合概念和不完美也是可以的。在单元测试中可能会有一些副作用。你可能只锻炼一些分支和一些快乐的道路。您可能不会测试某些错误。测试可能介于 e2e 和单元测试之间,但两者都不完全是。不要让最好的成为好的敌人。保持你最初陈述的目标,并记住你的限制。这就是我们从他们开始的原因。它们是您的指南。
当然,现在您可能不知道什么是覆盖率、属性测试或模糊测试,这将在本系列的下一篇文章中解释。

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

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

相关文章

QT系列教程(11) TextEdit实现Qt 文本高亮

文本高亮 对于textedit里录入的部分单词我们可以实现高亮,实现高亮主要依赖于QSyntaxHighlighter。 我们先创建一个Qt Application类,类名MainWindow, 然后新增一个C类,类名为MySyntaxHighlighter。 #ifndef MYSYNTAXHIGHLIGHTER_H #define …

优化查询性能:DolphinDB 时间类型数据比较规则详解

在数据库中,时间是一种常见的数据类型。在处理时间数据时,比较操作是非常常见的需求。然而,在不同的场景下,对时间类型数据进行比较时应用的规则不同。本文将从 DolphinDB 支持的时间类型开始,由浅入深分别介绍时间类型…

C++访问Private,Protecd的一些方法总结

前言 在编写C程序中 我们偶尔会碰到这样的三种特殊修改变量值的需求: [1]在不修改类原本的实现下,访问修改类的Private变量 [2]在不修改类原本的实现下,修改类的Protected变量 Private变量访问 public类模版函数特化 这种办法利用了类模…

Qt自定义日志输出

Qt自定义日志输出 简略版&#xff1a; #include <QApplication> #include <QDebug> #include <QDateTime> #include <QFileInfo> // 将日志类型转换为字符串 QString typeToString(QtMsgType type) {switch (type) {case QtDebugMsg: return "D…

全网爆火的AI语音合成工具-ChatTTS,有人已经拿它赚到了第一桶金,送增强版整合包

上篇分享了如何从0到1搭建一套语音交互系统。 其中&#xff0c;语音合成&#xff08;TTS&#xff09;是提升用户体验的关键所在。 不得不说&#xff0c;AI 语音界人才辈出&#xff0c;从之前的Bert-Sovit&#xff0c;到GPT-Sovits&#xff0c;再到最近一周狂揽了 1w Star 的C…

热门开源项目ChatTTS: 国内语音技术突破,实现弯道超车

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

细说MCU修改回调函数调用模式的方法

目录 1、硬件及工程 2、实现方法 &#xff08;1&#xff09;修改while(1)中的代码&#xff1a; &#xff08;2&#xff09;修改2 &#xff08;3&#xff09;修改3 &#xff08;4&#xff09;修改4 &#xff08;5&#xff09;修改5 3、下载并运行 在本文作者的文章中&a…

RPC知识

一、为什么要有RPC&#xff1a; HTTP协议的接口&#xff0c;在接口不多、系统与系统交互较少的情况下&#xff0c;解决信息孤岛初期常使用的一种通信手段&#xff1b;优点就是简单、直接、开发方便&#xff0c;利用现成的HTTP协议进行传输。 但是&#xff0c;如果是一个大型的网…

python-基础篇-函数-在py中的长相

文章目录 整体长相长相要求 整体长相 怎么自定义函数&#xff1f; 要知道怎么定义函数&#xff0c;就要知道函数的组成部分是怎样的。 def 函数名(参数1&#xff0c;参数2....参数n):函数体return 语句这就是 Python 函数的组成部分。 长相要求 所以自定义函数&#xff0c…

读AI新生:破解人机共存密码笔记02进化

1. 人工智能的标准模型 1.1. 机器优化人类提供的固定目标 1.1.1. 是一条死胡同 1.1.1.1. 当你走进死胡同时&#xff0c;你最好掉头返回&#xff0c;找出走错的地方 1.2. 问题不在于我们可能无法做好构建人工智能系统的工作&…

【loguru】【notifiers】配置ERROR级别邮件发送通知

完整代码 from loguru import logger from notifiers import get_notifier# 获取电子邮件通知器 notifier get_notifier("email")# 配置电子邮件通知参数 email_params {"username": "xxxxx163.com", # 发送邮件的用户名&#xff0c;我这里用…

时机:产品成功的关键因子

在商业世界里&#xff0c;产品成功与否往往与许多因素有关&#xff1a;优秀的创意、强大的团队、充足的资金等。然而&#xff0c;在这些因素之外&#xff0c;一个常被忽视但至关重要的因素就是“时机”。正如古语所言&#xff1a;“人为可做&#xff0c;天时难造”&#xff0c;…

LabVIEW电子类实验虚拟仿真系统

开发了基于LabVIEW开发的电子类实验虚拟仿真实验系统。该系统通过图形化编程方式&#xff0c;实现了复杂电子实验操作的虚拟化&#xff0c;不仅提高了学生的操作熟练度和学习兴趣&#xff0c;而且通过智能评价模块提供即时反馈&#xff0c;促进教学和学习的互动。 项目背景 在…

目标检测——可见光和红外船舶图像配对数据集

引言 亲爱的读者们&#xff0c;您是否在寻找某个特定的数据集&#xff0c;用于研究或项目实践&#xff1f;欢迎您在评论区留言&#xff0c;或者通过公众号私信告诉我&#xff0c;您想要的数据集的类型主题。小编会竭尽全力为您寻找&#xff0c;并在找到后第一时间与您分享。 …

webpack逆向

声明&#xff1a;个人总结记录一下&#xff0c;避免忘记 1、webpack 类型 单文件 直接可以在文件顶部找到加载器 多文件 顶部找不到加载器 如图所示 多文件的这话&#xff0c;全局搜所 69725 找到类似n(69725) ,单点n进去&#xff0c;可以找到加载器 2、调用 通过赋值的方…

金属3D打印技术革新模具制造业

在当今竞争激烈的制造业领域&#xff0c;模具制造业正面临着诸多挑战。冷却时间长、模具温度控制困难、制造周期长以及成本高昂等问题&#xff0c;一直是制约模具制造业发展的瓶颈。然而&#xff0c;随着金属3D打印技术的快速发展&#xff0c;模具制造业迎来了前所未有的机遇。…

SpringAI快速上手

一、导入依赖 镜像&#xff08;导入maven依赖&#xff09; <repositories><repository><id>spring-snapshots</id><name>Spring Snapshots</name><url>https://repo.spring.io/snapshot</url><releases><enabled>…

宿舍用电管理模块一进三出的升级改造

宿舍用电管理模块一进三出石家庄光大远通电气有限公司产品在高校日常管理工作中,宿舍管理是一项重要工作。宿舍管理内容复杂,而且涉及学生的日常生活,意义重大。其中,学生宿舍内漏电,超负荷用电,违规用电等现象一直是困扰后勤管理的普遍问题。随着学生日常生活方式以及生活用品…

光功率计传感器

光探测仪表: 激光功率计探头按照不同的原理和材料分为热电堆型、光电二极管型以及包含两种传感器的综合探头, 激光能量计则有热释电传感器和热电堆传感器探头 热释电效应传感器: 热释电传感器的工作原理主要是基于热释电效应。当物体处于不同温度时,会发射出不同强度的红…

【RabbitMQ】异步消息及Rabbitmq安装

https://blog.csdn.net/weixin_73077810/article/details/133836287 https://www.bilibili.com/video/BV1mN4y1Z7t9/ 同步调用和异步调用 如果我们的业务需要实时得到服务提供方的响应&#xff0c;则应该选择同步通讯&#xff08;同步调用&#xff09;。 如果我们追求更高的效…