3. 使用断言进行基础测试

任务说明

本案例为LED控制模块编写单元测试,使用断言验证其输入输出行为。被测函数led_set_state接收LED编号与目标状态,返回操作结果;测试需覆盖正常状态切换、非法LED编号、非法状态值三类场景。

被测模块实现

// led_controller.h
#ifndef LED_CONTROLLER_H
#define LED_CONTROLLER_H

#include <stdint.h>

#define LED_COUNT        4
#define LED_STATE_OFF    0
#define LED_STATE_ON     1
#define LED_OK           0
#define LED_ERR_INVALID_ID   (-1)
#define LED_ERR_INVALID_STATE (-2)

int led_set_state(uint8_t led_id, uint8_t state);

#endif
// led_controller.c
#include "led_controller.h"

static uint8_t led_status[LED_COUNT] = {0};

int led_set_state(uint8_t led_id, uint8_t state) {
    if (led_id >= LED_COUNT) {
        return LED_ERR_INVALID_ID;
    }
    if (state != LED_STATE_OFF && state != LED_STATE_ON) {
        return LED_ERR_INVALID_STATE;
    }
    led_status[led_id] = state;
    return LED_OK;
}

单元测试代码

// test_led_controller.c
#include <assert.h>
#include <stdio.h>
#include "led_controller.h"

void test_normal_on_off(void) {
    // 正常点亮与熄灭
    assert(led_set_state(0, LED_STATE_ON) == LED_OK);
    assert(led_set_state(0, LED_STATE_OFF) == LED_OK);
    assert(led_set_state(3, LED_STATE_ON) == LED_OK);
    assert(led_set_state(3, LED_STATE_OFF) == LED_OK);
}

void test_invalid_led_id(void) {
    // 非法LED编号:等于边界值、超出边界
    assert(led_set_state(LED_COUNT, LED_STATE_ON) == LED_ERR_INVALID_ID);
    assert(led_set_state(255, LED_STATE_OFF) == LED_ERR_INVALID_ID);
}

void test_invalid_state(void) {
    // 非法状态值:非0非1
    assert(led_set_state(1, 2) == LED_ERR_INVALID_STATE);
    assert(led_set_state(2, 0xFF) == LED_ERR_INVALID_STATE);
}

int main(void) {
    test_normal_on_off();
    test_invalid_led_id();
    test_invalid_state();
    printf("All LED controller tests passed.\n");
    return 0;
}

编译与运行

# 编译(需将led_controller.c与test_led_controller.c一同编译)
gcc -Wall -Wextra -o test_led led_controller.c test_led_controller.c

# 运行测试
./test_led

验证方法与判定标准

执行./test_led后,若所有断言均通过,程序输出All LED controller tests passed.并以退出码0结束;若任一断言失败,程序会中止并报告失败位置。判定测试通过的标准为:程序正常输出上述信息且退出码为0。

LED控制函数断言测试覆盖矩阵 正常输入 led_set_state(0, ON) → 返回 LED_OK led_set_state(0, OFF) → 返回 LED_OK led_set_state(3, ON) → 返回 LED_OK led_set_state(3, OFF) → 返回 LED_OK 非法LED编号 led_set_state(4, ON) → LED_ERR_INVALID_ID led_set_state(255, OFF) → LED_ERR_INVALID_ID 边界条件: led_id = LED_COUNT(4) led_id = 255 (uint8_t max) 非法状态值 led_set_state(1, 2) → LED_ERR_INVALID_STATE led_set_state(2, 0xFF) → LED_ERR_INVALID_STATE 边界条件: state = 2 (ON+1) state = 0xFF (uint8_t max) 判定标准:所有断言通过 → 输出 "All LED controller tests passed." 且退出码为0

预期输出

All LED controller tests passed.

该输出为代码逻辑直接推出的确定性结果:当且仅当三个测试函数中的所有assert条件均成立时,printf才会执行并打印此行。