【软件测试理论002】认识软件缺陷、缺陷生命周期、缺陷分类

embedded/2024/10/19 9:38:15/

目录

1 认识软件缺陷

1.1 什么是软件缺陷

1.2 缺陷存在哪些方面

1.3 软件缺陷示例

1.4 软件缺陷的表现形式

1.5 软件缺陷产生的原因

1.6 软件缺陷的根源

1.7 软件缺陷修复的费用

2 软件缺陷的信息分类

2.1 软件缺陷的生命周期

2.2 软件缺陷的信息

2.3 软件缺陷分类

严重程度

优先级

BUG%E7%B1%BB%E5%9E%8B-toc" style="margin-left:80px;">BUG类型

2.4 开发人员拒绝修改缺陷的情况

2.5 开发不认同bug怎么办

2.6 缺陷修改说明


1 认识软件缺陷

1.1 什么是软件缺陷

根据IEEE 729-1983的标准,软件缺陷BUG)可以从产品内部和外部两个视角来看:

从产品内部看软件缺陷是软件产品开发或维护过程中存在的错误、毛病等各种问题。

这涵盖了在软件开发周期中的各个阶段,如需求分析、设计、编码、测试等,可能出现的各种错误和不完善之处。

从产品外部看软件缺陷是系统所需要实现的某种功能的失效或违背。

这意味着软件在运行过程中未能按照预期执行其功能,或者执行结果与用户的需求存在偏差。

更具体地说,软件缺陷是计算机软件或程序中存在的某种破坏正常运行能力的问题、错误或隐藏的缺陷。这些问题、错误或缺陷会导致软件产品在某种程度上不能满足用户的需要。

1.2 缺陷存在哪些方面

软件未达到需求产品说明书表明的功能。

这意味着软件未能实现或完全实现文档中指定的功能或特性。

软件出现了需求产品说明书指明不会出现的错误。

软件在运行时产生了文档中明确指出不应该发生的错误或异常情况。

软件的功能超出了需求产品说明书指明的范围。

软件包含了文档中未提及或不需要的功能或行为,这可能导致用户困惑或不必要的复杂性。

软件未达到需求规格说明书虽未指明但应该达到的目标。

这通常指的是软件的隐含需求或期望,例如性能、安全性、稳定性等,虽然未在文档中明确,但用户或市场通常期望软件能够达到这些标准。

软件测试人员认为软件难以理解、不易使用、运行速度慢、或者最终用户认为不好。

这涉及到软件的用户体验和质量方面,即使功能正确实现,但如果软件难以使用或效率低下,它仍然被认为是存在缺陷的。

1.3 软件缺陷示例

软件未达到软件需求产品说明书表明的功能:

计算器产品说明书明确表明该计算器将准确无误地执行加、减、乘、除运算。然而,在测试过程中,测试人员或用户发现当按照正常操作输入一个数值后,按下"+"号,再输入另一个数值,最后按下"="号时,计算器并没有给出预期的计算结果,而是没有任何反应。这明显违反了产品说明书中声明的功能。

软件出现了软件需求产品说明书指明不会出现的错误:

计算器产品说明书明确指出该计算器在使用过程中不会出现崩溃、死锁或停止反应的情况。但在实际测试中,测试人员发现当用户随意按、敲键盘后,计算器突然停止接受输入或完全失去了反应。这种异常情况明显违反了说明书中的规定。

软件的功能超出了软件需求产品说明书指明的范围:

在进行计算器功能测试时,测试人员发现该计算器除了提供加、减、乘、除的基本运算功能外,还意外地包含了求平方根的运算功能。然而,这一功能在计算器的产品说明书中并没有提及或规定,因此它超出了说明书指明的功能范围。

软件未达到软件需求产品说明书未指明而应该达到的目标:

在测试过程中,测试人员发现当计算器电池电量不足时,会导致计算结果不准确。尽管这一情况在计算器产品说明书中没有明确指出,但作为一个合格的电子产品,它应该能够在电量不足时提供适当的提示或采取其他措施来确保计算的准确性。因此,这可以视为计算器未达到虽未指明但应该达到的目标。

软件测试人员认为软件难以理解、不易使用、运行速度慢,或者最终用户认为不好:

在测试和用户反馈中,测试人员或最终用户提出了一些关于计算器易用性和用户体验的问题。例如,有用户反映计算器的按键太小,容易误按;显示屏在强光下难以看清;在某些操作下,计算器的响应速度过慢等。这些问题虽然没有直接违反产品说明书的规定,但确实影响了用户对计算器的整体满意度和使用体验。

1.4 软件缺陷的表现形式

功能缺陷:

  • 功能、特性没有实现或部分实现,导致软件无法完成预期的任务。
  • 设计不合理,功能特性不明确,逻辑不清楚或存在矛盾,使得用户难以理解或使用软件。

性能缺陷:

  • 产品实际性能与需求规格说明书所规定的性能指标不一致,如响应时间慢、吞吐量低等。
  • 软件运行出错,包括运行中断、系统崩溃、界面混乱等,影响用户体验和软件的稳定性。

数据缺陷:

  • 数据不正确,如计算结果错误、数据录入错误等。
  • 数据精度不够,无法满足特定场景下的精度要求。
  • 数据不完整,缺少必要的字段或信息。
  • 数据格式不统一,导致数据交换或共享时出现问题。

易用性缺陷:

  • 用户界面设计不合理,导致用户难以理解或使用软件。
  • 软件操作流程繁琐,不符合用户的使用习惯。
  • 软件响应时间过长,用户需要等待较长时间才能得到结果。

用户体验缺陷:

  • 软件界面不美观,影响用户的视觉体验。
  • 软件存在不必要的弹窗或广告,干扰用户正常使用。
  • 软件在特定环境下(如弱光环境)使用效果不佳。

兼容性问题:

  • 软件与特定硬件或操作系统不兼容,导致无法正常运行。
  • 软件与其他软件或工具集成时出现问题,如数据格式不匹配、接口不兼容等。

安全性缺陷:

  • 软件存在安全漏洞,可能被黑客利用进行攻击或数据窃取。
  • 软件的权限管理不当,可能导致未授权访问或数据泄露。

文档缺陷:

  • 软件的用户手册、帮助文档等存在错误或遗漏,导致用户无法正确理解或使用软件。
  • 软件的需求规格说明书、设计文档等与实际实现不一致,给开发、测试和维护带来困难。

1.5 软件缺陷产生的原因

软件缺陷产生是软件开发过程中难以完全避免的,以下是造成软件缺陷产生的主要原因:

需求理解错误:

  • 需求解释或理解不准确,导致开发出的软件与用户需求存在偏差。
  • 用户在定义需求时可能表达不清晰或存在歧义,导致开发团队对需求的理解有误。

需求变更管理不当:

  • 在软件开发过程中,用户需求可能发生变化,如果对这些变更没有进行有效的管理和控制,就可能导致软件缺陷的产生。

设计错误:

  • 设计说明存在逻辑错误、设计不合理或设计过于复杂,难以实现,这些都会导致软件缺陷的产生。
  • 设计人员可能未能充分考虑到各种边界条件和异常情况,导致软件在某些情况下出现错误。

编码错误:

  • 编码说明或程序代码存在错误,如语法错误、逻辑错误、算法错误等,这些都会直接导致软件缺陷的产生。
  • 编码过程中可能存在的疏忽或误操作,如未处理的异常、资源泄露等,也可能导致软件缺陷

测试不充分:

  • 软件测试是发现和修复缺陷的重要环节,但如果测试不充分或测试用例设计不合理,就可能导致一些隐藏的缺陷被遗漏。

硬件或软件环境问题:

  • 硬件设备的兼容性问题或硬件故障可能导致软件无法正常运行或产生错误。
  • 软件系统(如操作系统、数据库等)上的错误或配置不当也可能对软件产生影响,导致缺陷的产生。

项目管理和沟通问题:

  • 项目管理不善,如进度控制不当、资源分配不合理等,可能导致软件开发过程中出现混乱和延误,进而增加软件缺陷的风险。
  • 团队成员之间的沟通不畅或信息传递错误也可能导致软件缺陷的产生。

文档错误:

  • 与软件相关的文档(如用户手册、帮助文档等)可能存在错误、遗漏或描述不准确的情况,这可能导致用户在使用软件时遇到困惑或问题。

拼写和格式错误:

  • 虽然这类错误通常不会影响软件的功能,但拼写和格式错误可能降低用户对软件的信任度,影响用户体验。

1.6 软件缺陷的根源

交流不充分:

  • 客户与开发人员之间:需求传递和解释存在误解或遗漏,导致开发出的软件不符合客户期望。
  • 开发人员与测试人员之间:缺乏有效沟通可能导致测试覆盖不全,一些潜在的缺陷被遗漏。

软件的复杂性:

  • 功能复杂:软件功能繁多,导致设计和实现过程中容易出错。
  • 开发复杂:技术栈多样、架构复杂,增加了开发难度和出错概率。
  • 测试复杂:复杂的逻辑和交互可能导致测试用例设计困难,难以覆盖所有场景。

开发人员的错误:

  • 对需求的理解:开发人员对需求的理解可能存在偏差,导致实现不符合预期。
  • 开发压力:在高强度的工作环境下,开发人员可能忽略一些细节或采取简化的方法,导致缺陷产生。
  • 能力与经验:开发人员的技能水平和经验不足也可能导致缺陷的产生。

需求的变化:

  • 需求说明书、设计文档、程序的变更:在开发过程中,客户可能会提出新的需求或对现有需求进行修改,这些变更如果没有得到妥善处理,就可能引入新的缺陷。

进度压力:

  • 项目周期比较紧:为了赶进度,开发人员可能会牺牲代码质量,采用快速但不够健壮的解决方案,从而增加缺陷的风险。此外,压缩的测试时间也可能导致一些缺陷被遗漏。

1.7 软件缺陷修复的费用

软件缺陷修复的费用随着测试的进行而逐渐上升。

  • 在研发早期阶段,如代码审查或需求分析时发现和修复缺陷的成本最低。
  • 随着进入单元测试、集成测试和系统测试阶段,修复成本会逐步增加。
  • 若缺陷在软件交付客户后才发现,修复成本将急剧上升。

因此,尽早发现和修复缺陷是降低修复费用的关键,可通过加强代码审查、提高测试效率等方式实现。同时,制定合理的修复策略以平衡修复成本和产品质量也至关重要。


2 软件缺陷的信息分类

为了便于缺陷的定位、跟踪和修改,要对所发现的缺陷,按照缺陷的严重程度、优先级、发现阶段、修复阶段、缺陷的性质、所属功能模块、系统环境等方面进行分类和统计。

2.1 软件缺陷的生命周期

编号

缺陷状态

描述

1

提交(Submited )

当测试人员或用户在软件测试或使用过程中发现软件缺陷时,会将这些缺陷提交给开发团队或缺陷管理系统。

提交时,应提供缺陷的详细描述、复现步骤、截图等相关信息,以便于开发人员理解和修复。

2

打开( Open )

缺陷被提交后,其状态通常会被设置为"打开",表示该缺陷正在等待开发人员进行分析和确认。

在这个阶段,开发人员会检查缺陷报告,确认缺陷的真实性,并评估其影响范围和修复难度。

3

拒绝( Rejected )

如果开发人员经过分析后认为该缺陷并非真实的软件问题,或者由于某些原因(如不符合当前版本的需求、用户操作错误等)该缺陷不被视为需要修复,则可以将缺陷状态设置为"拒绝"。

在拒绝缺陷时,开发人员应提供明确的理由和解释,以便提交者理解。

4

修复( Resolved )

当开发人员确认缺陷并决定修复时,他们会开始着手修复代码,并进行必要的测试以确保修复有效。

修复完成后,开发人员会将缺陷状态更新为"修复",并通知测试人员进行验证。

5

关闭(Closed )

测试人员收到修复完成的通知后,会重新执行相关的测试用例,以验证缺陷是否已经被修复。

如果验证通过,测试人员会将缺陷状态更新为"关闭",表示该缺陷已经得到处理。

6

推迟( Later )

在某些情况下,由于时间、资源或其他因素的限制,开发人员可能无法立即修复某个缺陷。此时,他们可以将缺陷状态设置为“推迟”,表示该缺陷将在后续的版本或迭代中进行修复。

推迟的缺陷应被记录在案,并定期进行评估,以确保其不会被遗忘或遗漏。

2.2 软件缺陷的信息

编号

属性名称

描述

1

缺陷ID

唯一的缺陷ID,用于追踪缺陷。

2

缺陷状态

缺陷在跟踪修复过程中的进展情况(生命周期的状态)。

3

缺陷标题

描述缺陷的简要标题。

4

缺陷的严重程度

缺陷对软件产品的影响程度,分为致命、较严重、严重、一般、低。

5

缺陷的优先级

缺陷修复的优先顺序,指明哪些缺陷优先修正,哪些稍后修正。

6

缺陷所属模块

缺陷所属的项目和模块,能够准确定位至模块。

7

缺陷记录者

提交缺陷的人员姓名。

8

缺陷提交时间

缺陷提交的时间。

9

缺陷处理人

处理缺陷的负责人。

10

处理结果描述

对处理结果的描述,包括处理情况和代码修改说明。

11

缺陷处理时间

缺陷处理完成的时间。

12

缺陷验证人

对已处理缺陷进行验证的负责人(回归测试者)。

13

验证结果描述

对验证结果的描述,包括通过与否。

14

缺陷详细描述

缺陷的详细描述和重现步骤。

15

缺陷环境说明

对测试环境的描述。

16

必要的附件

如涉及到附件的或错误现象的图片等。

2.3 软件缺陷分类

严重程度

严重等级

描述

5-Critical

系统瘫痪、异常退出、死循环、严重的计算错误(金融、商城、银行等系统)等。

4-VeryHigh

频繁的死机,系统大部分功能不可用。

3-High

a. 功能点没有实现,或不符合用户需求。

b. 数据丢失。

2-Medium

a. 影响一个相对独立的功能。

b. 仅在特定条件下发生。

c. 与产品需求定义不一致。

d. 断断续续的出现问题。

1-Low

表面性错误,如错别字、文字颜色。

优先级

优先级别

描述

5-Urgent

最高优先级。在这个错误的影响下,系统几乎不可用。

4-VeryHigh

非常高优先级。错误对系统的能力产生了严重的影响。

3-High

高优先级。如果这个错误存在于系统中,会制约开发和测试的活动进行。如果先前没有修复它,那么需要在发布前修复它。

2-Medium

中优先级。不会延迟发布,但会在以后修正这个错误。

1-Low

最低优先级。时间和资源允许时修正。

BUG%E7%B1%BB%E5%9E%8B">BUG类型

缺陷类型

内容说明

备注

系统缺陷

1. 程序引起的死机、异常退出

严重影响系统稳定性,需立即修复。

2. 程序死循环

占用大量资源,需紧急处理。

3. 程序错误,导致系统崩溃或资源不足

无法执行关键功能,需紧急处理。

数据缺陷

1. 数据计算错误

影响数据准确性,需修正。

2. 数据约束错误

违反数据规则,需修正。

3. 数据输入、输出错误

数据不一致,需修复。

数据库缺陷

1. 数据库死锁

阻塞数据访问,需紧急处理。

2. 数据库表、缺省值约束不足

数据完整性风险,需加强约束。

3. 数据库连接错误

无法访问数据,需修复连接。

4. 过多空字段

数据冗余,需优化数据库结构。

接口缺陷

1. 数据通信错误

影响数据交互,需修正通信协议。

2. 程序接口错误

接口不兼容或功能失效,需修复。

功能缺陷

1. 功能无法实现

缺失关键功能,需开发实现。

2. 功能实现错误

功能逻辑错误,需修正实现逻辑。

安全性缺陷

1. 用户权限问题

安全隐患,需加强权限控制。

2. 超时限制错误

安全风险,需修正超时机制。

3. 访问控制错误

未经授权访问,需加强访问控制。

4. 加密错误

数据泄露风险,需修正加密机制。

兼容性缺陷

与需求配置不符

影响多平台使用,需优化兼容性。

性能缺陷

1. 未达预期性能

影响用户体验,需优化性能。

2. 性能测试出错

无法验证性能,需修正测试流程。

界面缺陷

1. 操作界面错误

影响用户操作,需修正界面设计。

2. 打印内容或格式错误

打印输出问题,需修正打印逻辑。

3. 删除操作无提示

用户误操作风险,需增加提示。

4. 长时间操作无提示

用户等待体验不佳,需增加进度提示。

5. 界面不规范

影响视觉体验,需优化界面设计。

建议

1. 功能建议

提升产品功能,增加用户满意度。

2. 操作建议

优化操作流程,提升用户体验。

2.4 开发人员拒绝修改缺陷的情况

  1. 无法复现缺陷:开发人员可能无法根据测试人员提供的描述或步骤在相同的环境或条件下复现缺陷。这种情况下,他们可能会拒绝修改,因为没有确切的证据或方式来确认缺陷的存在和解决方法。
  2. 问题描述不清:如果测试人员提交的缺陷报告描述模糊、不明确,或者缺乏足够的信息来准确定位问题,开发人员可能会因为无法理解问题的真正性质而拒绝修改。
  3. 缺陷被认定为非关键或低优先级:开发人员可能会根据缺陷的严重性、影响范围以及修复成本等因素来评估缺陷的优先级。如果某个缺陷被认为是非关键或低优先级的,开发人员可能会将其排在修复列表的后面,甚至拒绝修改。
  4. 技术实现困难:有些缺陷可能涉及到复杂的技术实现,修复难度较大,甚至可能引发其他未知问题。在这种情况下,开发人员可能会权衡利弊,拒绝修改或者暂时搁置。
  5. 需求变更导致的缺陷:如果缺陷是由于需求变更导致的,而开发人员认为这个变更并不符合产品的整体设计或战略方向,他们可能会拒绝修改这个缺陷。
  6. 测试和开发对需求理解不一致:在某些情况下,测试人员和开发人员对产品的需求或功能理解可能存在差异。如果测试人员基于自己的理解提出了缺陷,而开发人员认为这不是一个问题或者不符合他们的理解,他们可能会拒绝修改。
  7. 时间紧迫:在项目时间紧迫的情况下,开发人员可能无法立即修复所有发现的缺陷。他们可能会优先处理那些对软件功能或性能影响更大的缺陷,而暂时拒绝修改一些次要或低优先级的缺陷。

2.5 开发不认同bug怎么办

当开发团队不认同某个问题是bug时,可以采取以下步骤来优化沟通和协作过程:

  1. 提供详细的重现步骤:确保提供的重现步骤清晰、详细,包括前置条件、用户界面上的每一步操作以及任何必要的环境配置,以便开发人员能够准确复现问题。
  2. 附加的截图或录像:提供屏幕截图或视频记录,直观地展示缺陷发生的具体界面和用户操作,帮助开发人员快速理解问题所在。
  3. 提供日志信息:如果系统或应用有日志记录功能,提供与缺陷相关的日志条目,这些日志有助于开发人员分析问题的根本原因。
  4. 简洁明了的描述:使用简单明了的语言描述缺陷,避免使用过于专业的术语,确保描述能够清晰传达问题的本质和对系统或用户的影响。
  5. 共同调试:如果可能,邀请开发人员一同进行调试,通过共同操作和问题复现,让开发人员直观地理解问题的表现。
  6. 引用文档和规范:如果问题涉及特定的功能需求、设计文档或开发规范,引用这些文档来支持你的观点,并解释为何该问题违反了这些规范。
  7. 组织针对性讨论:如果与开发人员的沟通没有达成一致,可以组织一次专题讨论会,邀请测试人员、开发人员和其他相关团队成员参与,共同讨论问题的细节和解决方案。
  8. 寻求中立评估:如果与开发团队的讨论仍然无法解决问题,可以寻求其他团队成员或项目管理者的中立评估,以获得更客观的意见。
  9. 提供真实案例:如果可能,提供来自真实用户的案例或反馈,强调缺陷对用户体验的负面影响,帮助开发人员理解问题的紧迫性和重要性。
  10. 合理的优先级和重要性评估:与开发团队共同评估缺陷的优先级和重要性,确保修复工作的优先级与业务需求和用户期望相匹配。
  11. 提供测试数据:如果缺陷与特定的数据或输入相关,提供相关的测试数据或输入样本,帮助开发人员复现问题并验证修复的有效性。
  12. 记录跟踪:使用缺陷跟踪系统来记录和管理缺陷,确保每个缺陷都有唯一的标识符、详细描述、重现步骤、优先级和状态等信息,以便跟踪和管理。
  13. 保持冷静和尊重:在整个过程中,保持冷静和尊重的态度,避免情绪化的言辞或行为,专注于解决问题。

2.6 缺陷修改说明

并非所有发现的缺陷都会被修改,以下是一些常见的不进行修改的情况及其原因:

  1. 产品发行时间限制:由于市场压力,产品最终发行有严格的时间限制,例如3个月内必须完成并保证基本功能的完整性。在这种情况下,为了确保产品按时上市,某些非关键的缺陷可能会被暂时搁置,待后续版本进行修复。
  2. 测试人员错误操作:若缺陷是由于测试人员错误理解或不正确操作导致的,这类缺陷通常不会被视为产品本身的问题。此类情况一般会记录在FAQ(常见问题解答)文档中,以便用户在使用产品时能够自行解决。
  3. 修改风险较大:当某个缺陷的修改可能影响到多个模块,并带来较大的风险时,团队可能会选择将其留作遗留问题。这是因为大规模的修改可能导致其他潜在的问题,从而影响到产品的整体稳定性。
  4. 修改性价比低:在某些情况下,修复某个缺陷所需的成本(包括时间、人力和资源)可能远超过其带来的实际效益。此时,团队可能会基于成本效益分析,决定不修复该缺陷。
  5. 缺陷难以重现:如果缺陷报告中提出的问题难以在开发或测试环境中重现,那么修复该缺陷的难度会大大增加。在没有明确的重现步骤和可靠的复现场景下,开发人员很难准确定位和修复问题。

http://www.ppmy.cn/embedded/34831.html

相关文章

【Linux】进程相关

文章目录 一、fork函数二、进程地址空间 一、fork函数 fork 函数从其执行位置分化为两个进程来执行剩下的代码, 调用 fork 的函数称为父函数, 分化出来的函数称为子函数. 头文件: #include <unistd.h> 声明: pid_t fork(void); 关于返回值, 函数调用成功后就分化为两个…

Mysql - 聚合函数和分组查询

当涉及处理数据库中的大量数据时&#xff0c;聚合函数和分组查询是非常重要的。通过聚合函数&#xff0c;可以对数据进行统计和汇总&#xff0c;而分组查询则允许我们根据特定的条件对数据进行分组分析。在这篇文章中&#xff0c;我们将深入探讨MySQL中的聚合函数和分组查询&am…

龙迅LT9211D MIPI桥接到2 PORT LVDS,分辨率支持高达3840*2160*30HZ

龙迅LT9211D描述&#xff1a; Lontium LT9211D是一款高性能的MIPI DSI/CSI- 2到双端口LVDS转换器。LT9211D反序列化输入的MIPI视频数据&#xff0c;解码数据包&#xff0c;并将格式化的视频数据流转换为AP和移动显示面板或摄像机之间的LVDS发射机输出。LT9211D支持最大14 dB输…

项目实战 | 如何恰当的处理 Vue 路由权限

前言 哈喽&#xff0c;小伙伴你好&#xff0c;我是 嘟老板。最近接了一个成本千万级的前端项目运维工作&#xff0c;本着 知己知彼 的态度&#xff0c;我将整个前端的大致设计思路过了一遍。不看不知道&#xff0c;一看…吓一跳。光是 路由权限 这块儿的设计&#xff0c;都让我…

【深度学习】概率图模型理论简介

概率图模型 1 概率图模型2 模型表示2.1 有向图模型(Bayesian networks 贝叶斯网络)2.2 无向图模型(Markov random fields 马尔可夫网络)参考概率图模型(Probabilistic Graphical Model,PGM)是一种用图结构来表示和推断多元随机变量之间条件独立性的概率模型。图模型提供…

QT Windows 实现调用Windows API获取ARP 表

简介 使用ping方式获取网络可访问或者存在的设备发现部分会无法ping通但实际网络上存在此设备&#xff0c; 但使用arp -a却可以显示出来&#xff0c; 所以现在使用windows API的方式获取arp 表。 实现 参考Windows提供的示例转化成Qt Qt .pro LIBS -liphlpapiLIBS -lws2_32…

如何使用Go语言进行基准测试(benchmark)?

文章目录 一、基准测试的基本概念二、编写基准测试函数三、运行基准测试四、优化代码性能五、注意事项总结 在Go语言中&#xff0c;基准测试&#xff08;benchmark&#xff09;是一种评估代码性能的有效方式。通过基准测试&#xff0c;我们可以测量代码执行的时间、内存使用情况…

亚马逊云科技AWS免费证书-EC2服务器设计(含题库)

亚马逊云AWS官方程序员专属免费证书又来了&#xff01;这次证书是关于AWS EC2实例的设计和搭建&#xff0c;EC2作为AWS服务的核心&#xff0c;是学好AWS的第一步。强推没有任何AWS背景和转码的小伙伴去学&#xff01;学完也能变成AWS开发大神&#xff01; 证书名字叫Getting St…