首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我可以用CxxTest编写自定义断言吗?

我可以用CxxTest编写自定义断言吗?
EN

Stack Overflow用户
提问于 2009-11-24 03:40:26
回答 3查看 454关注 0票数 1

我刚刚开始使用CxxTest,我想测试一下std::vector是否已经正确排序。到目前为止,我的测试如下:

代码语言:javascript
复制
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断言,但是有没有一种方法可以编写自定义断言呢?这将允许我这样做:

代码语言:javascript
复制
void testSort() {
  std::sort(vec.begin(), vec.end()); // This could be any sorting function

  TS_ASSERT_SORTED(vec);
}

当以这种方式编写测试时,更容易看出测试的意图。

我查看了CxxTest user's guide,但无法确定是否可以编写这样的自定义断言。作为替代方案,我可以编写一个类IsSorted并实现它的operator()。然后,我可以像这样编写测试:

代码语言:javascript
复制
void testSort() {
  std::sort(vec.begin(), vec.end()); // This could be any sorting function

  TS_ASSERT_PREDICATE(IsSorted, vec);
}

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-01-24 06:27:59

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

票数 1
EN

Stack Overflow用户

发布于 2009-11-24 04:15:19

这些断言只是预处理器宏,所以你可以随心所欲地实现它们,然后为它们定义一个宏。我认为最好使用不以TS_ASSERT_开头的名称,这样就不会让后来的代码读者感到困惑。

在我看来,谓词版本看起来并不那么笨拙--我可能会这样做,或者可能在您正在测试的类上实现一个check_方法,然后从测试中调用它。不管怎样,我经常需要一些方法来验证类的内部结构,以进行运行时调试和日志记录。

票数 0
EN

Stack Overflow用户

发布于 2009-11-24 03:50:32

您可以使用#define

代码语言:javascript
复制
#define TS_ASSERT_PREDICATE( vec )\
    std::vector tmp = vec;\
    for(int i = 0; i  tmp[i+1]) \
            return false;\ 
    }\ 
    return true;\ 
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1785467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档