系统测试的原则和目的
尽早、不断的进行测试。
程序员避免测试自己设计的程序。
既要选择有效、合理的数据,也要选择无效、不合理的数据。
修改后应进行回归测试。
尚未发现的错误数量与该程序已发现错误数成正比。
测试方法
白盒测试
什么是白盒测试?
白盒测试是一种软件测试方法,它关注的是程序内部的结构和逻辑。在白盒测试中,测试人员需要了解程序的内部工作原理,包括代码的实现细节。
为什么叫“白盒”?
想象一下,你有一个透明的盒子,可以看到里面的所有东西。同样,在白盒测试中,测试人员可以“看到”程序内部的代码,知道它是如何工作的。
白盒测试的目的
- 验证代码逻辑:确保代码按照预期的方式工作。
- 覆盖所有路径:尽可能测试到程序中的每一个逻辑分支。
白盒测试的例子
假设你在编写一个简单的计算器程序,这个程序可以进行加法运算。你不仅要测试输入两个数相加的结果是否正确,还要确保程序能够处理边界情况,比如输入非常大的数字或者负数。
白盒测试的方法
- 语句覆盖:确保每行代码都被执行过。
- 分支覆盖:确保每个条件分支都被测试过。
- 路径覆盖:确保程序中的每条执行路径都被测试过。
黑盒测试
什么是黑盒测试?
黑盒测试是一种软件测试方法,它不关心程序内部的实现细节,只关注程序的输入和输出。测试人员只需要知道程序的功能,而不需要知道它是如何实现的。
为什么叫“黑盒”?
想象一下,你有一个不透明的盒子,你看不到里面的东西。同样,在黑盒测试中,测试人员不需要知道程序内部的代码,只需要知道它应该做什么。
黑盒测试的目的
- 验证功能:确保程序的功能符合用户的需求。
- 检测错误:发现程序在实际使用中的问题。
黑盒测试的例子
还是那个计算器程序,黑盒测试关注的是用户界面和功能。比如,你可以输入两个数并点击“加”按钮,然后检查结果是否正确。你不需要知道程序内部是如何计算的,只需要验证结果是否符合预期。
黑盒测试的方法
- 等价类划分:将输入数据分为几类,每类选取一个典型的输入进行测试。
- 边界值分析:测试边界值,如最大值、最小值、刚好超出边界等。
- 因果图法:根据输入和输出之间的关系画出因果图,然后根据图设计测试用例。
总结
白盒测试 vs 黑盒测试
- 白盒测试:关注程序内部逻辑,需要了解代码细节。
- 黑盒测试:只关心程序的输入和输出,不关心内部实现。
何时使用哪种测试?
- 白盒测试:当你需要确保代码的质量和逻辑完整性时使用。
- 黑盒测试:当你需要验证程序的功能是否符合用户需求时使用。
测试阶段
-
单元测试
- 定义:针对软件中的最小可测试单元(如单个函数或方法)进行测试。
- 目的:验证每个单元是否按照预期工作。
- 例子:测试一个函数是否能够正确地计算两个数的和。
- 工具:单元测试框架(如JUnit、pytest)。
-
集成测试
- 定义:测试不同模块或组件之间的接口是否能够正确地协同工作。
- 目的:确保各个模块之间能够正确交互。
- 例子:测试一个模块是否能够正确地调用另一个模块的API。
- 工具:集成测试框架(如TestNG、JUnit)。
-
系统测试
- 定义:测试整个系统的功能是否符合需求规格说明。
- 目的:确保系统作为一个整体能够满足用户的需求。
- 例子:测试一个完整的购物网站能否正确地处理订单。
- 工具:自动化测试工具(如Selenium、Appium)。
-
验收测试
- 定义:在系统测试之后,由用户或代表用户的人进行测试,确认系统是否可以接受。
- 目的:确保系统能够满足最终用户的需求。
- 例子:用户在实际环境中试用系统,并确认其是否符合预期。
- 工具:用户验收测试(UAT)工具(如Cucumber)。
-
回归测试
- 定义:在对系统进行了修改或增加了新功能之后,重新测试之前的功能,确保新的更改没有引入新的错误。
- 目的:确保新的更改没有破坏已有的功能。
- 例子:修复了一个bug之后,重新测试整个系统,确保其他功能仍然正常。
- 工具:自动化回归测试工具(如Jenkins、GitLab CI/CD)。
-
性能测试
- 定义:测试系统在高负载下的表现,确保系统能够在预期的工作负载下正常运行。
- 目的:确保系统在高并发或大数据量的情况下仍能保持稳定。
- 例子:测试一个网站在大量用户同时访问时的响应时间。
- 工具:性能测试工具(如LoadRunner、JMeter)。
-
安全测试
- 定义:测试系统的安全性,确保系统能够抵御攻击。
- 目的:确保系统的安全性,防止数据泄露或被恶意攻击。
- 例子:测试一个网站是否存在SQL注入漏洞。
- 工具:安全测试工具(如OWASP ZAP、Burp Suite)
Gantt图
什么是Gantt图?
Gantt图是一种常用的项目管理工具,用于展示项目的进度和任务安排。它以图表的形式显示了项目的各个任务及其开始时间、结束时间和持续时间。通过Gantt图,项目管理者和团队成员可以清楚地看到每个任务的时间安排和项目的整体进展。
Gantt图的组成部分
Gantt图通常包含以下几个关键部分:
- 任务列表:左侧列出所有的任务名称。
- 时间轴:上方或下方显示时间线,通常是按天、周或月划分。
- 任务条形图:每个任务对应一个条形图,表示任务的持续时间。条形图的起点表示任务的开始时间,终点表示任务的完成时间。
- 里程碑:重要的时间节点,通常用特殊的符号(如钻石形状)标记。
- 依赖关系:任务之间的依赖关系可以用箭头或线条连接表示。
Gantt图的作用
- 任务规划:帮助项目管理者计划每个任务的开始和结束时间。
- 进度跟踪:清晰地显示项目的进展情况,便于监控和调整。
- 资源分配:帮助识别哪些任务需要哪些资源,并合理分配资源。
- 依赖关系管理:显示任务之间的依赖关系,确保任务按正确的顺序进行。
- 沟通工具:方便向团队成员、客户和其他利益相关者展示项目状态。
PERT图
什么是PERT图?
PERT图是一种用于项目管理和规划的图形化工具,主要用于预测项目完成所需的时间。它通过节点和箭头来表示项目的各个任务及其相互之间的依赖关系。
PERT图特别适用于那些具有不确定性和首次执行的任务,因为它允许估算任务的最乐观时间、最可能时间和最悲观时间。
PERT图不能反映任务之间的并行关系
PERT图的组成部分
PERT图主要包括以下几个部分:
- 节点(Nodes):表示任务或事件的开始或结束点。
- 箭头(Arrows):表示任务及其执行方向。箭头从一个节点指向另一个节点,表示任务之间的先后顺序。
- 任务名称:每个节点旁边会标注任务的名称。
- 任务时间估计:通常包括三个时间估计:
- 最乐观时间(Optimistic Time, TO):任务完成的最佳情况。
- 最可能时间(Most Likely Time, TL):任务完成的最常见情况。
- 最悲观时间(Pessimistic Time, TP):任务完成的最差情况。
计算任务期望时间
PERT图的一个重要特点是它使用统计方法来计算任务的期望时间(Expected Time, TE),公式如下:
这个公式考虑了三种时间估计,并给最可能时间更高的权重(4倍),以获得更准确的期望时间。
PERT图的作用
- 任务排序:明确任务之间的先后顺序。
- 关键路径分析:找出项目中最长的任务序列(关键路径),这是项目完成所需的最短时间。
- 风险评估:通过考虑最悲观时间,评估项目的潜在风险。
- 时间管理:帮助确定项目完成的最可能时间,并为项目留出缓冲时间。
风险管理
风险是指“损失或伤害的可能性”。
风险管理包含以下四个步骤:
- 风险识别:识别可能影响项目或业务的各种风险因素,包括内部和外部的风险来源。
- 风险预测:评估风险发生的可能性以及它们可能产生的后果,以便制定应对策略。
- 风险评估:量化风险的影响程度,确定哪些风险最重要,需要优先处理。
- 风险控制:采取措施降低风险发生的机会,减轻风险带来的负面影响,或者制定应急计划以应对无法完全消除的风险。
软件质量特性
1. 功能性
定义
功能性指的是软件是否实现了用户所需要的所有功能,并且这些功能是否按照用户的要求正确地工作。
示例
- 如果一个银行软件能够正确地处理存款、取款、转账等操作,那么它的功能性就是好的。
- 如果一个购物网站能够正确地显示商品信息、处理订单、完成支付等操作,那么它的功能性也是好的。
2. 可靠性
定义
可靠性指的是软件在规定条件下和规定时间内无故障运行的能力。简单来说,就是软件在使用过程中不出错。
示例
- 如果一个软件在长时间运行后不会崩溃或丢失数据,那么它的可靠性就比较高。
- 如果一个软件在各种不同的输入下都能正确地响应,不会产生意外错误,那么它的可靠性也比较高。
3. 可用性
定义
可用性指的是软件对于用户来说是否容易使用。这包括软件的界面设计、操作流程、帮助文档等方面的易用性。
示例
- 如果一个软件的用户界面直观、操作简单,新手用户也能很快上手,那么它的可用性就很好。
- 如果一个软件提供了丰富的帮助文档和用户指南,用户遇到问题时能够轻松找到解决方案,那么它的可用性也很好。
4. 效率
定义
效率指的是软件在执行任务时的资源利用情况,包括处理速度、内存使用、能耗等方面。
示例
- 如果一个软件在处理大量数据时响应迅速,不会占用过多的CPU资源,那么它的效率就很高。
- 如果一个软件在运行时内存占用低,不会导致系统变慢,那么它的效率也很高。
5. 可维护性
定义
可维护性指的是软件是否容易修改和更新。当需要添加新功能、修复错误或改进性能时,软件是否容易进行修改。
示例
- 如果一个软件的代码结构清晰,注释充分,开发人员能够很容易地找到需要修改的地方,那么它的可维护性就很好。
- 如果一个软件的架构设计良好,模块化程度高,开发人员能够轻松地替换或扩展某个部分,那么它的可维护性也很好。
6. 可移植性
定义
可移植性指的是软件从一个环境转移到另一个环境(如不同的操作系统、硬件平台)的能力。
示例
- 如果一个软件可以在不同的操作系统上(如Windows、macOS、Linux)正常运行,那么它的可移植性就很好。
- 如果一个软件可以在不同的硬件配置上(如不同的处理器、内存大小)正常运行,那么它的可移植性也很好。
McCabe度算法
什么是McCabe度算法?
McCabe度算法,又称为环路复杂度,是由Thomas J. McCabe Sr. 在1976年提出的。它是一种度量程序复杂度的方法,用于评估程序控制流的复杂性。
环路复杂度可以帮助开发者理解代码的复杂程度,并指导他们改进代码,使其更易于理解和维护。
环路复杂度的计算方法
环路复杂度的计算基于程序的控制流图(Control Flow Graph, CFG)。控制流图是一种图形表示形式,它用节点表示程序中的基本块,用边表示控制流的转移路径。
环的个数V(G)
m为弧的个数,n为节点个数
为什么要计算环路复杂度?
环路复杂度可以帮助开发者了解程序的复杂程度,从而:
- 提高代码质量:复杂度高的代码往往难以理解和维护。
- 减少错误:复杂度高的代码更容易引入错误。
- 优化代码:通过降低复杂度,可以使代码更简洁、更易于理解和维护。
- 测试覆盖率:复杂度可以帮助确定需要多少测试用例来达到一定的覆盖率。