如何使用成员 c++ 使用 gtest 测试基于私有类的行为
How to test behavior based on private class using members c++ using gtest
我想用谷歌测试来测试我的类。 假设我有一个状态机实现,并且当前状态是私有的 所以我有一个方法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; }
};
优点:
- 我的测试代码非常简单,我可以轻松创建复杂的场景。
- 我在没有任何"朋友"或任何其他操作的情况下测试真实代码。
缺点:
- 正如讨论中所写,不是最好的"好做法",感动私人成员
谢谢大家:)
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 如何在openssl-ecc中获取十六进制格式的私钥
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- 尽管测试成功,CppUnit测试核心仍被丢弃.为什么
- std::sort / 适用于测试代码,但无法推断出模板
- 测试适用于成员变量的成员函数
- 依赖于网络时的Qt测试
- 如何使用谷歌测试将单一测试应用于所有子类
- 是否可以在main中以类似于Boost.MinimalTestFacility的方式调用Boost.UnitTest测试
- 类似于GoogleTest的C++单元测试工具
- 如何测试从依赖于外部系统的外部基类派生的类
- pocketsphinx的简单示例适用于基本的c测试,但不适用于包含在c++项目中的情况
- 使用gmock测试依赖于QApplication的函数
- 将OpenGL深度测试应用于轨道球体
- 最小化用于远程测试的调试信息的大小
- 如何对依赖于Asio的一段代码进行单元测试
- 如何使用GTest测试严重依赖于MFC的方法?
- 测试一个方法的私有成员是否依赖于时钟时间
- 测试汽车物体相对于世界坐标的碰撞