Unit Testing for Medical Device Software
Purpose
Establish patterns for unit tests that verify software units against requirements with safety-class-appropriate rigor.
When to Apply
- New or changed functions/modules, especially safety-related.
- Bug fixes to prevent regression.
Requirements (testable)
- Implement Units [Class A, B, C]: Implement each software unit per design. Rationale: 5.5.1.
- Verification Process [Class B, C]: Define strategies, methods, and procedures for unit verification; evaluate test procedure adequacy. Rationale: 5.5.2.
- Acceptance Criteria [Class B, C]: Define acceptance criteria before integration; confirm units meet criteria (requirements, interface consistency, coding standards). Rationale: 5.5.3.
- Class C Criteria [Class C]: Where design requires, add criteria for event sequencing, data/control flow, resource use, fault handling, initialization, diagnostics, memory behaviour, and boundary conditions. Rationale: 5.5.4 (engineering checklist).
- Execute and Record [Class B, C]: Perform unit verification and document results. Rationale: 5.5.5.
- Structure: Use Arrange-Act-Assert; deterministic tests with clear preconditions. Rationale: reliable evidence.
- Isolation: Mock hardware/HAL; no real hardware in unit tests. Rationale: determinism.
- Traceability: Each test links to requirement and risk control IDs. Rationale: compliance.
- CI Integration: Run in CI; archive results. Rationale: continuous assurance.
Recommended Practices
- Keep tests fast (<1s each) to encourage frequent runs.
- Use table-driven tests for combinations; parametrize to reduce duplication.
- Enforce
-Wall -Wextra -Werror in test builds.
- Add sanitizers (ASan/UBSan) on host where possible for non-embedded logic.
Patterns
C unit test with Unity (example):
// TEST-UNIT-105 covers REQ-C-TYPE-01
TEST(SumSamples, AccumulatesAll) {
uint16_t s[] = {1, 2, 3};
CHECK_EQUAL(6, sum_samples(s, 3));
}
Boundary test:
// TEST-UNIT-110 covers REQ-DEF-INPUT-01
TEST(ValidateFlow, RejectsNegative) {
CHECK_FALSE(validate_flow(-1.0f));
}
Mock HAL:
// TEST-UNIT-120 covers REQ-HAL-IF-01
MOCK_FUNCTION_WITH_RETURN(hal_status_t, hal_uart_write, const uint8_t*, size_t, size_t*);
Anti-Patterns (risks)
- Tests that depend on real timing or hardware -> risk: flakiness.
- No negative/boundary tests -> risk: missed edge defects.
- Untagged tests with requirements -> risk: broken traceability.
- Ignoring test failures in CI -> risk: regressions ship.
Verification Checklist
Traceability
- Map
TEST-UNIT-### to REQ-###; store coverage reports per release.
References
- IEC 62304:2006+A1:2015, 5.5 (software unit implementation and verification).
TEST-COVERAGE (informative MC/DC depth by class).
- ISO 14971:2019 for risk-based test depth.
Changelog
- 1.1.0 (2026-05-21): Aligned with 5.5.2–5.5.5 and Class C acceptance topics.
- 1.0.0 (2026-01-04): Initial unit testing skill with coverage targets and traceability.
Audit History
- 2026-01-04: Audit performed. Verified:
- IEC 62304 section 5.5 reference for unit implementation/verification is accurate
- MC/DC requirement for Class B/C control logic aligns with industry practice
- Unity test framework examples are syntactically correct
1---2name: unit-testing3description: Unit Testing for Medical Device Software4---56# Unit Testing for Medical Device Software78## Purpose9Establish patterns for unit tests that verify software units against requirements with safety-class-appropriate rigor.1011## When to Apply12- New or changed functions/modules, especially safety-related.13- Bug fixes to prevent regression.1415## Requirements (testable)161. Implement Units [Class A, B, C]: Implement each software unit per design. Rationale: 5.5.1.172. Verification Process [Class B, C]: Define strategies, methods, and procedures for unit verification; evaluate test procedure adequacy. Rationale: 5.5.2.183. Acceptance Criteria [Class B, C]: Define acceptance criteria before integration; confirm units meet criteria (requirements, interface consistency, coding standards). Rationale: 5.5.3.194. Class C Criteria [Class C]: Where design requires, add criteria for event sequencing, data/control flow, resource use, fault handling, initialization, diagnostics, memory behaviour, and boundary conditions. Rationale: 5.5.4 (engineering checklist).205. Execute and Record [Class B, C]: Perform unit verification and document results. Rationale: 5.5.5.216. Structure: Use Arrange-Act-Assert; deterministic tests with clear preconditions. Rationale: reliable evidence.227. Isolation: Mock hardware/HAL; no real hardware in unit tests. Rationale: determinism.238. Traceability: Each test links to requirement and risk control IDs. Rationale: compliance.249. CI Integration: Run in CI; archive results. Rationale: continuous assurance.2526## Recommended Practices27- Keep tests fast (<1s each) to encourage frequent runs.28- Use table-driven tests for combinations; parametrize to reduce duplication.29- Enforce `-Wall -Wextra -Werror` in test builds.30- Add sanitizers (ASan/UBSan) on host where possible for non-embedded logic.3132## Patterns33C unit test with Unity (example):34```c35// TEST-UNIT-105 covers REQ-C-TYPE-0136TEST(SumSamples, AccumulatesAll) {37 uint16_t s[] = {1, 2, 3};38 CHECK_EQUAL(6, sum_samples(s, 3));39}40```4142Boundary test:43```c44// TEST-UNIT-110 covers REQ-DEF-INPUT-0145TEST(ValidateFlow, RejectsNegative) {46 CHECK_FALSE(validate_flow(-1.0f));47}48```4950Mock HAL:51```c52// TEST-UNIT-120 covers REQ-HAL-IF-0153MOCK_FUNCTION_WITH_RETURN(hal_status_t, hal_uart_write, const uint8_t*, size_t, size_t*);54```5556## Anti-Patterns (risks)57- Tests that depend on real timing or hardware -> risk: flakiness.58- No negative/boundary tests -> risk: missed edge defects.59- Untagged tests with requirements -> risk: broken traceability.60- Ignoring test failures in CI -> risk: regressions ship.6162## Verification Checklist63- [ ] Tests follow AAA and are deterministic.64- [ ] Coverage meets class targets (branch/MC-DC for critical logic).65- [ ] Hardware/HAL calls mocked; no real hardware dependencies.66- [ ] Requirements/risk IDs referenced in tests.67- [ ] Negative/boundary cases included.68- [ ] Tests run in CI with warnings-as-errors; failures block merges.6970## Traceability71- Map `TEST-UNIT-###` to `REQ-###`; store coverage reports per release.7273## References74- IEC 62304:2006+A1:2015, 5.5 (software unit implementation and verification).75- `TEST-COVERAGE` (informative MC/DC depth by class).76- ISO 14971:2019 for risk-based test depth.7778## Changelog79- 1.1.0 (2026-05-21): Aligned with 5.5.2–5.5.5 and Class C acceptance topics.80- 1.0.0 (2026-01-04): Initial unit testing skill with coverage targets and traceability.8182## Audit History83- **2026-01-04**: Audit performed. Verified:84 - IEC 62304 section 5.5 reference for unit implementation/verification is accurate85 - MC/DC requirement for Class B/C control logic aligns with industry practice86 - Unity test framework examples are syntactically correct