测试对成员变量起作用的成员函数

时间:2019-06-10 00:41:08

标签: c++ googletest

我下面有一个课程Addition

class Addition 
{
private:
    int x;
    int y;
public:
    Addition(int a, int b)
    {
         x = a;
         y = b;
    };
    int AddtwoValues()
    {
          return (x + y);   
    }
};

要测试功能AddtwoValues

#include <limits.h>
#include "gtest/gtest.h"
#include "Addition.h"

class AdditionTest : public ::testing::Test {
 protected:
  virtual void SetUp() {
  }

  virtual void TearDown() {

  }
};

TEST_F(AdditionTest,twoValues){
    Addition addition(5,4);
    EXPECT_EQ(9,addition.AddtwoValues());
    EXPECT_EQ(5,addition.AddtwoValues());
}

以上是测试功能AddtwoValues()的可接受方法。我的问题是,AddtwoValues()的参数是class Addition的成员函数,应该AddtwoValues()进行参数设置吗?这是一个好的编码习惯吗?尤其是当成员变量比两个整数复杂时。

2 个答案:

答案 0 :(得分:2)

无需讨论,为什么要编写一个添加两个值的类,您的Addition类无效。成员函数AddTwoValues被声明为静态的,这意味着它在类级别而不是每个对象上运行。因此,您无法访问被声明为非静态的两个非静态成员xy,因此对于您创建的每个对象都存在。像这样更改代码:

class Addition 
{
private:
    int x;
    int y;
public:
    public Addition(int a, int b)
    {
         x = a;
         y = b;
    }

    int AddtwoValues()
    {
          return x + y;   
    }
};

您应该没事。有关static成员的所有详细信息,请参见此处: https://en.cppreference.com/w/cpp/language/static

关于“最佳实践”:对于一个相当琐碎的任务,只有这么小的例子,很难说,原则上没有什么错,包括测试。

答案 1 :(得分:0)

  

以上是测试功能AddtwoValues()

的可接受方法

从本质上讲,这将是一个非常好的测试,只是您两次调用AddtwoValues(),期望得到不同的结果,这肯定会失败...

  

[S]应AddtwoValues()参数化吗?这是一个好的编码习惯吗?尤其是当成员变量比两个整数复杂时。

我认为,如果要完全覆盖,则应添加至少一秒钟的测试,其中xy的值应不同。否则,代码可能会(偶然)更改为

int AddtwoValues()
{
      return 9;   
}

,您唯一的EXPECT_EQ(9,addition.AddtwoValues());测试用例将通过而不会发现问题。