[TestResult]
相关文件:TestResult.h,TestResult.cpp
真是千呼万唤始出来啊。TestResult用以收集测试过程中的相关信息,它派生自SynchronizedObject,从而支持多线程。有了前面的铺垫,对TestResult的理解就变得非常容易了。
TestResult维护了一个指向TestListener对象的指针队列:
protected:
typedef std::deque<TestListener *> TestListeners;
TestListeners m_listeners;
为获取到测试相关信息,TestListener需要注册到TestResult中,于是就有了addListener方法:
void TestResult::addListener( TestListener *listener )
{
ExclusiveZone zone( m_syncObject ); // ExclusiveZone终于有用武之地了
m_listeners.push_back( listener );
}
当然还少不了removeListener:
void TestResult::removeListener ( TestListener *listener )
{
ExclusiveZone zone( m_syncObject );
m_listeners.erase( std::remove( m_listeners.begin(),
m_listeners.end(),
listener ),
m_listeners.end());
}
我们再来看看TestResult作为Subject的那些Notify方法:
void TestResult::addError( Test *test, Exception *e )
{
addFailure( TestFailure( test, e, true ) );
}
void TestResult::addFailure( Test *test, Exception *e )
{
addFailure( TestFailure( test, e, false ) );
}
void TestResult::addFailure( const TestFailure &failure )
{
ExclusiveZone zone( m_syncObject );
// 遍历deque<TestListener *>
for ( TestListeners::iterator it = m_listeners.begin();
it != m_listeners.end();
++it )
(*it)->addFailure( failure ); // 调用TestListener的addFailure
}
void TestResult::startTest( Test *test )
{
ExclusiveZone zone( m_syncObject );
// 遍历deque<TestListener *>
for ( TestListeners::iterator it = m_listeners.begin();
it != m_listeners.end();
++it )
(*it)->startTest( test ); // 调用TestListener的startTest
}
void TestResult::endTest( Test *test )
{
ExclusiveZone zone( m_syncObject );
// 遍历deque<TestListener *>
for ( TestListeners::iterator it = m_listeners.begin();
it != m_listeners.end();
++it )
(*it)->endTest( test ); // 调用TestListener的endTest
}
此处的注释足以说明问题,至于error和failure的区别,在讲到TestFailure时自然会明了。
最后再来看看有关shouldStop的代码,该函数曾在TestSuite的run中出现过:
TestResult::TestResult( SynchronizationObject *syncObject )
: SynchronizedObject( syncObject )
{
reset();
}
void TestResult::reset()
{
ExclusiveZone zone( m_syncObject );
m_stop = false;
}
bool TestResult::shouldStop() const
{
ExclusiveZone zone( m_syncObject );
return m_stop;
}
void TestResult::stop()
{
ExclusiveZone zone( m_syncObject );
m_stop = true;
}
没有什么特别的,只是一个m_stop在掌控着一切,而m_stop则是TestResult的一个protected属性的成员变量:
bool m_stop;