在基于模型设计的开发过程中,一定要拿正确的模型去生成代码。
有人要问:什么样的模型才算得上正确的模型?
我认为:
至少,正确的模型应该是经过充分验证的。
除了“充分验证”,还应该满足什么条件呢?
我能想到的就是“可验证”。
“可验证”也是充分验证的前提。
模型的“可验证”以后会专门介绍,本文就说说模型中代码生成之前可以做哪些验证。按照模型是否需要运行来划分,可以把验证分为静态验证和动态验证两大类。
M静态验证
静态验证有评审、静态检查、形式化验证等方式。
评审是质量体系要求的
通常我们模型画完之后,需要通过评审的方式去评审模型是否实现了相应的需求。那么,评审发生的时刻应该如何把握?是否在画完模型之后紧跟着就去做评审呢?我个人认为,如果有工具可以帮我们实现静态检查,我们为什么不先做静态检查呢?先做静态检查的好处是把可以通过工具发现的软件缺陷在评审之前消除掉,这样可以避免在评审的时候在此类问题上浪费时间。
静态检查
目前MATLAB通过Simulink Verification & Validation(以下简称SLVnV)提供了Model Advisor,可以实现建模标准的静态检查,实现起来也不困难,并且工具还具有可定制功能,可以在SLVnV提供的诸多检查项里挑选适合自己开发团队的检查集,也有可能有一些检查是Model Advisor没有提供的,这种情况下,也可以通过编写MATLAB程序的方式定制检查项。
形式化验证
MATLAB提供了Simulink Design Verifier(以下简称SLDV)产品,可以对模型进行形式化验证。SLDV可以检查模型中是否有整数溢出,或者是否有死逻辑。这两类错误都是很容易被评审和功能测试错过的错误,其实,软件里一旦发现有这两类错误,复现或者定位这两类错误都非常困难,而SLDV可以通过分析模型的给出发生或者可能发生错误的环节。另外,需要注意的是,在模型评审或者功能测试过程中,我们都可能发现一些软件缺陷,发现这些缺陷之后,我们需要修改模型,模型经过修改可能会再次引入数据溢出或者死逻辑之类的错误,所以建议做功能测试之后,再次使用SLDV检查一下模型。
M动态验证
动态验证主要有功能测试。功能测试可以分为单元级功能测试和集成级功能测试两个阶段。如果系统比较大,集成级功能测试还会继续划分为组件级集成测试和系统级集成测试。
单元级功能测试
也就是我们经常提到的单元测试,单元测试的测试用例需要用户根据需求编写,写完测试用例就是执行测试过程,测试过程的执行要尽量自动化。这个阶段的测试工作量非常大,通常花在单元测试上的时间会明显大于建模的时间,这往往是很多开发者难以接受的,很多人从心理上没有这个准备,一般认为模型画完就接近大功告成,所以不会计划很多时间在模型测试上,这个想法是非常危险的。当然,这个阶段的测试是否完善可以通过“测试覆盖率”这个数据来把握。覆盖率没有达到预定的目标就要继续增加测试用例。
测试覆盖率应该从两个层面去度量:
一需求覆盖率,测试用例所覆盖的需求比例;
一结构覆盖率,测试用例所覆盖的软件实现的分支。
对于工具,Simulink只能从结构上度量哪些分支测过哪些分支没测过,需求覆盖率通常需要测试者自己去把握。对于结构覆盖率,我们有条件覆盖(Condition Coverage)、判定覆盖(Decision Coverage)、MC/DC覆盖等。
集成级功能测试
集成测试的目的和单元测试是不同的,集成测试要求做单元测试结束之后才可以进行。集成测试主要测试不同单元模块之间从接口上、调度上是否有问题,有时候集成测试也可以发现不同单元模块之间需求上的冲突。集成测试不会有结构覆盖率要求。
集成测试的实现方式有模型上的集成测试,也可能会结合硬件进行测试,比如我们经常提到的快速原型,是否要结合硬件要取决于是否有条件和是否有必要这样做,这里不做展开。
到此,如果模型经过了各种静态验证,再经过足够的动态验证,我们可以认为模型已经正确了吧?
接下来,就可以对正确的模型进行代码生成工作了。
当然,上述验证活动都是建立在“模型可验证”的基础上的,模型的“可验证”如何去把握,这我们后面再专门讨论。
全部0条评论
快来发表一下你的评论吧 !