软件工程第八周
测试用例的设计
需求分析:测试功能是什么
总体设计:测试模块之间是否有调用关系
过程性分析:测试一步一步走的对不对
当设计测试用例时,首先要明确测试的目标和范围,然后根据这些目标来决定具体的测试活动和方法。以下是对三个阶段的扩展描述:
-
需求分析
测试功能是什么:基本的单元功能测试与异常测试
- 确定需要测试的特定功能和需求。这可能包括从需求文档、用户故事或功能说明中提取特定的功能和行为。
- 识别并记录所有的业务规则和限制条件。
- 确定预期的输出或行为,以及对异常情况或错误的处理方式。
- 定义测试的优先级,确定哪些功能是关键路径或高风险区域,需要更加重点地进行测试。
-
总体设计
测试模块之间是否有调用关系:Mock+Mockito测试模块之间的调度关系,加上接口设计
- 根据系统的架构和组件关系,确定各个模块之间的依赖和调用关系。
- 为每个模块或组件定义接口测试,确保它们在与其他模块交互时能够正确工作。
- 确定需要模拟或存根的组件,例如,如果某个服务还没有完成,但是您需要测试与它交互的其他部分,那么可能需要一个模拟或存根来模拟该服务的行为。
- 评估可能的集成问题,如数据不一致、通信失败等,并为这些情况设计测试用例。
-
过程性分析
测试一步一步走的对不对:集成测试+Jacoco查看代码覆盖率
- 对于每个功能或需求,定义具体的测试步骤,包括如何触发功能、提供输入和验证输出。
- 使用边界值分析、等价类划分等技术,确定测试输入的范围和值。
- 考虑正常情况下的工作流程,以及可能的异常或错误路径。
- 定义预期结果和如何验证它们。这可能包括检查数据库中的值、验证UI的输出或确认与其他系统的交互。
- 确保代码的所有逻辑路径都被测试到,这可以通过代码覆盖工具来帮助验证。
- 对于可能的错误或异常情况,定义如何触发它们,以及系统应该如何响应。
通过这三个阶段的分析和设计,您可以确保您的测试用例是全面和有效的,能够覆盖到系统的所有关键功能和行为。
结构化程序定义
现在停留层次是代码块,而不是模块。
结构化程序设计是一种编程范式,旨在提高大型程序和系统的可理解性和质量。它是通过以下方法实现的:
有三种基本控制结构:
- 顺序结构:程序按照代码的顺序执行指令。
- 选择结构:根据条件决定执行哪部分代码,如
if-else
语句。- 循环结构:重复执行某部分代码,直到满足特定条件,如
for
和while
循环。单入口单出口: 这意味着每个程序或子程序只有一个开始点和一个结束点。这种方法能够有效减少内容耦合,简化程序流程,并提高代码的可读性和可维护性。
结构化程序设计的目标是使代码更加清晰和有逻辑性。描述过程要保证一定只由这三种控制结构组成,这使得程序的操作变得可预测;提高了代码的可读性,从而便于“一目十行”地阅读和理解代码。
结构化程序设计不仅提高了代码的可读性和可维护性,而且使得代码更易于测试和调试。通过遵循其原则和规范,开发者可以编写出高质量、易于理解和维护的软件,从而提高整体的软件开发效率和质量。
此外,结构化程序设计鼓励程序员将大型程序分解为更小、更易于管理的部分或模块。这些模块应该是高内聚的,也就是说它们应该独立地执行一个明确的任务,而不是多个不相关的任务。
break
、try-catch
与 goto
的对比
break,try catch等语句本质上保留了goto语句的特点,但是同样弱化了GOTO语句自由自在的缺陷。
- 共同点:
- 所有这些控制结构都允许程序在非线性的方式中改变执行流程。具体来说,它们都可以导致程序从一个点跳到另一个点,跳过中间的某些代码段。
- 差异:
goto
是低级别的、非结构化的控制流语句,而break
和try-catch
是高级别的、结构化的控制流机制。goto
的使用可能会导致所谓的"spaghetti code"(意为代码逻辑复杂、难以追踪),因此在现代编程中通常不鼓励使用。break
通常用于跳出循环或switch
语句,使代码的读者能够快速理解为什么执行流程被中断。try-catch
是异常处理的机制,它使开发者能够明确地处理异常情况,而不是简单地跳过它们。
判定表的应用
- 需求分析:
- 判定表可以帮助需求分析师识别和理解系统应该如何响应各种条件或输入的组合。
- 软件工程性设计:
- 设计师可以使用判定表来帮助他们确定如何实现特定的功能或行为。
- 测试:
- 测试人员可以使用判定表来确保测试覆盖了所有可能的输入组合,这有助于发现软件的潜在缺陷。判定表确保了系统的每个部分都经过了彻底的测试,从而增加了软件的质量和可靠性。
判定表就是一组判定条件,在测试中,根据判定表制定测试用例,要考虑到判定表的所有情况。
系统设计注意点
1.常用的快捷键不要替换,红色字体表示警示:符合用户的使用习惯。
2.用户对系统的反应应该在意料之中,保证意外最小化。
3.对破坏性操作要确认:退出未保存/系统格式化/撤销。
在许多应用程序中,特定的操作可能导致不可逆的更改或数据丢失。这些被称为“破坏性操作”。为了避免意外的数据丢失或更改,最佳做法是在执行这些操作之前向用户提供确认提示。
很多语言都有undo包:
"Undo" 功能允许用户撤销上一次或多次操作,从而恢复到先前的状态。这对于用户误操作或改变决策时非常有用。
有一些编程库和框架为"Undo" 功能提供了支持,但并不是所有编程语言都内置了这样的功能。
为了实现"Undo",通常需要保存先前的状态,这样就可以在需要时恢复它。
4.用户指南,在F1中给出说明,始终站在用户的角度。敏捷过程:以用户为中心,在故事中表示“作为管理员,应该……”。有一些工具能够帮助开发用户指南。
5.用户差异性:考虑到用户熟练/不熟练,ctrl c ctlv 和 右键复制。
其他
1. 可以在提示错误的时候提供错误的解决办法,就能把user-friendly变成user-helpful类型。
2. UI部分:
1. 原型法是最常用的UI设计方法,在课程设计中必须要用。比如在纸上画出,也可以尝试使用UI设计的工具。(要求使用实践工具)
2. UX / UE 用户体验岗位 :游戏岗位会有心理学背景的成员
3. Web无障碍设计原则
3. 颜色的变化可以体现系统状态的变化,作者认为可以根据心情改变颜色,进而更换系统主题和信息。
McCabe复杂性度量(程序还没设计出来)
基本概念
McCabe复杂性度量是通过控制流来判断程序的复杂性。它的核心思想是将程序简化为一个流图,由节点和边组成。这种方法变换程序为一个强连通图,并使用图论来判断图的复杂性。不过,需要注意的是,该方法不直接考虑程序本身的代码复杂性,而是通过其控制流来进行评估。
在这种流图中,主要有两种节点:单流程节点和多分支节点,其中多分支节点,也称为判定节点,是最关键的部分,因为它进行决策判定。
圈复杂性
圈复杂性反映了流图中所有的边或执行路径。每一条边代表程序的一个特定的执行流程。为了进行有效的测试,测试人员应确保测试覆盖了流图中的所有边。这确保了对程序的每个可能执行路径都进行了测试。
处理复合条件
在程序中,复合条件和简单的判断条件并不相同。因此,对于复合条件,应将其视为新增的节点,确保每个节点内的判定复杂性是相同的。每一个简单条件在流图中对应一个判定节点。通常,为了确保代码的可维护性和可读性,推荐的复杂性值应该不超过10。