• 单元测试框架GoogleTest


    前段时间学习和了解了下Google的开源C++单元测试框架Google Test,简称gtest,非常的不错。 我们原来使用的是自己实现的一套单元测试框架,在使用过程中,发现越来越多使用不便之处,而这样不便之处,gtest恰恰很好的解决了。

    其实gtest本身的实现并不复杂,我们完全可以模仿gtest,不断的完善我们的测试框架, 但最后我们还是决定使用gtest取代掉原来的自己的测试框架,原因是:

    1.不断完善我们的测试框架之后就会发觉相当于把gtest重新做了一遍,虽然轮子造的很爽,但是不是必要的。

    2.使用gtest可以免去维护测试框架的麻烦,让我们有更多精力投入到案例设计上。

    3.gtest提高了非常完善的功能,并且简单易用,极大的提高了编写测试案例的效率。

    断言(Assertion)

    关于断言(ASSERT_X宏)与预期结果(EXPECT_X)的区别,谷歌官方给出了很好的解释:

    • ASSERT_ * versions generate fatal failures when they fail, and abort the current function.
    • EXPECT_ * versions generate nonfatal failures, which don’t abort the current function.
    • Usually EXPECT_* are preferred, as they allow more than one failures to be reported in a test. However, you should use ASSERT_* if it doesn’t make sense to continue when the assertion in question fails.

    翻译成中文,就是断言未通过,断言会中断之后当前测试函数的测试代码(因为之后的测试没有任何意义),而普通的EXPECT会报告出这个错误,仍然会继续执行代码。

    ASSERT_X宏列举如下:

    条件判断:

    ASSERT_TRUE(condition); //条件为真,则通过 
    ASSERT_FALSE(condition);//条件为假,则通过

    值判断:

    ASSERT_EQ(val1,val2); //val1 == val2 
    ASSERT_NE(val1,val2); //val1 != val2 
    ASSERT_LT(val1,val2); //val1 < val2 
    ASSERT_LE(val1,val2); //val1 <= val2 
    ASSERT_GT(val1,val2); //val1 > val2 
    ASSERT_GE(val1,val2); //val1 >= val2

    字符串判断:

    ASSERT_STREQ(str1,str2); //两个char* 字符串有同样的内容 
    ASSERT_STRNE(str1,str2);//两个char* 字符串有不同的内容 
    ASSERT_STRCASEEQ(str1,str2); //两个char* 字符串有同样的内容,忽略大小写 
    ASSERT_STRCASENE(str1,str2); //两个char* 字符串有不同的内容,忽略大小写

    *STREQ* and *STRNE* also accept wide C strings (wchar_t*). If a comparison of two wide strings fails, their values will be printed as UTF-8 narrow strings.

    A NULL pointer and an empty string are considered different.

    预期结果(EXPECT)

    只需将断言(ASSERT)换成预期(EXPECT)即可,用法跟断言完全一致。 
    例子:

    EXPECT_STREQ(str1,str2) //两个char* 字符串有同样的内容


    TEST()与TEST_F()的区别其实并不明显,对于普通的(面向过程)函数测试(不为类的成员函数),直接用TEST即可。 
    TEST_F主要用于混合式测试(非面向过程)。对于类的测试,Google官方建议我们使用继承于testing::Test这个类来实现我们自己的测试类。官方对于队列的测试类如下:

    class QueueTest : public ::testing::Test {
     protected:
      virtual void SetUp() {
        q1_.Enqueue(1);
        q2_.Enqueue(2);
        q2_.Enqueue(3);
      }
    
      // virtual void TearDown() {}
    
      Queue<int> q0_;
      Queue<int> q1_;
      Queue<int> q2_;
    };

    下面为官方给出的测试代码:

    TEST_F(QueueTest, IsEmptyInitially) {
      EXPECT_EQ(0, q0_.size());
    }
    
    TEST_F(QueueTest, DequeueWorks) {
      int* n = q0_.Dequeue();
      EXPECT_EQ(NULL, n);
    
      n = q1_.Dequeue();
      ASSERT_TRUE(n != NULL);
      EXPECT_EQ(1, *n);
      EXPECT_EQ(0, q1_.size());
      delete n;
    
      n = q2_.Dequeue();
      ASSERT_TRUE(n != NULL);
      EXPECT_EQ(2, *n);
      EXPECT_EQ(1, q2_.size());
      delete n;
    }

    对于GoogleTest中提及的Invoke,我们可以认为,这个功能等同于开始全部的测试(因为其函数为RUN_ALL_TESTS()),但本函数只能调用一次,不可重复调用。返回值,0为全部成功,1为有没有通过的测试。

    google test框架与eclipse插件

    1. https://github.com/google/googletest    (google的测试框架)

    2. eclipse测试框架插件

    https://github.com/xgsa/cdt-tests-runner/wiki/Tutorial

    其他参考:http://www.cnblogs.com/coderzh/archive/2009/04/06/1426755.html

    http://www.west999.com/info/html/chengxusheji/C-C--/20180617/4181652.html

  • 相关阅读:
    布局管理器
    下拉列表框
    时间,日期选择器
    关于部分基本控件的使用
    关于Activity
    什么时候修改class
    JavaScript Break 和 Continue 语句
    JavaScript While 循环
    JavaScript For 循环
    JavaScript Switch 语句
  • 原文地址:https://www.cnblogs.com/klb561/p/12219763.html
Copyright © 2020-2023  润新知