如何使用成员 c++ 使用 gtest 测试基于私有类的行为

How to test behavior based on private class using members c++ using gtest

本文关键字:于私 测试 成员 何使用 c++ 使用 gtest      更新时间:2023-10-16

我想用谷歌测试来测试我的类。 假设我有一个状态机实现,并且当前状态是私有的 所以我有一个方法SetNextState,看起来像这样:

void setNextState
{
switch(m_currentState) //m_currentState is a private member
{
case INIT_STATE:
{
if some conditions occurred m_currentState=GO_STATE
} 
......
}
}

所以我有几个案例,每个案例都定义了从某种状态移动到另一种状态的行为。 我的问题: 假设状态仅与此类相关,因此没有输出,我如何对该方法执行测试 如何将其值设置为"GO_STATE"以测试GO_STATE情况 以及如何在测试结束时检查m_currentState 我试图避免在我的UUT代码中放置朋友等,因为我希望它尽可能原始

你没有。您执行与实际程序相同的操作,即提供输入,然后检查结果;你说没有输出,但必须有一些效果,否则类就没有意义了!

如果做不到这一点,你可以让测试成为类的"朋友",以便它可以检查其内部结构,或者为当前状态添加一个不可变的 getter(谁真正关心你的类的用户是否可以看到这一点?(但这两种选择都不符合事情的精神。

根据我的经验,你偶尔会意识到你不再真正进行单元测试,而是功能测试,而Google Test可能不是这项工作的正确工具。如果你的班级像听起来那么大,这里可能就是这种情况。相反,您可以通过将类拆分为较小的块,然后对这些块进行单元测试来帮助自己。取决于你要做什么,真的。

轨道上的轻盈竞赛是正确的。但是,如果有时您觉得测试类的私有成员函数很有用,这通常意味着可以将您的类拆分为多个较小的部分。

如果您认为这些较小的组件对库的客户端没有用,则可以简单地将它们隐藏在detail::命名空间中,然后像往常一样创建单元测试。这将允许您在不污染公共 API 的情况下测试类的内部行为。

经过深思熟虑,我决定用一个帮助程序包装我的UUT,该助手提供set并获取相关的私有成员,并在调用测试API之前在测试过程中使用它

Original code
=============== 
class UUT //That's the actual class I want to test
{
protected: 
int m_protectedMember;
public:
void methodToTest()
{
//Do something with m_protectedMember use its value as input 
//and set it as output 
}
};
In the tester 
==============
class UUTHelper: public UUT
{
public:
int getProtectedMember() { return m_protectedMember; }
void setProtectedMember(int value) { m_protectedMember = value; } 
};

优点:

  • 我的测试代码非常简单,我可以轻松创建复杂的场景。
  • 我在没有任何"朋友"或任何其他操作的情况下测试真实代码。

缺点:

  • 正如讨论中所写,不是最好的"好做法",感动私人成员

谢谢大家:)