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。
预期输出
All LED controller tests passed.
该输出为代码逻辑直接推出的确定性结果:当且仅当三个测试函数中的所有assert条件均成立时,printf才会执行并打印此行。