enumclassCalculateType :int { add = 1, minus = 2, plus = 3, divide = 4 };
classMyClass { public: intcalculate(int a, int b, CalculateType type) { int c = 0; switch (type) { case CalculateType::add: c = a + b; break; case CalculateType::minus: c = a - b; break; case CalculateType::plus: c = a * b; break; case CalculateType::divide: c = a / b; break; } return c; } };
structMyTestData { int a; int b; CalculateType type; };
classTestMyClass :public ::testing::Test, public ::testing::WithParamInterface<MyTestData> { public: MyClass myclass; };
TEST_P(TestMyClass, norml) { int a = GetParam().a; int b = GetParam().b; int re = myclass.calculate(a, b, GetParam().type); switch (GetParam().type) { case CalculateType::add: EXPECT_EQ(a + b, re); break; case CalculateType::minus: EXPECT_EQ(a - b, re); break; case CalculateType::plus: EXPECT_EQ(a * b, re); break; case CalculateType::divide: EXPECT_EQ(a / b, re); break; } }
[==========] Running 4 tests from 1 test suite. [----------] Global test environment set-up. [----------] 4 tests from TestMyClassParams/TestMyClass [ RUN ] TestMyClassParams/TestMyClass.norml/0 [ OK ] TestMyClassParams/TestMyClass.norml/0 (0 ms) [ RUN ] TestMyClassParams/TestMyClass.norml/1 [ OK ] TestMyClassParams/TestMyClass.norml/1 (0 ms) [ RUN ] TestMyClassParams/TestMyClass.norml/2 [ OK ] TestMyClassParams/TestMyClass.norml/2 (0 ms) [ RUN ] TestMyClassParams/TestMyClass.norml/3 [ OK ] TestMyClassParams/TestMyClass.norml/3 (0 ms) [----------] 4 tests from TestMyClassParams/TestMyClass (0 ms total)
[----------] Global test environment tear-down [==========] 4 tests from 1 test suite ran. (0 ms total) [ PASSED ] 4 tests.
TEST_P(TestMyClass, norml) { int a = GetParam().a; int b = GetParam().b; if(a < 0 || b < 0){ ADD_FAILURE() << "operator should be positive!"; std::cout << "I am fail" << std::endl; } int re = myclass.calculate(a, b, GetParam().type); switch (GetParam().type) { case CalculateType::add: EXPECT_EQ(a + b, re); break; case CalculateType::minus: EXPECT_EQ(a - b, re); break; case CalculateType::plus: EXPECT_EQ(a * b, re); break; case CalculateType::divide: EXPECT_EQ(a / b, re); break; } }
在标志为失败后输出”I am fail”,并将第四个样例改为:
1
MyTestData{8, -2, CalculateType::divide}
输出如下:
1 2 3 4 5 6 7 8 9 10 11 12 13
Running main() from /Users/bytedance/Desktop/googletest/googletest/src/gtest_main.cc [==========] Running 4 tests from 1 test suite. [----------] Global test environment set-up. [----------] 4 tests from TestMyClassParams/TestMyClass [ RUN ] TestMyClassParams/TestMyClass.norml/0 [ OK ] TestMyClassParams/TestMyClass.norml/0 (0 ms) ... [ RUN ] TestMyClassParams/TestMyClass.norml/3 test_p.cpp:58: Failure Failed operator should be positive! I am fail ...
可以看到输出了”I am fail”。
如果把上面的ADD_FAILURE()改为FAIL(),则会输出:
1 2 3 4 5 6 7 8 9 10
[==========] Running 4 tests from 1 test suite. [----------] Global test environment set-up. [----------] 4 tests from TestMyClassParams/TestMyClass [ RUN ] TestMyClassParams/TestMyClass.norml/0 ... test_p.cpp:58: Failure Failed operator should be positive! [ FAILED ] TestMyClassParams/TestMyClass.norml/3, where GetParam() = 12-byte object <08-00 00-00 FE-FF FF-FF 04-00 00-00> (0 ms) ...
// Returns true if m and n have no common divisors except 1. boolMutuallyPrime(int m, int n){ ... } ... constint a = 3; constint b = 4; constint c = 10; ... EXPECT_PRED2(MutuallyPrime, a, b); // Succeeds EXPECT_PRED2(MutuallyPrime, b, c); // Fails
TEST_P(TestMyClass, norml) { int a = GetParam().a; int b = GetParam().b; int re = myclass.calculate(a, b, GetParam().type); switch (GetParam().type) { case CalculateType::add: EXPECT_PRED2(static_cast<bool (*)(int, int)>(equal), a + b, re); break; case CalculateType::minus: EXPECT_EQ(a - b, re); break; case CalculateType::plus: EXPECT_EQ(a * b, re); break; case CalculateType::divide: EXPECT_EQ(a / b, re); break; } }
[==========] Running 1 test from 1 test suite. [----------] Global test environment set-up. [----------] 1 test from Even [ RUN ] Even.HandlesZeroInput test5.cpp:12: Failure Value of: IsEven(100) Actual: true (100is even) Expected: false [ FAILED ] Even.HandlesZeroInput (0 ms) [----------] 1 test from Even (0 ms total)
[----------] Global test environment tear-down [==========] 1 test from 1 test suite ran. (0 ms total) [ PASSED ] 0 tests. [ FAILED ] 1 test, listed below: [ FAILED ] Even.HandlesZeroInput
$ ./test5 [==========] Running 1 test from 1 test suite. [----------] Global test environment set-up. [----------] 1 test from Even [ RUN ] Even.HandlesZeroInput test5.cpp:12: Failure x is odd ...