土法炼钢兴趣小组的算法知识备份

测试与 QA

目录

网络编程充满了不确定性(丢包、延迟、断网)。为了保证服务的质量,我们需要建立完善的测试体系。

1. 单元测试 (Unit Testing)

Libevent 的代码通常是回调驱动的,这给测试带来了挑战。

1.1. Mock 还是 Real Loop?

Mock event_base 非常困难。推荐的做法是使用真实的 Event Loop,但配合 socketpair 来模拟网络连接。

void test_echo_handler() {
    struct event_base *base = event_base_new();
    int fds[2];
    evutil_socketpair(AF_UNIX, SOCK_STREAM, 0, fds);

    // 服务端 bev
    struct bufferevent *bev_srv = bufferevent_socket_new(base, fds[0], 0);
    bufferevent_setcb(bev_srv, echo_read_cb, NULL, NULL, NULL);
    bufferevent_enable(bev_srv, EV_READ);

    // 客户端 bev
    struct bufferevent *bev_cli = bufferevent_socket_new(base, fds[1], 0);
    bufferevent_write(bev_cli, "ping", 4);

    // 运行 Loop 一次
    event_base_loop(base, EVLOOP_NONBLOCK);

    // 验证
    char buf[1024];
    size_t n = bufferevent_read(bev_cli, buf, sizeof(buf));
    assert(n == 4);
    assert(strncmp(buf, "ping", 4) == 0);

    // 清理...
}

2. 集成测试 (Integration Testing)

集成测试关注整个服务的端到端行为。

2.1. 故障注入

在本地回环测试中,网络通常是完美的。我们需要模拟恶劣环境。 * Linux tc (Traffic Control): bash # 模拟 100ms 延迟和 1% 丢包 tc qdisc add dev lo root netem delay 100ms loss 1% * 应用层模拟: 编写一个 Proxy,随机丢弃或延迟转发数据包。

3. 模糊测试 (Fuzzing)

对于协议解析器(如 SOCKS5, HTTP),Fuzzing 是发现漏洞的神器。

3.1. libFuzzer 集成

编写一个 Fuzz Target,将随机数据喂给你的解析函数。

// fuzz_target.cc
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
    struct evbuffer *buf = evbuffer_new();
    evbuffer_add(buf, Data, Size);
    
    // 调用你的协议解析逻辑
    parse_protocol(buf);
    
    evbuffer_free(buf);
    return 0;
}

编译并运行:

clang++ -fsanitize=fuzzer,address fuzz_target.cc -o fuzzer
./fuzzer

4. 总结

不要等到上线才发现 Bug。通过 socketpair 进行单元测试,通过 tc 进行弱网测试,通过 libFuzzer 进行协议健壮性测试,是打造高质量 Libevent 服务的必经之路。


上一篇: 06-production/debugging.md - 异步调试与追踪 下一篇: 07-hardening/security.md - 安全与鲁棒性

返回 Libevent 专题索引


By .