2009-11-23 57 views
1

我刚开始使用CxxTest,并想测试一个std :: vector是否已正确排序。下面是我的测试,到目前为止:我可以在CxxTest中编写自定义断言吗?

void testSort() { 
    std::sort(vec.begin(), vec.end()); // This could be any sorting function 

    for (unsigned int i = 0; i < vec.size() - 1; ++i) { 
    TS_ASSERT(vec[i] <= vec[i + 1]); 
    } 
} 

显然,CxxTest不提供TS_ASSERT_SORTED断言,但有编写自定义断言的方法吗?这将允许我这样做:

void testSort() { 
    std::sort(vec.begin(), vec.end()); // This could be any sorting function 

    TS_ASSERT_SORTED(vec); 
} 

当用这种方式来写这个测试时,看到测试的目的是非常容易的。

我查看了CxxTest user's guide,但无法弄清楚是否可以编写像这样的自定义断言。作为一种选择,我可以写一个IsSorted类并执行它的operator()。然后我可以写这样的测试:

void testSort() { 
    std::sort(vec.begin(), vec.end()); // This could be any sorting function 

    TS_ASSERT_PREDICATE(IsSorted, vec); 
} 

我猜这是正确的做法。但是,如果我这样做,我应该将class IsSorted的定义放在它自己的头文件中,与我的测试套件分开吗?我仍然试图找出与单元测试相关的最佳实践,特别是在这个框架中。

最后一个问题:我应该在setUp()方法中还是在测试本身中排序向量?

回答

1

您可以通过更改cxxtest头文件来添加一些新的宏。毕竟它是开源的!确保从这些宏中正确地测试失败(请参阅TS_ASSERT_EQUALS的操作,与martiert给出的示例不兼容cxxtest的工作方式)。

-1

你可以使用的#define


#define TS_ASSERT_PREDICATE(vec)\ 
    std::vector tmp = vec;\ 
    for(int i = 0; i tmp[i+1]) \ 
      return false;\ 
    }\ 
    return true;\ 
} 
+1

'TS_ASSERT'宏必须做的不仅仅是返回一个bool ...否则,当测试失败时如何输出变量值? – ThisSuitIsBlackNot 2009-11-23 19:57:24

0

那么,断言都只是预处理宏,所以你很可能实现它们不过你想要的,然后#定义为他们的宏。我认为最好使用不以TS_ASSERT_开头的名称,以免后面的代码读者感到困惑。

谓词版本看起来并不那么笨拙 - 我可能会这样做,或者可能在您正在测试的类上实现check_方法,然后从测试中调用它。我经常最终需要验证类的内部结构以用于运行时调试&日志记录的方法,无论如何...

相关问题