TA的每日心情 | 无聊 前天 09:05 |
---|
签到天数: 1050 天 连续签到: 1 天 [LV.10]测试总司令
|
一、Test Fixture的继承和差异化
之前介绍了Test Fixture,下面通过示例sample05说明下如何进行Test Fixture的继承。
对已有的Test Fixture进行继承,往往发生在如下两个场景 (1) 定义的Test Fixture可用于指定的一套单元测试用例集,当有多套测试用例时,如何处理? (2)当不同的测试用例集对应的测试资源基本相同、但又存在少量差异,又如何处理?
被继承的Test Fixture在Google Test 中被称为 Super Fixture、继承者被称为sub fixture。Super Fixture /Test Fixture 本质就是一个类,类当然可以被继承啦。
sample05的测试对象
1. 测试对象是 sample01.h + sample01.cpp, sample03.h,文件结构如下图所示:
sample01.h 对Factorial( ), IsPrime( )函数进行了声明、sample01.cpp 对Factorial( ) 、IsPrime( )两个函数进行了具体实现:Factorial用于求一个整数的阶乘、IsPrime用于判定一个整数是否为素数
sample03.h 完整定义了类Queue(包含成员函数的具体实现):类Queue实现了队列的基本功能,同时他包含了一个定制化的Map( )函数
上述源码文件在之前的文档中已经展示过,这里不再重复。
对应的单元测试用例
1. sample05UnitTest.cpp中定义了名为QuickTest的Test Fixture,用来判定用例的执行时间是否超过5秒:从SetUp( )调用时启动计时,从TearDown( )调用时结束计时,期间时间就是用例执行时间。
GoogleTest的每一条用例,正式启动前先调用SetUp( ),执行结束后调用TearDown( )。
- class QuickTest : public testing::Test
- {
- protected:
- time_t start_time_;
- void SetUp() override
- {
- start_time_ = time(nullptr);
- }
- void TearDown() override
- {
- const time_t end_time = time(nullptr);
- EXPECT_TRUE(end_time - start_time_ <= 5) << "The test took too long.";
- }
- };
复制代码 2. Test Fixture的继承
IntegerFunctionTest继承自测试夹具QuickTest,该继承解决了上面提到的问题一:只定义了一个Test Fixture,但是需要编写多套测试用例?
- class IntegerFunctionTest : public QuickTest{ };
- TEST_F(IntegerFunctionTest, Factorial)
- {
- EXPECT_EQ(1, Factorial(-5)); //每条用例都会判定是否超过5秒
- EXPECT_EQ(1, Factorial(-1));
- }
复制代码 QueueTest也继承自测试夹具QuickTest,他的目标是测试类Queue,因此进行了必要的差异化:在SetUp( )中为类Queue的实例化对象赋初值
该继承解决了上面提到的问题二:不同的测试用例集使用相同的测试资源、但又存在差异?
- class QueueTest : public QuickTest
- {
- protected:
- Queue<int> q0_; //差异化
- Queue<int> q1_;
- Queue<int> q2_;
- void SetUp() override
- {
- QuickTest::SetUp();
- q1_.Enqueue(1);
- q2_.Enqueue(2);
- q2_.Enqueue(3);
- }
- };
复制代码 使用QueueTest的宏TEST_F,由于继承自QuickTest,同样会判定用例的执行是否超过5秒:
- TEST_F(QueueTest, DefaultConstructor)
- {
- EXPECT_EQ(0, q0_.Size());
- }
复制代码 QueueTest, IntegerFunctionTest 也可以被继承:可以进行Test Fixture继承的继承,此类继承没有层数限制。
3. 单元测试用例的完整源码
下面通过测试夹具QuickTest, QueueTest, IntegerFunctionTest完成sample01.h和 sample03.h的测试。
- #include "pch.h"
- #include <limits.h>
- #include <time.h>
- #include "sample01.h"
- #include "sample03.h"
- namespace {
- class QuickTest : public testing::Test //首先定义测试夹具QuickTest
- {
- protected:
- time_t start_time_;
- void SetUp() override
- {
- start_time_ = time(nullptr);
- }
- void TearDown() override
- {
- const time_t end_time = time(nullptr);
- EXPECT_TRUE(end_time - start_time_ <= 5) << "The test took too long.";
- }
- };
-
- class IntegerFunctionTest : public QuickTest
- {
- // IntegerFunctionTest继承自QuickTest,由于不需要差异化,因此代码为空
- };
-
- //通过IntegerFunctionTest完成Factorial() 和 IsPrime()的单元测试
- TEST_F(IntegerFunctionTest, Factorial)
- {
- // Tests factorial of negative numbers.
- EXPECT_EQ(1, Factorial(-5));
- EXPECT_EQ(1, Factorial(-1));
- EXPECT_GT(Factorial(-10), 0);
-
- // Tests factorial of 0.
- EXPECT_EQ(1, Factorial(0));
-
- // Tests factorial of positive numbers.
- EXPECT_EQ(1, Factorial(1));
- EXPECT_EQ(2, Factorial(2));
- EXPECT_EQ(6, Factorial(3));
- EXPECT_EQ(40320, Factorial(8));
- }
-
-
- // Tests IsPrime()
- TEST_F(IntegerFunctionTest, IsPrime)
- {
- // Tests negative input.
- EXPECT_FALSE(IsPrime(-1));
- EXPECT_FALSE(IsPrime(-2));
- EXPECT_FALSE(IsPrime(INT_MIN)); //INT_MIN是边界值
-
- // Tests some trivial cases.
- EXPECT_FALSE(IsPrime(0));
- EXPECT_FALSE(IsPrime(1));
- EXPECT_TRUE(IsPrime(2));
- EXPECT_TRUE(IsPrime(3));
-
- // Tests positive input.
- EXPECT_FALSE(IsPrime(4));
- EXPECT_TRUE(IsPrime(5));
- EXPECT_FALSE(IsPrime(6));
- EXPECT_TRUE(IsPrime(23));
- }
-
- class QueueTest : public QuickTest
- { // QueueTest 也继承自QuickTest,由于是测试Queue,进行了部分差异化
- protected:
- Queue<int> q0_;
- Queue<int> q1_;
- Queue<int> q2_;
- void SetUp() override
- {
- QuickTest::SetUp();
- q1_.Enqueue(1);
- q2_.Enqueue(2);
- q2_.Enqueue(3);
- }
- };
-
- //通过 QueueTest完成类Queue的测试,进行代码测试并评估用例的执行时间是否超过5秒
- TEST_F(QueueTest, DefaultConstructor)
- {
- EXPECT_EQ(0, q0_.Size());
- }
-
- // Tests Dequeue().
- TEST_F(QueueTest, Dequeue)
- {
- int* n = q0_.Dequeue();
- EXPECT_TRUE(n == nullptr);
-
- n = q1_.Dequeue();
- EXPECT_TRUE(n != nullptr);
- EXPECT_EQ(1, *n);
- EXPECT_EQ(0u, q1_.Size());
- delete n;
-
- n = q2_.Dequeue();
- EXPECT_TRUE(n != nullptr);
- EXPECT_EQ(2, *n);
- EXPECT_EQ(1u, q2_.Size());
- delete n;
- }
- } // namespace
复制代码 4. 用例执行结果如下
从测试结果来看,所有用例的执行时间都在5秒内:
|
|