鉴源论坛丨形式化工程方法之需求建模(下)

作者 | 杨坤 上海控安可信软件创新研究院系统建模组

版块 | 鉴源论坛 · 观模

引言:需求建模是一种从源头确保软件质量的重要手段。需求建模可分为需求规约和需求确认两个部分,前者通过严格设计的形式化语言精确地将需求文档转换为了形式化规约,后者使用基于模型的技术对形式化规约进行多方面的验证以确保需求文档的正确性、有效性以及完备性。

01

前 言

在上一次的文章(《形式化工程方法之需求建模(上)》点击阅读详情)中,我们介绍了一种用于引导机载控制系统的形式化规约和需求确认的形式化工程方法,并着重介绍了该形式化工程方法中的需求模型提取部分。本文将继续介绍剩下的需求模型确认部分。

02

需求模型确认

需求确认的目的是为了通过确保需求文档的正确性、有效性以及完备性来保证后续工程实现的整个系统是正确可靠的,并作为通过在需求阶段发现问题来减少研发成本的重要手段。经典的需求确认有需求审查、需求规约的动画化和需求规约的测试等方式,而需求审查是作为使用最为广泛的一种确认方式。虽然需求审查本身易推广,但因为其本身存在对需求审查人员要求比较高以及耗时等局限性存在难以得到普及。我们提出了一种基于模型的需求模型确认方法,该方法主要包含以下四个部分:模型确认、基于模型的测试用例生成、模型仿真、性质验证。 

(1)模型确认

模型确认主要是以图形化的方式来展示构建好的需求模型中的一些关键信息,为了更好地帮助工程人员发现需求中的问题,我们针对变量和模式流建立了2种关系图:变量之间的影响关系和模式之间的迁移关系,我们将这2种关系使用变量影响关系图和模式迁移关系图进行表达。

图一.png

图1 变量依赖关系图

变量影响关系图用节点表示不同的变量,用箭头表示变量间的影响关系,箭头指向被影响的变量。箭头上标注的条件表示特定条件下的变量直接影响关系。

图二.png

图2 模式迁移关系图

而模式迁移关系图用节点表示不同的模式,用箭头表示模式间的迁移关系,箭头指向要迁移到的模式。箭头上标注的条件表示特定条件下的迁移关系。在状态迁移图中还可以通过选定想要观察的状态进一步观察此状态的各迁移条件,分析状态迁移图以及状态迁移关系来确认模型是否符合预期。可以快捷地帮助需求工程师判断需求功能的描述是否存在缺失。 

(2)基于模型的测试用例生成

在航空领域中对测试用例的覆盖准则有严格的要求,测试用例需要满足DO-333标准:测试用例需满足MC/DC覆盖准则的要求。根据DO-333认证标准的要求,我们提出根据形式化需求自动生成符合MC/DC覆盖准则的测试用例,并辅以真值表帮助人工检查生成测试用例的正确性。该方法还可以帮助发现模型本身的一些错误。生成满足MC/DC覆盖准则的测试用例的方法针对的是模型中的每个模块。对于模块中的计算逻辑,通过算法收集满足MC/DC覆盖准则的约束并将其输入Z3约束求解器中求解来得到测试用例。

图三.png

图3 约束有误的示例

图3展示了一个条件错误的示例,通过对该例子进行基于MC/DC覆盖准则的测试用例约束与求解,可以得到如表1所示的结果。

表1测试用例

表一.png

表1中空白的一项因为条件约束有错,无法求出测试用例。在模型检查的过程中,根据MC/DC覆盖准则生成测试用例,如果有无法生成测试用例的情况,那么就代表模型中的控制算法有错,说明原需求文档的控制逻辑有误。

(3)模拟仿真

模拟仿真操作是在基于需求建立的模型基础上结合上外部输入来使得需求模型模拟真实系统在实际运行中的本质过程,在模拟系统在实际运行过程中,会再以动图的形式实时模拟状态的变化,并提供每个数据各个周期的值。也正是由于其可以根据需求模拟真实执行过程,并记录该系统下每个周期的状态以及变量的值,可以做到代替传统测试中测试人员根据所测需求来进行的手动计算,避免因为人工计算引发的一些不必要的错误,提高了计算的准确性和效率。控制工程师给定的物理环境模拟器是一个确定性系统,即给定相同的输入序列,必然得到同样的输出序列。在此假设下获得可执行程序的方法的模拟结果。模拟执行示意图如图4所示。

图四.png

图4 模拟执行示意图

模拟仿真的过程是:首先进行初始化,为全局变量设置初值,为各个基本模式的计算过程创建相应的任务,启动物理环境模拟器;然后进入控制回路。在该回路中,首先调用物理环境模拟器的接口,从环境采集数据,更新输入变量;然后执行当前模式相对应的计算任务,计算任务由一系列模块组成。如果计算任务完成,则开始检查模式切换条件,调用物理环境模拟器的接口驱动执行机构,然后进入下一次迭代。如果计算任务因为超时被挂起,则调用物理环境模拟器的接口驱动执行机构,然后进入下一次迭代,直接继续未完成的执行计算任务。

(4)性质验证

性质验证是一种经典的用于验证模型是否满足给定性质的技术。一个非常流行的性质描述语言是 LTL,其可以用于描述线性执行的系统。航空航天领域的发动机控制软件和飞行器控制软件均是典型的线性运行的系统。然而,由于飞行器的执行被随机的环境变量所影响,导致传统的模型检查技术不能够直接适用。与此同时,需求工程师们需要一种不需经过模拟仿真即可找到需求中错误的方法,具体来说,用户需要验证一个性质,希望知道在所得到的需求模型之中,该性质是否始终满足,若不满足,则给出其反例。为了解决工业上的实际性质验证需求,我们提出了一个简易版本的性质验证方法用于进行静态时全局的性质验证。性质验证的框架如图5所示。

图五.png

图5 性质验证框架

用户选择待验证的需求条目,工具将自动抽取待验证需求条目中的控制流路径,形成所有路径的集合。然后对模型中每一条路径进行分析,收集路径中的约束条件。根据用户撰写的性质,将用户的性质取反后与路径中的约束条件做合取操作得到待验证的性质。对待验证的性质进行求解,得到验证结果,验证结果包括收集到的路径数量,满足性质的路径的数量,不满足性质的路径数量,并针对不满足性质的路径提供反例来说明在何种情况下不满足性质。将该验证结果反馈给用户后,用户可以根据该结果扩大或缩小待验证的需求条目集合,进行更进一步的性质验证。

在该方法中,路径收集本质上是为了收集路径中的约束条件,为了保障约束条件的准确性,我们使用了符号执行的方法进行路径的收集。在路径收集的过程中主要是为了得到所有的状态路径集合,每个状态路径中维护了该路径下的符号表、内存模型和约束条件。由于在路径收集的过程中已经排除了不可达路径,因此当路径收集结束后,遍历所有的状态路径,根据用户撰写的性质,将用户的性质取反后与可达路径做合取操作得到待验证的性质。将合取得到的表达式输入给求解器进行求解。如果Z3求解器无法得到解,说明该性质在该路径的取值域内是成立的,将该状态路径归类于满足性质的可达路径。反之,如果 Z3求解器得到了解,说明该性质在该路径的取值域内存在不成立的情况,将该路径归类于不满足性质路径。针对所有的状态路径,如果它们在要验证的性质下都属于满足性质路径,那么认为该性质在需求模型中是满足的;只要存在任意一条可达路径属于不满足性质路径,那么认为该性质在需求模型中是不满足的。最终将不满足性质的路径的反例返回给用户查看。

这种简易版本的性质验证方法在实际实现时存在的问题如下: 

· 路径收集问题:在路径收集时,由于在该模型语言中路径的概念存在于各个模块之中,类比于C语言中的函数的话,那么函数的先后执行情况预先并不可知,导致收集到了大量系统实际运行时根本不会执行的路径。 

· 状态爆炸问题:为了解决赋值语句对于条件的影响变化的问题,最终使用了符号执行的技术进行路径的收集,然而,当嵌套的分支过多时,比如当三个模块都发生十几层的嵌套时,会使路径收集工作无法正常完成。

基于上述问题,目前该性质验证仅能用于少量模块间的全局系统性质验证。

· 实验结果:为了验证该形式化工程方法的可行性并展示其有效性,我们将其应用到真实的航空发动机控制软件的需求分析中。实验中有2名经验丰富的工程师全程参与。在将非形式化需求逐步转化成形式化规约的过程中,因为工程师对领域知识非常熟悉,需求规约的构建大约用时2个月。该控制软件的形式化需求规约是一份包含了10个模式、152个模块、1145个变量的Microsoft Word文件。在规约转化成原型的过程中,一共发现了78个语法错误、72个变量遗漏、23个变量类型错误。在进行图形化审查时,一共生成了152个变量依赖关系图、152个变量模块依赖关系图、152个模块模式依赖关系图、1个模式迁移关系图。另外,通过对需求模型的分析,一共生成2342条基于MC/DC覆盖准则的测试用例。通过合作方提供的外部数据,我们顺利完成了需求模型的模拟执行,与合作方通过Matlab模拟的情况一致。

03

总 结

本文主要介绍了形式化工程方法中需求建模技术的需求确认部分,我们设计了一种基于模型的需求确认技术,包括模型确认、基于模型的测试用例生成、模型仿真、性质验证。

我们提出的形式化工程方法在实际航空发动机软件开发项目中展现了优于工业界传统手工审查方法的缺陷发现能力和提供了直观地展示需求中变量关系的能力,进一步佐证了形式化方法在嵌入式控制软件领域的良好前景。未来随着更多技术的发展,我们会继续致力于更为系统化、更能被工业界工程人员接受的嵌入式控制软件形式化规约构建方法和工具链。

主要参考文献:

[1] Youn Kyu Lee, Hoh Peter In, Rick Kazman. Customer Requirements Validation Method Based on Mental Models[C] // Proc of Software Engineering Conference, 2015:199-206.

[2] Aceituna D, Do H, Lee S W. SQ^(2)E:An approach to requirements validation with scenario question[C] //Proc of 2010 Asia Pacific Software Engineering Conference,2010: 33-42.

[3] Li M, Liu S. Integrating Animation-Based Inspection Into Formal Design Specification Construction for Reliable Software Systems[J]. IEEE Transactions on Reliability, 2016, 65(1): 88-106.

[4] Aceituna D, Do H, Lee S W. Interactive requirements validation for reactive systems through virtual requirements prototype[C] // Proc of Model-Driven Requirements Engineering Workshop, 2011:1-10.  

[5] Wang H, Liu S, Gao C. Study on model-based safety verification of automatic train protection system[C] // Proc of Asia-Pacific Conference on Computational Intelligence and Industrial Applications, 2009: 467-470.

[6] Ahmad E, Dong Y W, Larson B, et al. Behavior modeling and verification of movement authority scenario of Chinese Train Control System using AADL[J]. Science China Information Sciences, 2015, 58(11):1-20.

[7] Miao W, Pu G, Yao Y, Ting S, et al. Automated Requirements Validation for ATP Software via Specification Review and Testing[M] // Formal Methods and Software Engineering. Berlin : Springer International Publishing, 2016:26-40. 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PASSL代码解读[01] readme

介绍 PASSL 是一个基于 PaddlePaddle 的视觉库,用于使用 PaddlePaddle 进行最先进的视觉自监督学习研究。PASSL旨在加速自监督学习的研究周期:从设计一个新的自监督任务到评估所学的表征。 PASSL 主要特性: 自监督前沿算法实现 PASSL 实现了…

为什么requests不是python标准库?

在知乎上看到有人问:为什么requests不是python标准库? 这确实是部分人困惑的问题,requests作为python最受欢迎的http请求库,已经成为爬虫必备利器,为什么不把requests直接装到python标准库里呢?可以省去第…

学习使用xbox手柄控制小乌龟节点移动

使用xbox手柄控制小乌龟,首先要下载joy功能包,发布sensor_msgs话题也就是手柄和ros通信的话题。 下载的步骤就根据官方文档即可 joy/Tutorials/ConfiguringALinuxJoystick - ROS Wiki 这里我提供一下具体步骤 第一步 安装joy 首先安装对应系统版本的…

【第二部分--Python之基础】02

二、运算符与程序流程控制 1、运算符 1.1 算术运算符 算术运算符用于组织整数类型和浮点类型的数据,有一元运算符和二元运算符之分。 一元算术运算符有两个:(正号)和-(负号),例如&#xff1…

SV-7041VP SIP塑料壳sip音箱支持POE供电(白色弧形)

SV-7041VP SIP塑料壳sip音箱支持POE供电 (白色弧形) 一、描述18123651365微信 SV-7041VP是深圳锐科达电子有限公司的一款壁挂式SIP网络有源音箱,具有10/100M以太网接口,可将网络音源通过自带的功放和喇叭输出播放,可…

QT的 纯代码+注释 学习笔记

QT学习笔记链接 更新到数据库操作为止..ing

微信怎么恢复聊天记录?效果惊人的3个方法

微信作为我们日常生活中最常用的即时通讯工具之一,承载着我们与亲友之间的重要沟通记录。然而,不可避免地会遇到误删聊天记录的情况,可能是因为手误、设备问题或其他原因。 当我们发现重要的聊天记录不见了,往往会感到焦虑和困扰…

题目:求和(蓝桥真题)

问题描述: 解题思路: 暴力超时,S变换得S a1*(a2.....an) a2*(a3....an) .... an-1*an。因此只需要求出括号内前缀和再相加求和即可。时间复杂度大大减小。 注意点:ans和前缀和的大小要开long long。 题解: #includ…

openGauss学习笔记-252 openGauss性能调优-使用Plan Hint进行调优-Scan方式的Hint

文章目录 openGauss学习笔记-252 openGauss性能调优-使用Plan Hint进行调优-Scan方式的Hint252.1 功能描述252.2 语法格式252.3 参数说明252.4 示例 openGauss学习笔记-252 openGauss性能调优-使用Plan Hint进行调优-Scan方式的Hint 252.1 功能描述 指明scan使用的方法&#…

论文:Term-Weighting Approaches in Automatic Text Retrieval翻译笔记(自动文本检索中的术语加权方法)

文章目录 论文标题:自动文本检索中的术语加权方法摘要1. 自动文本分析2. 词权重规范3. 术语加权实验4 推荐4.1 查询向量4.2 文档向量 论文标题:自动文本检索中的术语加权方法 论文链接:https://www.cs.colostate.edu/~howe/cs640/papers/sal…

javaWeb健康管理系统

一、引言 1.1 设计背景 紧张的工作节奏、教学和科研的压力、个人不良的工作生活习惯、以及伴随工作压力而来的家庭关系、人际关系紧张等因素使得高校群体成为慢性病的高发群体[1]。学生入学的定期体检,教职工人入职体检,以及所有学生和教职工的定期体检…

Leetcode 3.26

Leetcode Hot 100 一级目录1.每日温度 堆1.数组中的第K个最大元素知识点:排序复杂度知识点:堆的实现 2.前 K 个高频元素知识点:优先队列 一级目录 1.每日温度 每日温度 思路是维护一个递减栈,存储的是当前元素的位置。 遍历整个…

Ubuntu 下统计文件数量的命令

参考:https://blog.csdn.net/kxh123456/article/details/123811580 查看当前目录下的文件数量(不包含子目录中的文件) ls -l|grep "^-"| wc -l实例展示:如下图所示,当前路径下,有2个json文件和2个文件夹&a…

CMC学习系列 (1):EEG-EMG相干性均局限于对侧,同侧无显著相干性

CMC学习系列:EEG-EMG相干性均局限于对侧,同侧无显著相干性 0. 引言1. 主要贡献2. 方法和结果2.1 EEG-EMG相干谱2.2 EEG-EMG相干性地形图2.3 3种任务受影响侧与未受影响侧的一致性比较 3. 讨论和结论4. 总结欢迎来稿 论文地址:https://www.ahajournals.or…

函数进阶-Python

师从黑马程序员 函数中多个返回值的接收 def test_return():return 1,"hello",3x,y,ztest_return() print(x) print(y) print(z) 多种参数的使用 函数参数种类 位置参数 关键字参数 def user_info(name,age,gender):print(f"姓名是{name},年龄是:{age},性别是…

SublimtText修改远程机器文件

Sublime Text 本身并不强大,但是它方便使用插件扩展功能,所以变得很强大。今天介绍一个很实用的插件 SFTP ,可以大大提高前端工作效率。 SFTP 安装 1. 打开 Sublime Text 2. 快捷键 shift ctrl p 键,呼出面板 3. 使用 Packag…

【深度学习】最强算法模型之:潜在狄利克雷分配(LDA)

潜在狄利克雷分配 1、引言2、潜在狄利克雷分配2.1 定义2.2 原理2.3 算法公式2.4 代码示例 3、总结 1、引言 小屌丝:鱼哥, 给我讲一讲LDA 小鱼:LDA? 你指的是? 小屌丝:就是算法模型的LDA啊, 你…

【linux深入剖析】基础IO操作 | 使用Linux库函数实现读写操作 | 文件相关系统调用接口

🍁你好,我是 RO-BERRY 📗 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 🎄感谢你的陪伴与支持 ,故事既有了开头,就要画上一个完美的句号,让我们一起加油 目录 前言1.复习C文件IO相关操…

双亲委派机制总结

回顾了一下双亲委派机制,在这记录记录,下一篇会基于打破双亲委派机制来更新 1. 类加载: 多个java文件经过编译打包后生成可运行jar包,最后启动程序。首先需要通过类加载器把主类加载到JVM。主类在运行过程中如果使用到其他类&a…

【Python】搭建 Python 环境

目 录 一.安装 Python二.安装 PyCharm 要想能够进行 Python 开发,就需要搭建好 Python 的环境 需要安装的环境主要是两个部分: 运行环境: Python开发环境: PyCharm 一.安装 Python (1) 找到官方网站 (2) 找到下载页面 选择 “Download for Windows”…