ambroise-leclerc/SpecLab
GitHub: ambroise-leclerc/SpecLab
SpecLab 是一个专为医疗设备设计的现代化C++23模块化测试框架,旨在通过BDD语法和合规支持确保软件符合法规标准。
Stars: 11 | Forks: 4
# SpecLab - 医疗设备测试框架
[](https://en.cppreference.com/w/cpp/compiler_support)
[](https://cmake.org/)
[](LICENSE)
[](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++, 监管合规, 行为驱动开发, 跨平台开发, 软件合规, 软件测试, 集成测试, 需求可追溯性, 风险测试