在单线程中强制 googletest 运行 的命令行选项
Command-line options to force googletest to run in single thread
我有一套由 googletest 管理的单元测试。默认情况下,这些测试在多个线程中 运行,即使我使用 --gtest_filter=foo.test
时也是如此,因此它只有 运行 一个测试。这导致我试图解决一个错误的原因含糊不清。
如何在 googletest 中关闭多线程测试?
single/multi-threading 没有命令行开关。 libgtest
要么构建
单线程或多线程。
要使其成为单线程,请使用 ./configure --with-pthreads=no
构建 gtest,然后 link 没有 -pthread
的单元测试应用程序
如果您有时只需要单线程,那么制作一个 libgtest
的无线程构建,
称它为其他名称,并在需要时 link。
如果您使用 cmake 构建 googletest,则可以使用 cmake 选项 gtest_disable_pthreads
来控制对线程的支持。例如:
$ mkdir build && cd build
$ cmake .. -Dgtest_disable_pthreads=ON
结果输出应该不显示:
-- Looking for pthread.h
-- Looking for pthread.h - found
-- Looking for pthread_create
-- Looking for pthread_create - found
-- Found Threads: TRUE
那你就可以运行make
照常了。
在禁用多线程的情况下重建的另一个选项是简单地为不能运行并发的测试创建一个测试夹具。然后在 SetUp() 和 TearDown() 方法中,分别锁定和解锁互斥量。
确保使用存在于测试装置之外的互斥体,因为每次测试都会创建和拆除装置。
std::mutex g_singleThread;
class SingleThreadedTests
{
protected:
virtual void SetUp() override
{
g_singleThread.lock();
}
virtual void TearDown() override
{
g_singleThread.unlock();
}
};
TEST_F(SingleThreadedTests, MyTest)
{
// ...
}
我有一套由 googletest 管理的单元测试。默认情况下,这些测试在多个线程中 运行,即使我使用 --gtest_filter=foo.test
时也是如此,因此它只有 运行 一个测试。这导致我试图解决一个错误的原因含糊不清。
如何在 googletest 中关闭多线程测试?
single/multi-threading 没有命令行开关。 libgtest
要么构建
单线程或多线程。
要使其成为单线程,请使用 ./configure --with-pthreads=no
构建 gtest,然后 link 没有 -pthread
如果您有时只需要单线程,那么制作一个 libgtest
的无线程构建,
称它为其他名称,并在需要时 link。
如果您使用 cmake 构建 googletest,则可以使用 cmake 选项 gtest_disable_pthreads
来控制对线程的支持。例如:
$ mkdir build && cd build
$ cmake .. -Dgtest_disable_pthreads=ON
结果输出应该不显示:
-- Looking for pthread.h
-- Looking for pthread.h - found
-- Looking for pthread_create
-- Looking for pthread_create - found
-- Found Threads: TRUE
那你就可以运行make
照常了。
在禁用多线程的情况下重建的另一个选项是简单地为不能运行并发的测试创建一个测试夹具。然后在 SetUp() 和 TearDown() 方法中,分别锁定和解锁互斥量。
确保使用存在于测试装置之外的互斥体,因为每次测试都会创建和拆除装置。
std::mutex g_singleThread;
class SingleThreadedTests
{
protected:
virtual void SetUp() override
{
g_singleThread.lock();
}
virtual void TearDown() override
{
g_singleThread.unlock();
}
};
TEST_F(SingleThreadedTests, MyTest)
{
// ...
}