c++ - 使用 GTest 多次重复多线程测试的正确方法是什么?
问题描述
使用Google Test,我想测试一个ClientListener.AcceptRequest
方法的行为:
class ClientListener {
public:
// Clients can call this method, want to test that it works
Result AcceptRequest(const Request& request) {
queue_.Add(request);
... blocks waiting for result ...
return result;
}
private:
// Executed by the background_thread_;
void ProcessRequestsInQueue() {
while (true) {
Process(queue_.PopEarliest());
}
}
MyQueue queue_;
std::thread background_thread_ = thread([this] {ProcessRequestsInQueue();});
};
该方法接受客户端请求,将其排队,阻塞等待结果,在可用时返回结果。
当后台线程处理来自队列的相应请求时,结果可用。
我有一个如下所示的测试:
TEST(ListenerTest, TwoRequests) {
ClientListener listener;
Result r1 = listener.AcceptClientRequest(request1);
Result r2 = listener.AcceptClientRequest(request2);
ASSERT_EQ(r1, correctResultFor1);
ASSERT_EQ(r2, correctResultFor2);
}
由于ClientListener
类的实现涉及多个线程,因此此测试可能会通过一次尝试但在另一次尝试失败。为了增加捕获错误的机会,我多次运行测试:
TEST_P(ListenerTest, TwoRequests) {
... same as before ...
}
INSTANTIATE_TEST_CASE_P(Instantiation, ListenerTest, Range(0, 100));
但是现在make test
命令将每个参数化实例化视为一个单独的测试,并且在日志中,我看到了 100 个测试:
Test 1: Instantiation/ListenerTest.TwoRequests/1
Test 2: Instantiation/ListenerTest.TwoRequests/2
...
Test 100: Instantiation/ListenerTest.TwoRequests/100
鉴于我不使用参数值,有没有办法重写测试代码,以便make test
命令记录执行 100 次的单个测试,而不是 100 次测试?
解决方案
简单的答案:--gtest_repeat
在执行测试时使用就可以了(默认为 1)。
更长的答案:单元测试不应该用于这种测试。GTest 在设计上是线程安全的(如他们的 README中所述),但这并不意味着它是执行此类测试的好工具。也许这是真正开始进行真正的集成测试的一个很好的起点,我真的behave
为此目的推荐 Python 的框架。
推荐阅读
- javascript - 尝试在 Django 中学习 javascript 集成
- flutter - 无法通过命令提示符创建新的 Flutter 项目
- javascript - FB api graphql : 计算在 facebook 中与好友的消息数量
- soot - 什么是局部变量的 DU-UD Web?
- r - 向量内的向量并相互比较.R
- java - 在 Netbeans 8.2 RC 中为我的 Web 项目运行 JUnit 测试时出错说:需要在环境或系统属性中指定类名
- python-module - 运行python模块的Wifi互联网问题
- r - 将掩码变量(在“...”中)传递给 group_by() 时有条件地覆盖默认参数
- javascript - 如何使用 docker compose 更改 docker 容器内的文件夹权限?
- amazon-emr - 如何在 EKS 上为 EMR 进行日志记录(即 emr 容器)