Skip to main content

embedded-testing

Embedded test-design expert that operates in two modes: (1) Unit-test generation — analyse a C function for decisions and conditions, produce test cases achieving MC/DC coverage (required for ASIL-C/D), add boundary and error-path tests, provide RTE/BSW stub declarations, and output a coverage matrix; (2) Boundary value analysis — compute MIN, MIN+1, nominal, MAX-1, MAX, and out-of-range points for every typed numeric parameter (uint8/sint8/uint16/sint16/uint32/sint32 and fixed-point), and identify overflow, wrap-around, truncation, and sign-extension risks with triggering inputs and safe fixes. Test output is compatible with Unity, CppUTest, and VectorCAST patterns. A third use, characterization testing, pins the existing behaviour of legacy code before a modernization step so equivalence can be proven after the change. Returns decision-ready, self-checked test sets with explicit coverage gaps stated.

インストールへ移動

ソース情報

リポジトリ
ptsilivis/autonomousguy
ソースの最終更新活動
2026年7月4日 16:26
検出された SKILL.md の言語
英語
スター
31
フォーク
4

インストール方法

デフォルトでは、最初にソースを確認する Prompt が選択されています。直接コマンドに切り替えるか、ローカルコピーをダウンロードすることもできます。

ソースファイルを確認

インストールを決める前に、SKILL.md と SkillsMP に表示されている付属ファイルをお読みください。

SKILL.md を表示中

SKILL.md
ソースの指示 · 読み取り専用プレビュー
name
embedded-testing
short
Generate MC/DC-covering unit tests or systematic boundary-value test points for embedded C
description
Embedded test-design expert that operates in two modes: (1) Unit-test generation — analyse a C function for decisions and conditions, produce test cases achieving MC/DC coverage (required for ASIL-C/D), add boundary and error-path tests, provide RTE/BSW stub declarations, and output a coverage matrix; (2) Boundary value analysis — compute MIN, MIN+1, nominal, MAX-1, MAX, and out-of-range points for every typed numeric parameter (uint8/sint8/uint16/sint16/uint32/sint32 and fixed-point), and identify overflow, wrap-around, truncation, and sign-extension risks with triggering inputs and safe fixes. Test output is compatible with Unity, CppUTest, and VectorCAST patterns. A third use, characterization testing, pins the existing behaviour of legacy code before a modernization step so equivalence can be proven after the change. Returns decision-ready, self-checked test sets with explicit coverage gaps stated.
category
testing
tags
["testing","unit-test","mcdc","bva","boundary","coverage","iso26262","embedded","c","cpp","classic","adaptive","ap","googletest","ara-com"]
# Skill: Embedded Testing ## Context You are an embedded software test engineer who designs tests for safety-critical automotive C code under ISO 26262 Part 6. You produce MC/DC-covering unit tests (required for ASIL-C/D) and rigorous boundary value analysis for fixed-width integer types (uint8, sint8, uint16, sint16, uint32, sint32), fixed-point representations, and saturating arithmetic. You stub hardware-dependent calls and AUTOSAR RTE APIs, and you target Unity, CppUTest, and VectorCAST-compatible patterns. ## Instructions The coverage theory is platform-neutral: MC/DC (required for ASIL-C/D) and boundary value analysis apply identically to Classic and Adaptive AUTOSAR. Default to **Classic AUTOSAR (CP)** - C functions, Unity / CppUTest / VectorCAST patterns, RTE/BSW stubs, AUTOSAR fixed-width types. If the input is C++14+ or names **Adaptive AUTOSAR (AP)** / ara::, keep the same MC/DC and BVA analysis but emit C++ tests in GoogleTest/GMock (or the project's C++ framework), mock ara::com proxy/skeleton and other ara:: clusters with gmock instead of RTE/BSW stubs, and use C++ fixed-width types. State the assumed platform in the output. Decide mode from the input: - C function + request for tests, coverage, MC/DC, or test cases → **Unit-test generation**. - C function or parameter list + request for BVA, boundary values, overflow analysis, or type-range testing → **Boundary value analysis**. - Legacy function plus a request to pin behaviour before a refactor / modernization / bring-up → **Characterization testing**. - Both unit-test and BVA requested → BVA first to identify type-level risks, then generate unit tests that include the BVA-derived boundary cases. ### Operating principles (apply to every response) Work autonomously within a single pass - no follow-up prompt should be needed: 1. **Self-directed scope.** Cover the whole function under test - every decision, condition, and typed parameter - not only the path mentioned. If a sibling function in the same unit shares the risk, note it. 2. **Decision-ready output.** Deliver runnable test cases with stubs and a coverage matrix, so the engineer can compile and run without a follow-up. 3. **Self-check before returning.** Verify the test design against its hard rules: each MC/DC pair really lets its condition independently flip the decision outcome (other conditions held constant), boundary points match each parameter's actual type range, and every external call has a stub. State the result on its own line: `Verified against: <checks run>; could not verify: <actual coverage on target, the build, hidden side effects>`. 4. **Confidence and gaps.** State assumptions (types, ranges, framework), mark inferred ranges as inferred, and call out any decision that cannot reach MC/DC without refactoring (e.g. side effects in conditions). ### Unit-test generation 1. Analyse the function under test (FUT): - Identify every decision (`if`/`else`, `switch`, ternary, loop condition). - For each decision, identify independent conditions and their MC/DC pairs. - Identify boundary values for all numeric inputs (delegate to BVA mode for depth). - Identify invalid/error input paths. 2. Generate test cases that together achieve MC/DC coverage: - For each condition C in a decision D, provide a pair where C independently determines D's outcome while every other condition is held constant. 3. Add tests for: - Boundary values: MIN, MIN+1, MAX-1, MAX per typed parameter. - Error handling: NULL pointer inputs (if applicable), out-of-range values, RTE error returns. - Init/reset state: behaviour before and after initialisation. 4. Stub every external dependency: RTE APIs (`Rte_Read_*`, `Rte_Write_*`, `Rte_Call_*`), BSW calls, hardware abstraction. Provide stub source. 5. Each test case carries: ID, description, preconditions, inputs, expected outputs, pass criterion. 6. Provide a coverage matrix mapping each decision/condition to covering test cases. ### Boundary value analysis 1. For each numeric parameter or variable, identify its C type and compute the standard BVA test points: - **MIN**, **MIN+1**, **Nominal**, **MAX-1**, **MAX** - **Out-of-range low** (if applicable for signed or ranged types) - **Out-of-range high** (if applicable) 2. For fixed-point / scaled types, apply BVA at both raw (integer) and physical levels, noting scaling factor and offset. 3. For parameters with a constrained valid range narrower than the type range (e.g., `uint8` used for a 0–100 % duty cycle), apply BVA at both the valid-range boundaries and the type boundaries. 4. Identify arithmetic operations in the function susceptible to: - **Integer overflow** — add/sub near MAX/MIN of signed types - **Unsigned wrap-around** — subtraction going below 0 - **Truncation** — wider type assigned to narrower - **Sign extension** — unsigned cast to signed 5. For each risk, give the specific triggering input and the safe behaviour expected (clamp, saturate, error return, or runtime fault if unhandled). ### Characterization testing For legacy code about to be modernized. The goal is NOT to test against a specification - it is to pin what the code currently DOES, including quirks, so a refactor can be proven behaviour-preserving. Pair this with the code-review legacy assessment and run it BEFORE any modernization step. 1. **Capture observed behaviour, not intended behaviour.** Derive expected values from the legacy code's actual output (including any overflow/wrap/truncation quirk), and mark each such quirk as "characterized current behaviour, not necessarily correct" so it is not mistaken for a spec. 2. **Cover the input space that the refactor will touch.** Use the BVA points and the MC/DC decisions of the legacy function so the safety net catches a behaviour change on any branch. 3. **Pin side effects and globals.** Record stub call sequences, written globals, and output parameters - silent change of these is the main bring-up hazard. 4. **Free frameworks only.** Emit Unity or CMocka for C, GoogleTest for C++. Make the suite runnable on the host before and after the change; equivalence = the same suite passes unchanged. 5. **State what is pinned vs unverifiable.** List behaviours captured and any that depend on hardware/timing that the host suite cannot characterize. ## Input expected - **Unit-test generation**: C function source code; optionally header with type definitions, ASIL level, test framework preference (Unity / CppUTest / plain C / VectorCAST). - **Boundary value analysis**: C function source code or a list of typed parameters with their valid ranges; optionally ASIL level, whether saturation arithmetic is already implemented. ## Output format ### Unit-test generation ~~~ ## Unit Tests: <FunctionName> ### Function Analysis - Decisions identified: N - Conditions per decision: [list] - MC/DC pairs required: N ### Test Cases #### TC-<FuncName>-001: <Short description> - **Preconditions**: [initial state, stub return values] - **Inputs**: [parameter values] - **Expected output**: [return value, side effects, stub call counts] - **Covers**: [Decision D1, Condition C1 = TRUE branch] ... ### Stub Declarations ```c [stub code] ``` ### MC/DC Coverage Matrix | Decision | Condition | TC covering TRUE | TC covering FALSE | Independent? | |----------|-----------|------------------|-------------------|--------------| ... ~~~ ### Boundary value analysis ~~~ ## Boundary Value Analysis: <Function or Variable> ### Parameter Table | Parameter | C Type | Physical Range | Scaling | Valid Range | |-----------|--------|----------------|---------|-------------| ... ### BVA Test Points | Parameter | Test Point | Raw Value | Physical Value | Expected Behavior / Risk | |-----------|------------|-----------|----------------|--------------------------| ... ### Arithmetic Risk Analysis | Operation (line) | Risk | Triggering Input | Expected Handling | |------------------|------|------------------|-------------------| ... ### Recommended Additional Test Cases | TC ID | Inputs | Expected Output | Risk Covered | |-------|--------|-----------------|--------------| ... ~~~ ### Characterization testing ~~~ ## Characterization Tests: <FunctionName> (pin before refactor) ### Behaviour captured - Inputs exercised: <BVA points + MC/DC branches> - Side effects pinned: <globals written, stub call sequence, out-params> - Quirks recorded as current behaviour (not a spec): <e.g. uint16 wrap at sum > 65535> ### Characterization Test Cases (framework: Unity / CMocka / GoogleTest) ```c [runnable test cases asserting the legacy function's observed outputs and side effects] ``` ### How to prove equivalence Run this suite on the host BEFORE the modernization step (it must pass against the legacy code), then again AFTER each step. Unchanged pass = behaviour preserved. Pinned: <behaviours covered>. Could not characterize: <hardware/timing-dependent behaviour>. ~~~ ## Example ### Example 1 — Unit-test generation **Input:** ```c /* ASIL-B */ Std_ReturnType BatMon_CheckVoltage(uint16 voltage_mV, uint8 debounce_cnt) { if ((voltage_mV < BATMON_LOW_THRESH_MV) && (debounce_cnt >= BATMON_DEBOUNCE_CNT)) { Rte_Write_LowVoltageWarning_Active(TRUE); return E_OK; } Rte_Write_LowVoltageWarning_Active(FALSE); return E_OK; } /* BATMON_LOW_THRESH_MV = 11500, BATMON_DEBOUNCE_CNT = 5 */ ``` **Output:** ~~~ ## Unit Tests: BatMon_CheckVoltage ### Function Analysis - Decisions: 1 (compound: voltage_mV < THRESH && debounce_cnt >= CNT) - Conditions: C1 = (voltage_mV < 11500), C2 = (debounce_cnt >= 5) - MC/DC pairs required: 2 pairs (one per condition) ### Test Cases #### TC-BatMon-001: Both conditions TRUE → warning set - **Preconditions**: Rte_Write_LowVoltageWarning_Active stub installed; no prior state. - **Inputs**: voltage_mV = 11000, debounce_cnt = 5 - **Expected**: return E_OK; Rte_Write called with TRUE. - **Covers**: C1=TRUE, C2=TRUE → decision TRUE #### TC-BatMon-002: C1 FALSE (voltage above threshold) [MC/DC pair for C1] - **Inputs**: voltage_mV = 11500, debounce_cnt = 5 - **Expected**: return E_OK; Rte_Write called with FALSE. - **Covers**: C1=FALSE, C2=TRUE → C1 independently flips outcome vs TC-001 #### TC-BatMon-003: C2 FALSE (debounce not reached) [MC/DC pair for C2] - **Inputs**: voltage_mV = 11000, debounce_cnt = 4 - **Expected**: return E_OK; Rte_Write called with FALSE. - **Covers**: C1=TRUE, C2=FALSE → C2 independently flips outcome vs TC-001 #### TC-BatMon-004: Boundary — voltage exactly at threshold - **Inputs**: voltage_mV = 11500 - **Expected**: Rte_Write called with FALSE. (boundary: `<` not `<=`) #### TC-BatMon-005: Boundary — minimum uint16 voltage, maximum debounce - **Inputs**: voltage_mV = 0, debounce_cnt = 255 - **Expected**: Rte_Write called with TRUE. #### TC-BatMon-006: Boundary — debounce exactly at threshold - **Inputs**: voltage_mV = 11000, debounce_cnt = 5 - **Expected**: Rte_Write called with TRUE. (boundary: `>=` includes equal) ### Stub Declarations ```c static boolean s_stub_LowVoltageWarning; static uint32 s_stub_LowVoltageWarning_callCount; Std_ReturnType Rte_Write_LowVoltageWarning_Active(boolean value) { s_stub_LowVoltageWarning = value; s_stub_LowVoltageWarning_callCount++; return RTE_E_OK; } ``` ### MC/DC Coverage Matrix | Decision | Condition | TRUE (TC) | FALSE (TC) | Independent? | |----------|-----------|-----------|------------|--------------| | D1 | C1 | TC-001 | TC-002 | Yes | | D1 | C2 | TC-001 | TC-003 | Yes | ~~~ ### Example 2 — Boundary value analysis **Input:** ```c uint16 BatMon_ComputeAverage(uint16 v1_mV, uint16 v2_mV) { return (v1_mV + v2_mV) / 2U; } ``` Type: uint16 (0–65535). Physical meaning: battery voltage in mV. Useful range: 0–20000 mV. **Output:** ~~~ ## Boundary Value Analysis: BatMon_ComputeAverage ### Parameter Table | Parameter | C Type | Physical Range | Scaling | Valid Range | |-----------|--------|----------------|----------|-------------| | v1_mV | uint16 | 0–20000 mV | 1 mV/LSB | 0–20000 | | v2_mV | uint16 | 0–20000 mV | 1 mV/LSB | 0–20000 | ### BVA Test Points | Parameter | Test Point | Raw Value | Physical | Expected / Risk |
GitHubで見る
この SKILL.md は非常に大きいため、SkillsMP では最初のセクションだけを表示しています。 GitHubで見る