多线程测试:从日志库到服务代码的实战指南
多线程测试基础与日志库线程安全测试
在多线程测试中,我们遇到了一些挑战。例如,在测试中每个线程的确认可能失败,但测试库只会报告一个失败。若有多个线程在同一测试运行中失败,也仅会报告一个失败,修复后再次运行可能才会报告下一个失败。由于编写多线程测试的复杂性,目前还没有通用的宏来隐藏所有线程确认处理,我们选择使用 ThreadConfirmException
类型传递给线程,线程捕获 ConfirmException
并调用 setFailure
,主测试线程检查 ThreadConfirmException
。
为了测试日志库的线程安全性,我们编写了一个测试,创建了 150 条消息,启动 3 个线程,每个线程负责记录部分消息,最后确认所有消息都出现在日志文件中。以下是测试代码:
#include "../Log.h"
#include "Util.h"
#include <MereTDD/Test.h>
#include <thread>
TEST("log can be called from multiple threads")
{
// We'll have 3 threads with 50 messages each.
std::vector<std::string> messages;
for (int i = 0; i < 150; ++i)
{
std::stri