- 嵌入式
- 系统编程
【免费下载链接】fprime
F´ - A flight software and embedded systems framework
导读
Svc::DpManager是 F´ 飞行软件框架中的活动组件(active component),负责为各客户组件统一管理数据产品(data product)缓冲区:既支持同步"取缓冲区",也支持异步"请求缓冲区",并将填充完成的数据产品转发给下游处理组件。本文以 Svc/DpManager/test/ut/README.md 为骨架,完整解析该组件单元测试的设计:从抽象状态(Abstract State)与规则组(Rule Groups)的建模,到DpManagerTester/TestState的类层次、规则类的宏生成机制,再到 10000 步随机场景测试的编排方式。读完本文,你将掌握 F´ 官方组件测试中基于STest规则引擎的"规则-状态-断言"测试方法论,并能将同一套模式复用于自己组件的单元测试开发。
1. 测试对象与文档定位
本文所述的单元测试位于 Svc/DpManager/test/ut/,其目录结构如下:
Svc/DpManager/test/ut/ ├── README.md # 本文主体:测试设计文档 ├── AbstractState.hpp # 抽象状态定义 ├── DpManagerTestMain.cpp # gtest 测试入口 ├── DpManagerTester.cpp # 测试装置(harness)实现 ├── DpManagerTester.hpp # 测试装置头文件 ├── Rules/ # 各规则组及测试器 ├── Scenarios/ # 随机场景测试器 └── TestState/ # 测试状态(规则前置条件与动作实现)被测试组件Svc::DpManager的端口与接口定义在 Svc/DpManager/DpManager.fpp 中,实现在 Svc/DpManager/DpManager.cpp 中。整个测试体系建立在 F´ 的STest(Scenario Testing)框架之上,测试文档的定位不是罗列断言,而是用"抽象状态 + 规则 + 场景"三层模型来描述被测系统行为——这与传统的"写死输入-期望输出"式单元测试有本质区别:规则带有前置条件(precondition),场景由测试器(Tester)随机挑选可执行的规则逐步推进,最终以状态机的方式覆盖系统全部合法行为路径。
2. 抽象状态(Abstract State)
2.1 状态类型:BufferGetStatus
测试装置中用于模拟缓冲区获取结果的枚举类型:
BufferGetStatus:测试装置中bufferGet响应状态,取值为VALID(缓冲区可用)或INVALID(缓冲区不可用)。
该枚举定义于 Svc/DpManager/test/ut/AbstractState.hpp:
enum class BufferGetStatus { VALID, //! Valid INVALID //! Invalid };它模拟的是上游 Buffer Manager(缓冲区管理器)对bufferGetOut端口调用的两种可能响应,是驱动被测组件成功/失败两条分支的关键开关。
2.2 状态变量
抽象状态的全部变量及初始值如下表(与文档一致,并标注源码出处):
| 变量 | 类型 | 描述 | 初始值 |
|---|---|---|---|
bufferGetStatus | BufferGetStatus | 缓冲区获取状态 | VALID |
bufferSize | Option<FwSizeType> | 当前缓冲区大小 | none(缺省时由随机数生成器决定) |
NumSuccessfulAllocations | OnChangeChannel<U32> | 成功分配缓冲区次数 | 0 |
NumFailedAllocations | OnChangeChannel<U32> | 失败分配缓冲区次数 | 0 |
NumDataProducts | OnChangeChannel<U32> | 已处理的数据产品数量 | 0 |
NumBytes | OnChangeChannel<U64> | 已处理的字节数 | 0 |
bufferGetOutPortNumOpt | Option<FwIndexType> | 最近一次使用bufferGetOut的端口号,在from_bufferGetOut端口处理函数中更新 | none |
productResponseOutPortNumOpt | Option<FwIndexType> | 最近一次使用productResponseOut的端口号,在from_productResponseOut处理函数中更新 | none |
productSendOutPortNumOpt | Option<FwIndexType> | 最近一次使用productSendOut的端口号,在from_productSendOut处理函数中更新 | none |
bufferAllocationFailedEventCount | FwSizeType | 自上次节流(throttle)清除以来缓冲区分配失败事件的发生次数 | 0 |
几个值得注意的设计细节(均可从源码印证):
Option<T>语义:bufferSize、三个*PortNumOpt均使用TestUtils::Option<T>(见 TestUtils/Option.hpp)。bufferSize为none时,规则动作中会通过STest::Pick::lowerUpper(MIN_BUFFER_SIZE, MAX_BUFFER_SIZE)在最小/最大边界之间随机取值;端口号记录为none意味着"尚未发生过该端口的调用",用作断言前置条件。- 边界常量:AbstractState.hpp 中定义了
MIN_BUFFER_SIZE = 1与MAX_BUFFER_SIZE = 1024,每个测试用例都会在最小与最大缓冲区大小两个边界上各执行一遍规则,覆盖缓冲区尺寸的极端情况。 OnChangeChannel语义:NumSuccessfulAllocations等四个变量是TestUtils::OnChangeChannel<U32/U64>类型。DpManagerTester::checkTelemetry()(DpManagerTester.cpp)在schedIn::OK规则动作中被调用:它会比较通道值的"变化前后"状态,仅当值发生变化时才断言遥测(telemetry)更新一次,否则断言无遥测发出。这精确对应 DpManager.fpp 中四条遥测通道的update on change语义。- 缓冲数据区:
AbstractState还内置了U8 bufferData[MAX_BUFFER_SIZE]数组(见 AbstractState.hpp),当bufferGetStatus == VALID时,from_bufferGetOut_handler会将该数组作为缓冲区数据指针返回,并校验size <= MAX_BUFFER_SIZE(见 DpManagerTester.cpp),构造出一个合法的Fw::Buffer;当状态为INVALID时则原样返回一个无效缓冲区,从而模拟分配失败。
3. 规则组(Rule Groups)
测试文档将全部测试行为划分为 6 个规则组,每个规则组负责驱动被测组件的一个端口或命令。下面逐一展开,并结合 DpManager.cpp 的实现说明断言背后的业务逻辑。
3.1 BufferGetStatus(辅助规则组)
该规则组管理测试装置中的缓冲区获取状态,是两个"辅助规则"(helper rule),不直接验证需求,而是为其他规则组构造前置条件。
3.1.1 Valid
将缓冲区获取状态置为VALID,模拟"缓冲区可用"的系统状态。
- 前置条件:
bufferGetStatus != VALID - 动作:
bufferGetStatus = VALID - 测试序列:① 应用规则
BufferGetStatus::Invalid;② 应用规则BufferGetStatus::Valid - 验证的需求:无(辅助规则)
3.1.2 Invalid
将缓冲区获取状态置为INVALID,模拟"无缓冲区可用"的系统状态。
- 前置条件:
bufferGetStatus != INVALID - 动作:
bufferGetStatus = INVALID - 测试序列:应用规则
BufferGetStatus::Invalid - 验证的需求:无(辅助规则)
两条规则互相把对方设为前置条件,保证状态迁移只能严格交替进行,符合状态机建模的规范。
3.2 ProductGetIn(同步取缓冲区)
该规则组向productGetIn端口发送测试输入。productGetIn是同步输入端口,类型为[DpManagerNumPorts] Fw.DpGet(见 DpManager.fpp)。被测组件在 DpManager.cpp 中的处理逻辑为:
Fw::Success DpManager::productGetIn_handler(const NATIVE_INT_TYPE portNum, FwDpIdType id, FwSizeType size, Fw::Buffer& buffer) { return this->getBuffer(portNum, id, size, buffer); }即直接委托私有辅助函数getBuffer,同步返回Fw::Success状态并把缓冲区填入调用方传入的引用。getBuffer的核心逻辑(DpManager.cpp):
Fw::Success DpManager::getBuffer(FwIndexType portNum, FwDpIdType id, FwSizeType size, Fw::Buffer& buffer) { Fw::Success status(Fw::Success::FAILURE); buffer = this->bufferGetOut_out(portNum, static_cast<U32>(size)); if (buffer.isValid()) { ++this->numSuccessfulAllocations; status = Fw::Success::SUCCESS; } else { ++this->numFailedAllocations; this->log_WARNING_HI_BufferAllocationFailed(id); } return status; }3.2.1 BufferInvalid(分配失败路径)
在测试装置返回无效缓冲区的状态下调用productGetIn。
- 前置条件:
bufferGetStatus == INVALID - 动作(逐条对照实现):
- 清空历史记录;
- 令S为
bufferSize(若为none则取随机值),以随机端口号N、随机容器 IDI、大小S调用productGetIn; - 断言调用返回状态为
FAILURE; - 事件节流断言:若
bufferAllocationFailedEventCount < DpManagerComponentBase::EVENTID_BUFFERALLOCATIONFAILED_THROTTLE,则断言事件历史仅含 1 条、BufferAllocationFailed事件历史仅含 1 条且索引 0 处携带容器 IDI,然后将计数加 1;否则断言事件历史为空——这正是throttle 10节流语义(见 DpManager.fpp)的测试体现:事件只在前 10 次失败时上报; - 递增
NumFailedAllocations; - 断言 from 端口历史含 1 项、
bufferGetOut历史含 1 项且索引 0 处大小为S; - 断言
bufferGetOutPortNumOpt为N(即被调用的是测试所选的端口号)。
- 测试序列:① 应用
BufferGetStatus::Invalid;② 设置bufferSize = MIN_BUFFER_SIZE;③ 应用ProductGetIn::BufferInvalid;④ 应用SchedIn::OK;⑤ 设置bufferSize = MAX_BUFFER_SIZE;⑥ 应用ProductGetIn::BufferInvalid;⑦ 应用SchedIn::OK - 验证的需求:
SVC-DPMANAGER-001、SVC-DPMANAGER-004
注意:SchedIn::OK在每次规则执行后被应用,目的是触发遥测输出并校验计数通道的更新。
3.2.2 BufferValid(成功分配路径)
在测试装置返回有效缓冲区的状态下调用productRequestIn(文档原文如此,端口语义为productGetIn的成功分支)。
- 前置条件:
bufferGetStatus == VALID - 动作:
- 清空历史;
- 以随机端口号N、随机 IDI、大小S调用
productRequestIn; - 断言返回状态为
SUCCESS; - 断言事件历史为空(成功路径不产生事件);
- 递增
NumSuccessfulAllocations; - 断言 from 端口历史含 1 项、
bufferGetOut历史含 1 项且索引 0 处大小为S; - 断言
bufferGetOutPortNumOpt为N。
- 测试序列:① 设置
bufferSize = MIN_BUFFER_SIZE;② 应用ProductGetIn::BufferValid;③ 应用SchedIn::OK;④ 设置bufferSize = MAX_BUFFER_SIZE;⑤ 应用ProductGetIn::BufferValid;⑥ 应用SchedIn::OK - 验证的需求:
SVC-DPMANAGER-001、SVC-DP-MANAGER-004
3.3 ProductRequestIn(异步请求缓冲区)
该规则组向异步输入端口productRequestIn(类型[DpManagerNumPorts] Fw.DpRequest)发送请求。与同步路径不同,异步路径不直接返回缓冲区,而是通过productResponseOut输出端口把(id, buffer, status)回送给客户组件,见 DpManager.cpp:
void DpManager::productRequestIn_handler(const NATIVE_INT_TYPE portNum, FwDpIdType id, FwSizeType size) { Fw::Buffer buffer; const Fw::Success status = this->getBuffer(portNum, id, size, buffer); this->productResponseOut_out(portNum, id, buffer, status); }因此该规则组的断言数量比ProductGetIn多:除了bufferGetOut历史外,还必须验证productResponseOut历史及对应端口号。
3.3.1 BufferInvalid(分配失败路径)
- 前置条件:
bufferGetStatus == INVALID - 动作:
- 清空历史;
- 以随机端口号N、随机 IDI、大小S调用
productRequestIn; - 事件节流断言:若
bufferAllocationFailedEventCount < EVENTID_BUFFERALLOCATIONFAILED_THROTTLE,则断言事件历史为 1 条且BufferAllocationFailed历史索引 0 处含I,并递增计数;否则断言事件历史为空; - 递增
NumFailedAllocations; - 断言 from 端口历史含2 项(
bufferGetOut与productResponseOut各一项); - 断言
bufferGetOut历史含 1 项、索引 0 处大小为S,且bufferGetOutPortNumOpt为N; - 断言
productResponseOut历史含 1 项,索引 0 处为预期的无效缓冲区及状态FAILURE,且productResponseOutPortNumOpt为N。
- 测试序列:① 应用
BufferGetStatus::Invalid;② 设置bufferSize = MIN_BUFFER_SIZE;③ 应用ProductRequestIn::BufferInvalid;④ 应用SchedIn::OK;⑤ 设置bufferSize = MAX_BUFFER_SIZE;⑥ 应用ProductRequestIn::BufferInvalid;⑦ 应用SchedIn::OK - 验证的需求:
SVC-DPMANAGER-002、SVC-DPMANAGER-004
3.3.2 BufferValid(成功分配路径)
- 前置条件:
bufferGetStatus == VALID - 动作:
- 清空历史;
- 以随机端口号N、随机 IDI、大小S调用
productRequestIn; - 断言事件历史为空;
- 递增
NumSuccessfulAllocations; - 断言 from 端口历史含 2 项;
- 断言
bufferGetOut历史含 1 项、索引 0 处大小为S,bufferGetOutPortNumOpt为N; - 断言
productResponseOut历史含 1 项、索引 0 处为预期的有效缓冲区及状态SUCCESS,productResponseOutPortNumOpt为N。
- 测试序列:① 设置
bufferSize = MIN_BUFFER_SIZE;② 应用ProductRequestIn::BufferValid;③ 应用SchedIn::OK;④ 设置bufferSize = MAX_BUFFER_SIZE;⑤ 应用ProductRequestIn::BufferValid;⑥ 应用SchedIn::OK - 验证的需求:
SVC-DPMANAGER-002、SVC-DP-MANAGER-004
3.4 ProductSendIn(转发数据产品)
该规则组向异步输入端口productSendIn(类型[DpManagerNumPorts] Fw.DpSend)发送"已填充的数据产品缓冲区"。组件逻辑(DpManager.cpp)只做透传:更新统计变量后将缓冲区原样转发到productSendOut(类型Fw.BufferSend),供下游如Svc::BufferAccumulator、Svc::DpWriter等处理。
3.4.1 OK
- 前置条件:
true(无状态限制) - 动作:
- 清空历史;
- 令S为
bufferSize(或随机值),以随机端口号N、随机 IDI、大小为S的缓冲区B调用productSendIn; - 断言事件历史为空(转发是静默操作);
- 递增
NumDataProducts(文档原文写作NumDataBroducts,实际对应 DpManager.fpp 中的遥测通道NumDataProducts); - 按B的大小增加
NumBytes; - 断言 from 端口历史含 1 项、
productSendOut历史含 1 项且索引 0 处为B; - 断言
productSendOutPortNumOpt为N。
- 测试序列:① 设置
bufferSize = MIN_BUFFER_SIZE;② 应用ProductSendIn::OK;③ 应用SchedIn::OK;④ 设置bufferSize = MAX_BUFFER_SIZE;⑤ 应用ProductSendIn::OK;⑥ 应用SchedIn::OK - 验证的需求:
SVC-DPMANAGER-003、SVC-DPMANAGER-004
3.5 SchedIn(调度与遥测)
该规则组向schedIn端口(Svc.Sched)发送调度输入。组件实现(DpManager.cpp)将四个内部计数通过tlmWrite_*逐条写为遥测——这是唯一产生遥测的时机,因此被作为"遥测检查点"插入到几乎所有其他规则之后。
3.5.1 OK
- 前置条件:
true - 动作:
- 清空历史;
- 以随机 context 调用
schedIn; - 检查遥测(即前文所述
checkTelemetry():基于OnChangeChannel的前后值比较,断言"变化即上报、不变即静默")。
- 测试序列:应用规则
SchedIn::OK - 验证的需求:
SVC-DPMANAGER-004
3.6 CLEAR_EVENT_THROTTLE(清除事件节流)
该规则组测试CLEAR_EVENT_THROTTLE命令(opcode 0x00,见 DpManager.fpp)。组件实现(DpManager.cpp)调用自动生成的节流清除函数并回送命令成功响应:
void DpManager::CLEAR_EVENT_THROTTLE_cmdHandler(FwOpcodeType opCode, U32 cmdSeq) { this->log_WARNING_HI_BufferAllocationFailed_ThrottleClear(); this->cmdResponse_out(opCode, cmdSeq, Fw::CmdResponse::OK); }3.6.1 OK
- 前置条件:
true - 动作:
- 清空历史;
- 发送命令
CLEAR_EVENT_THROTTLE; - 检查命令响应(应为
OK); - 断言
DpManagerComponentBase::m_BufferAllocationFailedThrottle == 0(节流计数被清零); - 将抽象状态中的
bufferAllocationFailedEventCount置 0(与组件内部计数保持同步)。
- 测试序列(验证节流与清除的完整闭环):
- 应用
BufferGetStatus::Invalid; - 应用
ProductRequestIn::BufferInvalid共EVENTID_BUFFERALLOCATIONFAILED_THROTTLE + 1次(此时第 11 次失败起事件已被抑制); - 应用
CLEAR_EVENT_THROTTLE::OK(节流计数归零); - 再次应用
ProductRequestIn::BufferInvalid(节流解除后事件应重新开始上报)。
- 应用
- 验证的需求:
SVC-DPMANAGER-006
4. 测试实现架构(Implementation)
文档第三部分揭示了这套测试的工程组织方式:被测组件、抽象状态、规则逻辑与测试器分别封装在不同类中,大量模板代码通过宏展开生成,手写代码只保留"规则语义"本身。
4.1 DpManagerTester 与 TestState
DpManagerTester派生自自动生成的DpManagerGTestBase,持有抽象状态abstractState与被测组件component(见 DpManagerTester.hpp)。关键配置常量(DpManagerTester.hpp):
MAX_HISTORY_SIZE = 10:事件/遥测/端口输出历史的最大容量;TEST_INSTANCE_ID = 0:被测组件实例 ID;TEST_INSTANCE_QUEUE_DEPTH = 10:活动组件消息队列深度。
TestState是DpManagerTester的派生类,规则的前置条件与动作都在TestState中实现,以便使用DpManagerGTestBase提供的函数与断言宏。其头文件是样板代码,通过宏TEST_STATE_DEF_RULE(GROUP_NAME, RULE_NAME)批量声明规则函数(见 TestState/TestState.hpp):
#define TEST_STATE_DEF_RULE(GROUP_NAME, RULE_NAME) \ bool precondition__##GROUP_NAME##__##RULE_NAME() const; \ void action__##GROUP_NAME##__##RULE_NAME();而TestState的函数定义则完全手写,逐条编码第 3 节描述的规则前置条件与动作。
(上图为BufferGetStatus规则组的前置条件与动作示意,继承链为DpManagerGTestBase → DpManagerTester → TestState。)
4.2 Rules 类
每个规则是一个派生自STest::Rule<TestState>的类,同样是宏展开生成的样板代码;其precondition(state)与action(state)只是转调TestState中对应的precondition__GROUP__RULE()与action__GROUP__RULE()手写函数。规则类头文件示例见 Rules/BufferGetStatus.hpp,Rules.hpp汇总全部规则。
4.3 规则组测试器(Rule Group Testers)
每个规则组对应一个 Tester(见 Rules/Testers.hpp,内含BufferGetStatus、CLEAR_EVENT_THROTTLE、ProductGetIn、ProductRequestIn、ProductSendIn、SchedIn六个 Tester)。每个 Tester 定义本组规则、创建一个TestState,并为每条规则提供一个测试场景(test scenario)。以BufferGetStatus组为例:
4.4 随机场景测试器(Random Scenario Tester)
随机场景测试器将所有规则实例化并组合成随机场景(Scenarios/Random.cpp):
Rules::BufferGetStatus::Invalid bufferGetStatusInvalid; Rules::BufferGetStatus::Valid bufferGetStatusValid; Rules::CLEAR_EVENT_THROTTLE::OK clearEventThrottleOK; Rules::ProductRequestIn::BufferInvalid productRequestInBufferInvalid; Rules::ProductRequestIn::BufferValid productRequestInBufferValid; Rules::ProductSendIn::OK productSendInOK; Rules::SchedIn::OK schedInOK; void Tester::run(FwSizeType maxNumSteps) { STest::Rule<TestState>* rules[] = { ... }; // 上述 7 条规则 STest::RandomScenario<TestState> scenario("RandomScenario", rules, ...); STest::BoundedScenario<TestState> boundedScenario("BoundedRandomScenario", scenario, maxNumSteps); const U32 numSteps = boundedScenario.run(this->testState); printf("Ran %u steps.\n", numSteps); }它使用STest::RandomScenario与STest::BoundedScenario的组合:每一步从全部规则中挑选前置条件为真的规则随机执行,直至达到步数上限。Scenarios::Random::Tester只暴露run(maxNumSteps)接口,私有持有TestState。
5. 测试用例清单与需求追溯
测试入口 DpManagerTestMain.cpp 将上述规则映射为 9 个 gtest 用例,并通过REQUIREMENT("SVC-DPMANAGER-XXX")宏建立需求追溯:
| gtest 用例 | 场景 | 追溯需求 |
|---|---|---|
BufferGetStatus.Invalid/.Valid | 辅助规则单独验证 | 无 |
ProductGetIn.BufferInvalid/.BufferValid | 同步取缓冲区(失败/成功) | SVC-DPMANAGER-001、SVC-DPMANAGER-004 |
ProductRequestIn.BufferInvalid/.BufferValid | 异步请求缓冲区(失败/成功) | SVC-DPMANAGER-002、SVC-DPMANAGER-004 |
ProductSendIn.OK | 转发数据产品 | SVC-DPMANAGER-003、SVC-DPMANAGER-004 |
SchedIn.OK | 调度与遥测 | SVC-DPMANAGER-004 |
CLEAR_EVENT_THROTTLE.OK | 清除事件节流 | SVC-DPMANAGER-006 |
Scenarios.Random | 7 条规则随机组合,10000 步 | SVC-DPMANAGER-002/003/004 |
对应组件的正式需求(详见 Svc/DpManager/docs/sdd.md):
| 需求编号 | 描述 | 验证方法 |
|---|---|---|
SVC-DPMANAGER-001 | 提供同步请求并接收数据产品缓冲区的端口数组 | 单元测试 |
SVC-DPMANAGER-002 | 提供接收并异步响应数据产品缓冲区请求的端口数组 | 单元测试 |
SVC-DPMANAGER-003 | 接收数据产品缓冲区并转发供进一步处理 | 单元测试 |
SVC-DPMANAGER-004 | 提供成功分配数、失败分配数与处理数据量的遥测 | 单元测试 |
SVC-DPMANAGER-006 | (经测试追溯)清除事件节流的能力 | 单元测试 |
main函数在初始化 gtest 后调用STest::Random::seed()为随机场景设置随机种子(DpManagerTestMain.cpp),使随机场景在每次运行时有不同的执行轨迹。该测试可通过 F´ 标准的单元测试构建流程运行(如fprime-util build --ut后执行生成的测试二进制),也可以直接以 gtest 入口编译运行。
6. 从测试反观组件设计:端口连通与状态机闭环
最后,将测试装置与组件实现对照,可以清晰还原 DpManager 的运行时行为,这也是理解该测试文档价值的关键:
- 三端口联动:
from_bufferGetOut_handler、from_productResponseOut_handler、from_productSendOut_handler三个 from 端口处理函数(DpManagerTester.cpp)分别模拟上游 Buffer Manager 与下游消费者的响应,并把实际调用的端口号记录到抽象状态,供断言核对——这保证测试不仅验证"数据正确",还验证"调用发生在预期的端口上"。 - 节流机制的完整闭环:
BufferAllocationFailed事件在 DpManager.fpp 中声明为severity warning high且throttle 10,即每 10 次失败才上报 1 次。测试通过"失败 11 次 → 断言事件被抑制 → 发送CLEAR_EVENT_THROTTLE→ 再失败 1 次 → 断言事件恢复"的序列,验证了组件级节流与命令级清除的联动正确性。 - 端口数组规模:所有业务端口均为
[DpManagerNumPorts]数组,该常量在 config/AcConstants.fpp 中配置为 5,即单个DpManager实例可同时支持 5 组客户-缓冲区连接;测试用随机端口号N验证了端口选择逻辑(见 Svc/DpManager/docs/sdd.md 第 5.1 节的拓扑示例)。
7. 总结
Svc::DpManager的单元测试是 F´ 框架内"基于 STest 规则引擎的组件级测试"的典型范本,其设计可以概括为四个层次:
- 抽象状态层(
AbstractState):用枚举 +Option/OnChangeChannel精确建模被测系统的可观状态; - 规则层(
Rules+TestState):前置条件约束规则的合法触发时机,动作编码"调用 + 断言历史/事件/遥测 + 更新计数"的完整验证逻辑; - 场景层(
Tester):每个规则组提供确定性测试场景,Random::Tester则把所有规则组合为可复现的随机漫步; - 追溯层:
REQUIREMENT宏把每个用例映射到SVC-DPMANAGER-00X需求,形成可审计的验证闭环。
这套模式不仅覆盖了 DpManager 全部端口(productGetIn、productRequestIn、productSendIn、schedIn)、命令(CLEAR_EVENT_THROTTLE)、事件(BufferAllocationFailed)与遥测(四条通道)的成败路径与边界条件(最小/最大缓冲区),也为读者在自己的 F´ 组件上编写同等质量的测试提供了可直接照搬的工程模板。
- 嵌入式
- 系统编程
【免费下载链接】fprime
F´ - A flight software and embedded systems framework
相关推荐
F´ (F Prime) DpManager 组件基于规则的单元测试:Abstract State、规则组与随机场景解析
F´ F Prime DpManager 组件基于规则的单元测试:Abstract State、规则组与随机场景解析 导读 本文以 Svc/DpManager/
嵌入式系统编程F´ 组件测试框架 STest 完全指南:用规则与场景驱动的结构化单元测试
F´ 组件测试框架 STest 完全指南:用规则与场景驱动的结构化单元测试 导读 :STest 是 F´(F Prime)飞行软件与嵌入式系统框架内置的测试框架
嵌入式系统编程Svc::DpWriter 组件单元测试深度解析:基于 STest 规则引擎的数据产品落盘验证
Svc::DpWriter 组件单元测试深度解析:基于 STest 规则引擎的数据产品落盘验证 Svc::DpWriter 是 F´(F Prime)飞行软件框
嵌入式系统编程
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考