C ++相当于Python的doctests?

时间:2009-01-27 20:50:41

标签: c++ doctest

我认为Python's doctests的概念非常出色,作为实时商店的C ++程序员,我非常嫉妒。我们基本上没有单元测试能力,这是一个严重的障碍。我已经看过C ++ Unit等,但有没有什么可以从Python的doctests中提取测试用例而不是直接将它们放在代码中?

6 个答案:

答案 0 :(得分:8)

我刚刚发布了doctest - 功能最丰富的C ++单头测试框架。

不是在评论中编写测试 - 而是直接在生产代码中编写测试。它不能完全满足您的需求,但它仍然是没有预处理步骤的C ++中的最佳选择

答案 1 :(得分:4)

您可能会觉得这很有用。在我自己的代码中需要这个后,我开始开发它。

http://github.com/panyam/DocTestPlusPlus

这是一个python脚本,可以查看您的注释并提取测试并生成测试文件。

仍在开发和测试中。感谢所有反馈。

欢呼声 斯

答案 2 :(得分:1)

我刚刚看过doctest,确实很棒。 Python语言的易用性方法也是如此。

但对于C ++,您可能找不到这样的工具。

如果其中一个测试失败,您可能需要调试发生的情况。从评论中生成测试用例的源代码并不容易。相反,在现有的C ++单元测试框架中,您可以使用特殊语法来测试源代码,该语法经过编译且易于调试。 此外,从评论中生成源代码将是另一个额外的(预)编译步骤,这将使生活更加艰难。

您应该接受C ++中的编码不像Python中那样快速,因此单元测试同样有点困难。 另一方面,你有更多的工具,你可以为类型关系设置静态断言,例如,这在Python中是不可能的。

简而言之,我认为与现有工具相比,Python doctest for C ++的模拟会有很多缺点,没有人开始实现它。

如果您确实认为它可能比现有工具更好,请提供一些示例。我几乎不相信有真实的生活情况可以更有用。

答案 3 :(得分:0)

我正在考虑从评论中生成CxxTest文件。我没有使用过该框架,但看起来很有希望。从他们的manual开始,单元测试文件看起来像这样:

 // MyTestSuite.h
 #include <cxxtest/TestSuite.h>

 class MyTestSuite : public CxxTest::TestSuite 
 {
 public:
    void testAddition( void )
    {
       TS_ASSERT( 1 + 1 > 1 );
       TS_ASSERT_EQUALS( 1 + 1, 2 );
    }
 };

我的提议是一个解析器,它从注释中提取这些testX函数的内容,而不是必须编写整个内容。例如(我只是在这里编写注释语法,可能有更简洁的方法来编写它):

// MyRegularCode.cpp

/// Description of the function here
/// Then test case below that gets extracted
/// and turned into CxxTest .h files
/**testAddition
MyClass mc;
mc.MyFunction();
TS_ASSERT( mc.m_value > 1 );
TS_ASSERT_EQUALS( mc.m_value, 3 );
**/
void MyClass::MyFunction()
{
    m_value = 3;
};

我不确定如何实现CxxTest更强大的方面,例如创建fixture,但是这样的东西可能提供了C ++世界中python docstrings和doctests的结合。

答案 4 :(得分:0)

我知道将旧内容放入实际代码注释中的旧技巧(IIRC,这是编程实践的一部分)。但是,将单元测试简单地放在#ifdef块中可能更容易。对于这类事情,您通常可以单独运行预处理器。

然后,我知道one project使用Perl作为超级预处理器。

答案 5 :(得分:0)

Fost附带的测试框架确实处理了类似的事情。测试不会嵌入到文档中,但它们可以与他们测试的代码并列。在结构上,测试看起来与cxxtest代码非常相似。

#include "myclass.hpp"
#include <fost/test>

FSL_TEST_SUITE( myclass );

/*
    Your documentation
*/
FSL_TEST_FUNCTION( constructors ) {
    fostlib::test::default_constructable< myclass >();
}
myclass::myclass() {
}

FSL_TEST_FUNCTION( some_method ) {
    myclass instance;
    FSL_CHECK_NOTHROW( instance.some_method(0) );
    FSL_CHECK_EQ( instance.some_method(2), 2 );
    FSL_CHECK_NEQ( instance.some_method(-2), 0 );
}
int myclass::some_method( int arg ) {
    // implementation
}

所有这些都是通过嵌入测试编译的(你可以通过#define从构建中删除它们 - 没有实现,但很容易做到)。然后,测试通过一个单独的程序运行,该程序加载已构建的.DLL或.so,找到测试并运行它们。

我们没有尝试过,但它应该可以与静态库一起使用,并动态加载和运行Windows上的.EXE文件中的测试,但是我不太确定它是否可以在Linux或Mac上完成。< / p>