【问题标题】:Unit testing large non-member functions单元测试大型非成员函数
【发布时间】:2010-09-22 22:23:23
【问题描述】:

我有一个函数,我想对其进行测试。但是,它非常大并且创建了一个有限状态机。函数大致如下:

std::auto_ptr<IFiniteStateMachine> CreateFSM() 
{
    std::auto_ptr<IFiniteStateMachine> = apFSM( new CFiniteStateMachine() );

    std::list<IState*> listStates;

    listState.push_back( new CStateFoo( /*params*/ ) );
    listState.push_back( new CStateBar( /*params*/ ) );

    // etc.

    apFSM->AddState( listStates );

    // Define the transition table
    // 1st param: event received
    // 2nd param: current state
    // 3rd param: next state
    apFSM->AddTransition( "EventA", "StateFoo", "StateBar" );

    // etc.

    return apFSM;
}

基本上,这个函数只是创建一个 FSM、状态和转换表。每个单独的组件(IFiniteStateMachine 和 IState 类)都是可测试的。

所以我的问题是:可以对这样的功能进行测试吗?我不确定您如何验证此功能是否按预期工作。我可能可以把它分成更小的函数来创建状态和转换。但是,刚刚创建这些状态的函数似乎也相当复杂且难以测试。

谢谢。

【问题讨论】:

  • 你能根据生成的 FSM 中转换中状态的存在来编写断言吗?
  • 有什么方法可以在 C++ 中使用模拟对象?模拟对象通常有助于测试这样的事情。
  • @Kaleb:没错,但我将如何使用 Mock 对象?在测试中,我必须调用 CreateFSM()。我无法使用依赖注入。
  • @Steve:这就是我的倾向。我想我想知道是否有更简单的方法来测试它(或者我只是想多了)。

标签: c++ unit-testing


【解决方案1】:

问问自己,函数运行后应该是什么?听起来在这种情况下应该有某个状态机 - 所以这就是您应该检查的内容,以便您可以执行以下操作:

FSM expectedFSM = Factory.blankFSM().addState().addTransition().... etc
FSM actualFSM = CreateFSM();
ASSERT(expectedFSM == actualFSM); //assuming such == exists

或者有时更简单的方法是使用字符串表示/序列化:

String expectedFSMStr = loadFSMFromFile(expectedOutput1);
FSM actualFSM = CreateFSM();
ASSERT_EQUALS(expectedFSMStr, actualFSM.toString());

如果您的类有可靠的 toStrinb/序列化方法,这可以更容易调试并且非常有用。

【讨论】:

    猜你喜欢
    • 2012-03-02
    • 2017-07-19
    • 2014-05-13
    • 2021-12-17
    • 2017-04-12
    • 2021-11-05
    • 1970-01-01
    • 2020-06-08
    • 1970-01-01
    相关资源
    最近更新 更多