首先,我想说的是,数学有助于使我们的思想井井有条,并有效地发展逻辑思维,而这是软件开发参与者最重要的素质。 说到测试,它主要涉及系统的行为,该行为与软件开发人员常用的结构表示正交。 结构表示和行为表示之间的区别在于,结构表示的重点是软件的功能,而行为视图则考虑了软件的功能。
测试人员的困难之一是基本的技术文档或软件开发手册通常是由开发人员和为开发人员编写的,并且主要侧重于结构信息而不是行为信息。 当然,结构和行为部分对于测试都非常重要,因为在每个部分中都会发现编程错误。 这就是为什么我们将讨论离散数学方法以显示程序结构与其行为之间的关系的原因。
在日常工作中,软件质量保证(QA)工程师会处理公式运算,函数行为和数据结构。 他们始终监视和验证系统的不断变化的状态,因此他们需要具有算法和数学思维才能理解软件的逻辑。
因此,如果开发人员在其工作中使用数学方法,则所有逻辑操作将相互关联,操作将遵循逻辑链,并且每个功能都将在结构上加以考虑。
离散数学可以帮助我们在各种情况下找到最佳解决方案。 例如,您可以找到最合适的测试用例集(测试用例),而不必覆盖所有可能的选项。 此外,离散数学可以帮助我们直观地看到已经实施并涵盖在测试中的确切软件。
不幸的是,我们并不生活在理想的世界中,使用该软件的预期实际结果和实际结果可能会有所不同。 因此,质量保证部(QA)的主要目标是有效涵盖尽可能多的测试用例。
为了更详细地展示这个概念,我们创建了下面的维恩图,并附带了前面概述的示例:

上面的维恩图描述了许多情况,从而有助于说明和定义各种情况。 例如,这可以帮助我们了解对象集之间的区别。 离散数学有助于分析和优化可能影响正在开发的软件的一组动作。
集合论
使用基本集理论的原理,我们可以创建伪代码来说明次日应用程序的所有可能情况(该程序使用输入的日期来计算下一天的日期):
M1={month:month has 30 days} M2={month:month has 31 days except December} M3={month:month is February} M4={month:month is December} D1={day:1<=day<=28} D2={day:1<=day<=29} D3={day:1<=day<=30} D4={day:1<=day<=31} Y1={year:year is a leap year} Y2={year:year is not a leap year}
该伪代码已经为应用程序的开发和测试做好了准备,因此测试人员还可以根据此数据应用所有可能的测试用例。 使用这种格式的数据有助于提高开发速度并减少出错的机会。
图论
最离散的数学是所谓的“图论”,它研究图。 图形用于表示某些对象或数据之间的关系,计算机网络是图形的合适示例。
图形也是软件开发过程的基础。 例如,使用图形,我们可以将复杂的功能分解为几个较小的部分,这有助于我们更好地理解业务逻辑。
图可以是有方向性的也可以是无方向性的,这意味着我们可以在一个方向或两个方向(在有向图的情况下)从一个节点移动到另一个节点,或者我们不能从一个节点移动到另一个节点(如果该图严格地在一个方向上定向)方向)
因此,让我们回到软件测试中,想象一下我们有一些流程(例如,在某种任务跟踪系统中移动任务); 我们有一些问题的条件,可以将其移至另一个阶段(有向图),或者可以达到对实体无能为力的某个点(无向图)。 通过这种可视化方法,我们可以轻松地组合可用于该实体的所有可能动作的集合:

让我们继续看一下可以基于无向图建立的邻接矩阵。 在下面的示例中,邻接矩阵的元素指示成对的顶点是否相邻:

现在,假设节点是某些实体的条件,并且如果我们为该图(实体集)构造邻接矩阵,我们将看到我们可以采取的一组有限动作。 例如,可以将状态从节点“ 0”更改为节点“ 1”,因为它们彼此相关。 但是实体“ 0”不能更改为阶段“ 2”或“ 3”,正如我们从矩阵中看到的那样-单元格中写入了“零”。 使用此矩阵,我们可以消除不必要的实体步骤集并减少测试用例集。
我们可以用来收集测试用例的另一个矩阵是发生率矩阵,它显示了两类对象之间的关系。 在下图中,我们看到一个无向图及其发生矩阵:“ 1”,“ 2”,“ 3”和“ 4”是节点(实体),“ e1”,“ e2”,“ e3”,“ e4”是图的边缘,该矩阵说明了我们可以对它们执行的实体和操作。 使用节点“ 1”,我们可以执行动作“ e1”,“ e2”和“ e3”,但是动作“ e4”不适用于节点“ 1”。 此方法对于创建一组测试用例非常有用。

想象一下,测试人员收到了一个实体列表以及可以对这些实体执行的操作。 有了这个矩阵,他可以减少测试用例的数量。 减少测试数量是软件测试过程中非常重要的一部分。 软件测试高度依赖于减少测试用例的数量,并且通过这种方法,可以最大程度地提高测试覆盖率和避免冗余。
软件测试人员的目标是使用有效的测试用例覆盖产品,该用例可让您测试所有可能的操作组合。 测试人员可以使用离散数学方法(算法)以最小的努力获得成功,以找到最佳的测试用例集,并最大程度地提高软件测试过程的效率。
离散数学还可以帮助我们理解软件的实际创建方式,因为所有软件都使用离散数学和数学逻辑的算法和方法。 因此,如果我们了解这是如何工作的,我们可以在程序中找到用户无法检测到的错误或问题。
陪替氏网
让我们看一个使用Petri Nets(动态图)的应用程序如何在微服务技术上工作的示例:

在这里,我们看到系统具有初始状态,并且应该接收从另一服务发送的一些信号(出现标记)。 根据结果,应执行以下操作。 因此,Petri网说明了整个系统的动态。 如果存在任何问题,我们可以更快地定位缺陷。
神经网络
人工神经网络也基于图原理。 它们模仿人脑神经元对信息的处理。 神经系统的每个部分都基于一个包含“输入”节点,“隐藏”层和“输出”节点的图形。

一些数据进入输入层,隐藏层算法对该数据进行处理并将结果发送到输出阶段。 因此,神经网络可以基于该数据执行动作。 神经网络还包含许多具有不同逻辑的相似图形,因此它们可以基于输入参数进行决策。
千年测试
我们在测试中使用离散数学的最后一个示例涉及构建软件测试过程。 当前,有许多被称为“千年测试”的方法论和方法,这些方法论和方法早在其实际使用之前就已开发出来,始于2000年代,那时软件开发开始迅速发展。
BDD(行为驱动开发)是所谓的千年测试的一部分,这种方法是TDD(测试驱动开发)的扩展。 BDD允许测试人员在给定功能的接受标准与用于测试该功能的测试之间建立更紧密的关系。 BDD可以将自然语言中的结构化语句转换为可执行的测试,从而在它们开始讲一种通用语言时,对业务方和开发方更加清楚和理解。 BDD工作流程的基本结构也基于动态图(Petri Net)。

从该结构可以看出,每个过程都伴随着一个不同的过程,并且只有在上一个阶段完成之后才能进入下一个阶段。 离散数学原理再次帮助我们更有效地理解过程。
最后,我想再次列出在软件开发过程中使用离散数学的优点:
- 帮助理解所需功能的业务逻辑
- 简化将复杂任务划分为简单任务的能力
- 使专业人员能够更轻松地进行有效的测试
- 帮助理解和可视化我们想要的一切结构
以上示例说明了如何使用离散数学有效地提高测试性能。 离散数学的各个方面都可以帮助开发人员在整个软件开发生命周期中了解常规软件工作流程及其原理。