模块九:验证与确认
如何在 SysML v2 中建模验证用例、测试案例和确认活动,确保系统满足需求并符合利益相关者期望。
V&V 基础概念
验证(Verification)回答"我们是否正确地构建了系统?"——即系统是否满足其规格要求。确认(Validation)回答"我们是否构建了正确的系统?"——即系统是否满足利益相关者的实际需要。SysML v2 为这两者提供了一等公民的语言构件。
验证好比检查一栋房子是否按照建筑图纸施工——每面墙的尺寸、材料和位置是否与图纸一致。确认则是询问住户:"这栋房子住着舒服吗?满足你的生活需求吗?"前者对照规格,后者对照真实期望。
SysML v2 中的 V&V 关键字
SysML v2 引入了专门的关键字来建模验证与确认活动:
| 关键字 | 用途 | 说明 |
|---|---|---|
verification def | 定义验证用例模板 | 描述如何验证一个或多个需求的方法和步骤 |
verification | 验证用例实例 | 在具体上下文中执行验证活动 |
verify | 声明验证关系 | 将验证用例与被验证的需求关联 |
subject | 验证对象 | 指定被测系统或组件 |
objective | 验证目标 | 在验证用例中声明需要满足的约束 |
verification def 是 case def 的一种特化。验证用例本质上是一种带有明确目标(objective)的用例,其执行结果用于判断需求是否被满足。
验证用例
验证用例(verification def)定义了验证活动的模板——包括被测对象、验证步骤和预期结果。它是 SysML v2 中将需求与测试活动联系起来的核心构件。
定义验证用例
1 verification def VerifyMaxSpeed {
2 doc /* 验证系统是否满足最大速度需求 */
3
4 subject vehicle : Vehicle; // 被测对象
5
6 objective {
7 verify requirement MaxSpeedReq; // 验证目标需求
8 }
9
10 action setupTest : PrepareTestTrack; // 步骤一:准备测试环境
11 action runTest : AccelerateToMax; // 步骤二:执行加速测试
12 action measure : RecordSpeed; // 步骤三:记录速度数据
13
14 first setupTest then runTest then measure;
15 }
验证用例的组成部分
每个验证用例通常包含以下要素:
subject——被测试或被评估的系统/组件objective——验证用例要达成的目标,通常引用一个或多个需求- 动作序列——执行验证的具体步骤,使用
action和控制流组织 return——验证结果,通常为通过/失败的判定
验证用例可以嵌套。一个顶层验证用例可以包含多个子验证用例,每个子用例负责验证不同的需求方面。这种分解方式与动作的层次分解完全一致。
需求的验证关系
verify 关键字建立了验证用例与需求之间的可追溯关系。这是 V&V 活动中最关键的连接——它确保每个需求都有对应的验证方法,每个验证活动都有明确的目标需求。
基本验证关系
1 requirement def MaxSpeedReq {
2 doc /* 车辆最大速度不低于 200 km/h */
3 subject vehicle : Vehicle;
4 require constraint {
5 vehicle.maxSpeed >= 200 [km/h]
6 }
7 }
8
9 verification def VerifyMaxSpeed {
10 subject vehicle : Vehicle;
11 objective {
12 verify requirement MaxSpeedReq;
13 }
14 }
多需求验证
一个验证用例可以同时验证多个需求。在 objective 块中列出所有需要验证的需求:
1 verification def VerifyPerformance {
2 subject vehicle : Vehicle;
3 objective {
4 verify requirement MaxSpeedReq; // 最大速度
5 verify requirement AccelerationReq; // 加速性能
6 verify requirement BrakingDistReq; // 制动距离
7 }
8 }
不要将 verify 与 satisfy 混淆。satisfy 声明某个设计元素满足需求(设计层面的断言),而 verify 声明某个验证活动将检查需求是否被满足(测试层面的活动)。两者是互补的,不是替代关系。
验证矩阵的可追溯性
通过 verify 关系,工具可以自动生成需求验证追溯矩阵(RVTM)。该矩阵显示每个需求对应的验证方法,帮助识别未被覆盖的需求:
| 需求 | 验证用例 | 验证方法 | 状态 |
|---|---|---|---|
| MaxSpeedReq | VerifyMaxSpeed | 测试 | 已通过 |
| AccelerationReq | VerifyPerformance | 测试 | 待执行 |
| SafetyReq | VerifySafety | 分析 | 进行中 |
| EMCReq | — | — | 未覆盖 |
测试用例建模
验证用例的核心是测试用例——具体的测试步骤、输入数据、预期输出和判定标准。SysML v2 使用动作分解和约束来建模完整的测试流程。
带参数的测试用例
1 verification def VerifyBrakingDistance {
2 subject vehicle : Vehicle;
3
4 objective {
5 verify requirement BrakingDistReq;
6 }
7
8 // 测试输入参数
9 in attribute initialSpeed : ISQ::SpeedValue; // 初始速度
10 in attribute roadCondition : RoadSurface; // 路面条件
11
12 // 测试步骤
13 action accelerate : AccelerateToSpeed {
14 in attribute targetSpeed = initialSpeed;
15 }
16 action brake : EmergencyBrake;
17 action measureDist : MeasureStoppingDistance {
18 out attribute distance : ISQ::LengthValue;
19 }
20
21 first accelerate then brake then measureDist;
22
23 // 判定标准:制动距离不超过 38 米
24 assert constraint passcriterion {
25 measureDist.distance <= 38 [m]
26 }
27 }
测试数据的参数化
通过参数化设计,同一验证用例可以用不同的输入数据多次执行。这避免了为每个测试场景重复定义验证用例:
1 // 测试场景一:干燥路面,100 km/h
2 verification dryRoadTest : VerifyBrakingDistance {
3 in attribute initialSpeed = 100 [km/h];
4 in attribute roadCondition = RoadSurface::Dry;
5 }
6
7 // 测试场景二:湿滑路面,80 km/h
8 verification wetRoadTest : VerifyBrakingDistance {
9 in attribute initialSpeed = 80 [km/h];
10 in attribute roadCondition = RoadSurface::Wet;
11 }
验证用例中的 assert constraint 定义了通过/失败判定标准。工具在执行仿真或分析后,可以自动检查这些约束是否成立,从而实现自动化验证。
确认与利益相关者
确认关注的是系统是否满足利益相关者的真实需要,而不仅仅是技术规格。SysML v2 通过将利益相关者需求、用例和关注点集成到模型中来支持确认活动。
利益相关者与关注点
1 package Stakeholders {
2 part def Operator {
3 doc /* 系统操作员——关注易用性和响应时间 */
4 }
5 part def SafetyEngineer {
6 doc /* 安全工程师——关注故障模式和冗余 */
7 }
8 part def EndUser {
9 doc /* 最终用户——关注功能完整性和用户体验 */
10 }
11 }
利益相关者需求与确认活动
1 requirement def UsabilityReq {
2 doc /* 操作员应能在 30 秒内完成紧急操作 */
3 stakeholder operator : Operator;
4 subject sys : ControlSystem;
5 require constraint {
6 sys.emergencyResponseTime <= 30 [s]
7 }
8 }
9
10 // 确认活动:用户评审会
11 verification def ValidateUsability {
12 doc /* 通过用户测试确认操作流程满足可用性需求 */
13 subject sys : ControlSystem;
14
15 objective {
16 verify requirement UsabilityReq;
17 }
18
19 action briefOperator : BriefingSession; // 向操作员说明测试场景
20 action executeScenario : EmergencyScenario; // 执行紧急操作场景
21 action collectFeedback : UserFeedback; // 收集操作员反馈
22
23 first briefOperator then executeScenario then collectFeedback;
24 }
验证就像质检员拿着检测清单逐项检查产品是否合格。确认则是请客户实际试用产品,看它是否真正解决了客户的问题。质检通过的产品,客户未必满意;客户满意的产品,也未必通过了所有质检项目。两者都是不可或缺的。
自动化分析与仿真
SysML v2 的验证用例可以与分析用例(analysis)结合,实现基于模型的自动化验证。分析用例执行计算或仿真,验证用例利用其结果来判定需求是否被满足。
分析驱动的验证
1 analysis def ThermalAnalysis {
2 subject component : ElectronicModule;
3 in attribute ambientTemp : ISQ::TemperatureValue;
4 in attribute powerDissipation : ISQ::PowerValue;
5 return attribute maxJunctionTemp : ISQ::TemperatureValue;
6 }
7
8 verification def VerifyThermalLimit {
9 subject component : ElectronicModule;
10
11 objective {
12 verify requirement ThermalReq;
13 }
14
15 // 执行热分析
16 action runAnalysis : ThermalAnalysis {
17 in attribute ambientTemp = 40 [degC]; // 环境温度
18 in attribute powerDissipation = 15 [W]; // 功耗
19 }
20
21 // 判定:结温不超过 125 摄氏度
22 assert constraint {
23 runAnalysis.maxJunctionTemp <= 125 [degC]
24 }
25 }
验证方法分类
工程实践中,验证方法通常分为四类。SysML v2 模型可以用元数据标注每个验证用例所采用的方法:
| 验证方法 | 说明 | 适用场景 |
|---|---|---|
| 测试(Test) | 通过物理测试或仿真执行获取实测数据 | 性能指标、功能行为 |
| 分析(Analysis) | 通过数学计算、建模或仿真推导结果 | 热分析、结构强度、可靠性 |
| 检查(Inspection) | 通过目视检查或文档审查确认合规 | 外观、标签、文档完整性 |
| 演示(Demonstration) | 通过操作演示展示功能实现 | 人机界面、操作流程 |
1 // 使用元数据标注验证方法
2 metadata def VerificationMethod {
3 attribute method : MethodKind; // Test | Analysis | Inspection | Demonstration
4 }
5
6 @VerificationMethod { method = MethodKind::Analysis; }
7 verification def VerifyThermalLimit { /* ... */ }
将验证方法编码为元数据而非硬编码到验证用例结构中,可以在不修改验证逻辑的情况下灵活调整验证策略。工具可以利用这些元数据自动生成验证计划文档。
完整示例
以下示例展示了一个完整的 V&V 模型——从利益相关者需求出发,经过需求分解、验证用例设计、到测试执行和结果判定的完整链条。
1 package UAVVerification {
2 private import ISQ::*; private import SI::*;
3
4 // ── 需求定义 ────────────────────────────────────────
5 requirement def FlightEndurance {
6 doc /* 无人机续航时间不低于 45 分钟 */
7 subject uav : UAV;
8 require constraint {
9 uav.flightTime >= 45 [min]
10 }
11 }
12
13 requirement def PayloadCapacity {
14 doc /* 无人机有效载荷不低于 2 kg */
15 subject uav : UAV;
16 require constraint {
17 uav.maxPayload >= 2 [kg]
18 }
19 }
20
21 requirement def WindResistance {
22 doc /* 无人机可在 6 级风力下稳定飞行 */
23 subject uav : UAV;
24 require constraint {
25 uav.maxWindTolerance >= 39 [km/h]
26 }
27 }
28
29 // ── 分析用例 ────────────────────────────────────────
30 analysis def EnduranceAnalysis {
31 subject uav : UAV;
32 in attribute batteryCapacity : ISQ::EnergyValue;
33 in attribute avgPowerDraw : ISQ::PowerValue;
34 return attribute estFlightTime : ISQ::TimeValue;
35 // estFlightTime = batteryCapacity / avgPowerDraw
36 }
37
38 // ── 验证用例:续航验证(分析方法) ─────────────────
39 @VerificationMethod { method = MethodKind::Analysis; }
40 verification def VerifyEndurance {
41 subject uav : UAV;
42 objective {
43 verify requirement FlightEndurance;
44 }
45
46 action analyze : EnduranceAnalysis {
47 in attribute batteryCapacity = 500 [Wh];
48 in attribute avgPowerDraw = 350 [W];
49 }
50
51 assert constraint {
52 analyze.estFlightTime >= 45 [min]
53 }
54 }
55
56 // ── 验证用例:载荷验证(测试方法) ─────────────────
57 @VerificationMethod { method = MethodKind::Test; }
58 verification def VerifyPayload {
59 subject uav : UAV;
60 objective {
61 verify requirement PayloadCapacity;
62 }
63
64 action loadPayload : AttachPayload {
65 in attribute mass = 2 [kg]; // 加载 2 kg 载荷
66 }
67 action hover : StableHover {
68 in attribute duration = 5 [min]; // 悬停 5 分钟
69 }
70 action checkStability : MeasureFlightStability {
71 out attribute stable : Boolean;
72 }
73
74 first loadPayload then hover then checkStability;
75
76 assert constraint {
77 checkStability.stable == true
78 }
79 }
80
81 // ── 验证用例:抗风验证(演示方法) ─────────────────
82 @VerificationMethod { method = MethodKind::Demonstration; }
83 verification def VerifyWindResistance {
84 subject uav : UAV;
85 objective {
86 verify requirement WindResistance;
87 }
88
89 action flyInWind : WindTunnelFlight {
90 in attribute windSpeed = 39 [km/h];
91 out attribute posError : ISQ::LengthValue;
92 }
93
94 assert constraint {
95 flyInWind.posError <= 1.0 [m] // 位置偏差不超过 1 米
96 }
97 }
98
99 // ── 顶层验证计划 ────────────────────────────────────
100 verification def UAVVerificationPlan {
101 doc /* 无人机系统级验证计划 */
102 subject uav : UAV;
103
104 objective {
105 verify requirement FlightEndurance;
106 verify requirement PayloadCapacity;
107 verify requirement WindResistance;
108 }
109
110 // 子验证用例:可并行执行
111 verification endurance : VerifyEndurance;
112 verification payload : VerifyPayload;
113 verification wind : VerifyWindResistance;
114 }
115 }
此模型展示了:requirement def(需求定义与约束)、analysis def(分析用例计算续航)、verification def(分层验证用例结构)、verify(需求到验证的可追溯关系)、assert constraint(通过/失败判定)、元数据标注(验证方法分类),以及顶层验证计划(将多个子验证用例组合为系统级计划)。
本模块总结
| 概念 | 关键字 | 说明 |
|---|---|---|
| 验证用例定义 | verification def | 定义验证活动的模板,包含被测对象、目标和步骤 |
| 验证用例实例 | verification | 在具体上下文中实例化并执行验证活动 |
| 验证关系 | verify | 建立验证用例与需求之间的可追溯关系 |
| 验证对象 | subject | 指定被测试/被评估的系统或组件 |
| 验证目标 | objective | 声明验证用例要达成的目标,引用待验证需求 |
| 判定标准 | assert constraint | 定义通过/失败的判定条件 |
| 分析驱动验证 | analysis + verification | 分析用例提供计算结果,验证用例据此判定 |
| 验证方法标注 | metadata | 用元数据标注测试/分析/检查/演示方法 |
| 利益相关者需求 | stakeholder | 将需求关联到利益相关者,支持确认活动 |
| 验证计划 | 嵌套 verification | 将多个子验证用例组合为分层验证计划 |