兼听者部分(Listener)


这部分较为简单,主要根据具体需求,提供了两个TestListener的派生类,它们分别用在不同的场合。

[TestSucessListener]

相关文件:TestSucessListener.h,TestSucessListener.cpp

派生自TestListener和SynchronizedObject(多重继承),兼具两者特性。作为一个实际的Observer,接收来自TestResult的信息,用以“监听”测试是否成功。关于TestListener、SynchronizedObject以及TestResult请见core部分的说明。

TestSucessListener内部所持有的成员变量m_sucess标示了测试成功与否,至于究竟如何“监听”,不妨来看一下TestSucessListener的相关实现:

TestSucessListener::TestSucessListener( SynchronizationObject *syncObject )
    : SynchronizedObject( syncObject )
    , m_sucess( true )
{
}

在ctor中,m_sucess被初始化为true。至于syncObject,则提供了同步功能,为后续调用ExclusiveZone提供便利。

void TestSucessListener::addFailure( const TestFailure &failure )
{
  ExclusiveZone zone( m_syncObject );
  m_sucess = false;
}

在测试发生错误时,TestResult将会调用TestSucessListener的addFailure,后者只是简单地将m_sucess设置为false。TestSucessListener只关心测试成功与否,至于有关测试结果的详细情况则由TestResultCollector负责“监听”,关于TestResultCollector请见output部分。因为要考虑多线程环境,所以用到了ExclusiveZone,这也是为什么TestSucessListener需要继承SynchronizedObject的原因(别忘了ExclusiveZone是protected属性的)。m_syncObject就是前面ctor中提到的syncObject。

void TestSucessListener::reset()
{
  ExclusiveZone zone( m_syncObject );
  m_sucess = true;
}

顾名思义,在测试运行之前reset内部状态,将m_sucess置为true。

最后,为外部提供测试成功与否的查询接口也是必不可少的:

bool TestSucessListener::wasSuccessful() const
{
  ExclusiveZone zone( m_syncObject );  // [此处是read操作,似不必劳驾ExclusiveZone]
  return m_sucess;
}

[TextTestProgressListener]

相关文件:TextTestProgressListener.h,TextTestProgressListener.cpp

派生自TestListener,用来“监听”测试用例的运行状态,并将结果定向到标准错误输出设备(即屏幕)。作为一个简易的文本流方式的结果输出工具,TextTestProgressListener已是绰绰有余了。

// 继承自基类的虚函数,在测试运行前被调用
void TextTestProgressListener::startTest( Test *test )
{
  std::cerr << ".";
  std::cerr.flush();
}

// 继承自基类的虚函数,运行测试失败时被调用
void TextTestProgressListener::addFailure( const TestFailure &failure )
{
  std::cerr << ( failure.isError() ? "E" : "F" );
  std::cerr.flush();
}

// 在测试运行后被调用[疑为endTest,也许是作者的疏忽]
void TextTestProgressListener::done()
{
  std::cerr  <<  std::endl;
  std::cerr.flush();
}

[TextTestResult]

相关文件:TextTestResult.h,TextTestResult.cpp

以文本流方式输出测试运行的结果。不过该类在新版本中已被标上了“DEPRECATED”,并被TextTestProgressListener和TextOutputter(在outputter部分讲解)所取代。因为是不推荐使用的,所以此处不准备细述了,感兴趣的读者可以自己看。

返回目录