![](/img/trans.png)
[英]How can I use member functions of google unit test case in thread defined in the unit test?
[英]How can I use Google Test to call specific test functions at specific places in the main() function?
我正在將TDD和Google Test用於涉及數值模擬的項目。 數據狀態在main
函數的一個循環內得到更改,但是每次更改后都需要滿足一些要求。 如果滿足一個測試用例的所有要求,則接受測試通過:
while(simulation)
modify simulation data
FIRST_TEST()
some other simulation operations
SECOND_TEST()
GTest入門指出,通常會調用RUN_ALL_TESTS()。 《 高級指南》通過過濾掉 RUN_ALL_TESTS中的測試,展示了如何運行子測試。 但是,我想知道如何分別調用測試。
否則,每次我需要上面偽代碼段中的新測試(例如FIRST_和SECOND_)時,就需要編寫一個新的驗收測試應用程序。
更多背景知識:我正在使用OpenFOAM框架進行計算流體動力學,因此不能在main
之外創建全局夾具。 該模擬應用程序需要目錄和配置文件才能運行,並且main中的全局對象是關聯的(相互要求進行初始化)。 此類應用程序的一個示例是OpenFOAM-2.2.x 。
我接受了公認的答案,以及在堆棧溢出的另一個問題上找到的測試中如何使用argc和argv作為全局變量的答案,我將其總結為這個可編譯的小型模型,也許有人覺得它有用:
#include <gtest/gtest.h>
#include <iostream>
class Type
{
int value_ = 0;
int times_ = 1;
public:
Type(int x) : value_(x) {};
void operator()(){
if (times_ < 10) {
++times_;
value_ *= times_;
}
}
int value () const { return value_; }
};
class mySeparatedTests : public ::testing::Test
{
protected:
template<typename Type>
void TEST_ONE(Type const &t)
{
ASSERT_TRUE((t.value() % 2) == 0);
}
template<typename Type>
void TEST_TWO(Type const & t)
{
ASSERT_TRUE((t.value() - 5) > 0);
}
};
TEST_F(mySeparatedTests, testName)
{
extern char** globalArgv;
char** argv = globalArgv;
// Simulation parameters and objects requiring argc and argv for initialization.
int simulationEndTime;
*argv[1] >> simulationEndTime;
Type typeObject(*argv[2]);
TEST_ONE(typeObject);
// Simulation loop.
for (int i = 0; i < simulationEndTime; ++i)
{
typeObject();
TEST_TWO(typeObject);
}
}
int globalArgc;
char** globalArgv;
int main(int argc, char **argv)
{
::testing::InitGoogleTest(&argc, argv);
globalArgc = argc;
globalArgv = argv;
return RUN_ALL_TESTS();
return 0;
}
如已接受的答案所述,這種方法將模擬代碼從main
移植到TEST_F中,並使用mySeparatedTests
類函數定義各個測試,然后可以在任何地方調用該測試。 編譯為:
g++ -std=c++11 -l gtest main.cpp -o main
測試失敗/通過取決於解析的參數對;
這失敗了:
./main 1 1
這樣成功:
./main 2 2
注意:我知道char / int轉換正在發生; 這只是為了展示如何獲取參數。
我的猜測是您對googletest的功能略有誤解。 測試順序的控制由測試運行程序控制。 您可以做的是使用while
循環定義一個測試,區別在於FIRST_TEST
等是具有某些斷言的FIRST_TEST
函數。 例如:
代替:
int main(...) { ... while (...) PERFORM_TEST("A"); ... }
TEST(A,some_test) {}
您可以使用標准的googletest運行器主體並定義:
// fixture
class MyTest : public ::testing::Test {
protected:
bool simulation() {
///...
}
void TEST_A() {
ASSERT_EQ(...);
//...
}
void TEST_B() {
ASSERT_EQ(...);
//...
}
///
};
// the test "runner"
TEST_F(MyTest, main_test) {
while (simulation()) {
// modify simulation data
TEST_A();
// some other simulation operations
TEST_B();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.