ambroise-leclerc/SpecLab

GitHub: ambroise-leclerc/SpecLab

SpecLab 是一个专为医疗设备设计的现代化C++23模块化测试框架,旨在通过BDD语法和合规支持确保软件符合法规标准。

Stars: 11 | Forks: 4

# SpecLab - 医疗设备测试框架 [![支持C++23标准](https://img.shields.io/badge/C%2B%2B-23-blue.svg)](https://en.cppreference.com/w/cpp/compiler_support) [![使用CMake构建](https://img.shields.io/badge/CMake-4.0+-green.svg)](https://cmake.org/) [![查看许可证](https://img.shields.io/badge/License-EUPL--1.2-blue.svg)](LICENSE) [![符合医疗设备标准](https://img.shields.io/badge/Medical%20Device-IEC%2062304-red.svg)](https://www.iso.org/standard/64686.html) ⚠️ 实验性项目警告 本项目是对C++23模块在具有复杂依赖关系(Vulkan图形、医疗设备合规框架)的跨平台开发中可行性的早期实验性评估。它代表了尝试利用C++23和新兴的C++26安全演进进行医疗设备软件开发的探索。 当前状态: 一个专为医疗设备设计的现代化C++23模块化测试框架。SpecLab提供BDD(行为驱动开发)测试功能,通过结构化的测试执行、审计追踪和医疗设备特定功能,内置了对IEC 62304、ISO 13485和ISO 14971标准的合规性支持。 ## 为何选择SpecLab? 医疗设备软件需要严格的测试,并具备完整的可追溯性、风险管理和法规合规性。SpecLab填补了现代C++测试实践与医疗设备法规要求之间的鸿沟。 ### 主要特性 - ** 针对医疗设备设计**:内置IEC 62304、ISO 13485和ISO 14971合规支持 - ** BDD语法**:为利益相关者提供易读的Given-When-Then结构 - ** 需求可追溯性**:在需求与测试之间建立直接链接 - ** 现代C++23**:除`import std`外零依赖,完全支持模块化 - ** 安全关键**:为安全关键系统提供专门的断言 - ** 基于风险的测试**:自动风险分类和审计追踪 - ** 零宏**:无预处理器魔法的纯净C++23代码 - ** 函数式API**:基于Lambda的测试,无需类继承 ## 快速开始 ### 函数式BDD API(推荐) ``` import speclab; // Simple test with requirement traceability SpecLab::Requirement("SRS-001", "Patient monitor shall display vital signs within 2 seconds") .Test("DISPLAY_RESPONSE") .Given("Patient monitor is connected", []() { monitor.connect(); Assert::IsTrue(monitor.isConnected()); }) .When("Vital signs data is received", []() { monitor.receiveVitalSigns(mockPatientData); }) .Then("Display updates within 2 seconds", []() { Assert::IsTrue(monitor.isDisplaying()); Assert::LessThan(monitor.getResponseTime(), std::chrono::seconds(2)); }) .Execute(); // Safety-critical testing with automatic compliance SpecLab::Requirement("SRS-002", "Emergency stop shall halt all operations") .SafetyClass(SafetyClass::ClassC) .RiskLevel(RiskLevel::Critical) .Test("EMERGENCY_STOP") .Given("Device is operating normally", []() { device.startOperation(); }) .When("Emergency stop is activated", []() { device.emergencyStop(); }) .Then("All operations halt immediately", []() { Assert::IsFalse(device.isOperating()); }) .CriticalAssertion("System enters safe state", []() { return device.isSafeState(); }) .Execute(); ``` ### 医疗设备性能测试 ``` // Real-time performance requirements SpecLab::Requirement("SRS-003", "ECG processing shall complete within 100ms") .PerformanceRequirement(std::chrono::milliseconds(100)) .Test("ECG_PERFORMANCE") .Given("ECG data stream is active", []() { ecg.startStream(); ecg.loadTestData(standardPattern); }) .When("Signal processing is performed", []() { return [&]() { ecg.processSignal(); }; }) .Then("Processing completes within time limit", [](auto duration) { Assert::LessThan(duration, std::chrono::milliseconds(100)); }) .Benchmark(1000) // Statistical analysis over 1000 iterations .Execute(); ``` ## 安装 ### 前置条件 ### 构建说明 ``` # 克隆 repository git clone https://github.com/yourusername/speclab.git cd speclab # 配置 build mkdir build && cd build cmake .. -DSPECLAB_BUILD_EXAMPLES=ON -DSPECLAB_BUILD_TESTS=ON # 构建框架 cmake --build . # 运行测试 ctest # 安装(可选) cmake --install . ``` ### CMake集成 ``` find_package(SpecLab REQUIRED) target_link_libraries(your_target PRIVATE SpecLab::SpecLab) target_compile_features(your_target PRIVATE cxx_std_23) ``` ## 文档 ### 基本使用模式 #### 简单的基于函数的测试 ``` // Quick functional test SpecLab::Test("BASIC_001") .Given("System is initialized", []() { system.initialize(); }) .When("User requests status", []() { result = system.getStatus(); }) .Then("Status is returned successfully", []() { Assert::IsNotNull(result); Assert::AreEqual(result->code, StatusCode::OK); }) .Execute(); ``` #### 数据驱动测试 ``` // Parameterized testing for edge cases SpecLab::Requirement("SRS-004", "Temperature readings accurate within ±0.1°C") .Test("TEMP_ACCURACY") .Parameters({ {36.5, 36.4, 36.6}, // normal {35.0, 34.9, 35.1}, // hypothermia {38.0, 37.9, 38.1} // fever }) .Given("Calibrated sensor", [](auto params) { sensor.calibrate(); sensor.setActual(params[0]); }) .When("Temperature measured", [](auto params) { measured = sensor.read(); }) .Then("Within tolerance", [](auto params) { Assert::InRange(measured, params[1], params[2]); }) .Execute(); ``` #### 功能组织 ``` // Group related tests by medical device feature SpecLab::Feature("Patient Monitoring") .Description("Core vital signs monitoring functionality") .Requirement("SRS-100", "Monitor vital signs continuously") .Test("MONITOR_HEARTRATE") .Given("Heart rate sensor connected", []() { /* setup */ }) .When("Patient data collected", []() { /* action */ }) .Then("Heart rate recorded accurately", []() { /* verify */ }) .Test("MONITOR_BLOODPRESSURE") .Given("BP cuff properly positioned", []() { /* setup */ }) .When("Measurement cycle initiated", []() { /* action */ }) .Then("BP values within expected range", []() { /* verify */ }) .Execute(); ``` ### 医疗设备合规性 #### IEC 62304 软件生命周期 ``` // Software lifecycle process validation SpecLab::IEC62304Process(IEC62304::SystemTesting) .Requirement("SRS-008", "Software meets all requirements") .Test("LIFECYCLE_VALIDATION") .Given("Software build complete", []() { build.verify(); }) .When("Validation suite executed", []() { results = suite.executeValidation(); }) .Then("All requirements verified", []() { Assert::AreEqual(results.getPassRate(), 100.0); }) .TraceabilityMatrix([](auto& matrix) { matrix.verifyRequirementsCoverage(); }) .Execute(); ``` #### 风险管理(ISO 14971) ``` // Risk-based testing approach SpecLab::Requirement("SRS-005", "Alarm activates for critical values") .RiskAssessment("RISK_001", "False negative could endanger patient") .HazardId("HAZ_001") .Test("CRITICAL_ALARM") .Given("Monitor active", []() { monitor.activate(); }) .When("Critical threshold exceeded", []() { monitor.simulateCritical(HeartRate{200}); }) .Then("Alarm triggers within 1 second", []() { auto alarmTime = monitor.waitForAlarm(std::chrono::seconds(1)); Assert::IsTrue(alarmTime.has_value()); }) .MedicalAssertion("Patient safety maintained", []() { return monitor.isAlarmActive(); }) .Execute(); ``` ### 错误处理与恢复 #### 容错测试 ``` // Medical device fault tolerance SpecLab::Requirement("SRS-006", "Graceful sensor failure recovery") .FaultTolerance("sensor_failure") .Test("SENSOR_FAILOVER") .Given("All sensors operational", []() { system.enableAllSensors(); }) .When("Primary sensor fails", []() { system.simulateFailure(SensorType::HeartRate, 1); }) .Then("Backup sensor activated", []() { Assert::IsTrue(system.isUsingBackup(SensorType::HeartRate)); }) .And("Failure logged for maintenance", []() { auto logs = system.getMaintenanceLogs(); Assert::Contains(logs, "SENSOR_FAILURE"); }) .Execute(); ``` ## 架构 ### C++23 模块结构 ``` speclab/ ├── core/ │ ├── TestResult.cppm # Test execution results │ ├── TestCase.cppm # Base test implementations │ ├── TestSuite.cppm # Test suite management │ ├── Assertions.cppm # Assertion framework │ └── FunctionalAPI.cppm # New functional BDD API ├── medical/ │ ├── MedicalTestCase.cppm # Medical device test cases │ ├── ComplianceValidator.cppm # Regulatory compliance │ └── MedicalFunctionalAPI.cppm# Medical functional API ├── reporters/ │ ├── Reporter.cppm # Base reporter interface │ └── ConsoleReporter.cppm # Console output ├── runners/ │ └── TestRunner.cppm # Test execution engine └── SpecLab.cppm # Main framework interface ``` ### 关键设计原则 - **零依赖**:仅需`import std` - **医疗合规**:内置法规标准支持 - **线程安全**:适用于医疗设备环境 - **性能**:针对实时系统优化 - **可追溯性**:完整的合规审计追踪 - **安全第一**:关键故障处理与恢复 ## 测试理念 ### 测试类别 1. **单元测试**:组件级功能 2. **集成测试**:系统交互验证 3. **性能测试**:实时需求验证 4. **安全测试**:关键故障场景处理 5. **合规测试**:法规标准验证 ### 医疗设备测试模式 - **基于风险的优先级**:优先执行安全关键测试 - **可追溯性矩阵**:需求 ↔ 测试映射 - **审计追踪**:完整的测试执行历史 - **验证与确认**:独立的V&V流程 - **性能预算**:实时约束验证 ## 配置 ### CMake选项 - `SPECLAB_BUILD_EXAMPLES=ON` - 构建示例项目 - `SPECLAB_BUILD_TESTS=ON` - 构建框架测试 - `SPECLAB_ENABLE_COVERAGE=ON` - 启用代码覆盖率 - `SPECLAB_MEDICAL_COMPLIANCE=ON` - 启用合规特性(默认) ### 构建变体 - **Debug**:完整调试信息,启用断言 - **Release**:针对生产医疗设备优化 - **RelWithDebInfo**:带调试符号的发布优化 - **MinSizeRel**:为嵌入式系统最小化体积 ## 医疗设备标准 - **IEC 62304**:医疗设备软件生命周期过程 - **ISO 13485**:医疗器械质量管理体系 - **ISO 14971**:医疗器械风险管理 - **EU MDR**:医疗器械法规(2017/745) - **FDA 21 CFR Part 820**:质量体系法规 ### 开发环境设置 ``` # 安装 pre-commit 钩子 pip install pre-commit pre-commit install # 运行代码格式化 find . -name "*.cpp" -o -name "*.cppm" | xargs clang-format -i # 运行静态分析 clang-tidy -p build include/**/*.cppm ``` ## 许可证 本项目根据欧盟公共许可证v1.2获得许可 - 详情请参阅[LICENSE](LICENSE)文件。 ## 医疗设备声明 ## 路线图 - [x] 核心BDD函数式API - [x] IEC 62304合规特性 - [x] 基于风险的测试支持 - [ ] 可视化测试报告仪表板 - [ ] 与医疗设备模拟器集成 - [ ] 实时监控与警报 - [ ] 加密审计追踪签名 - [ ] 基于云端的合规性报告
标签:Bash脚本, BDD, C++23, CMake, IEC 62304, ISO 13485, ISO 14971, pocsuite3, 医疗设备, 医疗软件测试, 单元测试, 合规性测试, 安全关键系统, 实验性项目, 审计跟踪, 模块化编程, 测试框架, 现代C++, 监管合规, 行为驱动开发, 跨平台开发, 软件合规, 软件测试, 集成测试, 需求可追溯性, 风险测试