2009-01-27 191 views
8

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

回答

2

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

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

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

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

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

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

+1

“你应该接受C++中的编码不像Python中那样快速工作”这种态度正是使用C++仍然很痛苦。 – Slava 2015-07-15 10:31:04

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职能的内容从评论,而不是写了整个事情的分析器。比如(和我只是做了注释语法在这里,有可能会写一个更清洁的方式):我不知道如何CxxTest更强大的方面会得到实现,例如

// 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; 
}; 

作为创建固定设备,但是像这样的东西可能会在C++世界中提供python docstrings和doctests的一致性。

0

我知道把事情置于实际代码注释中的旧技巧(IIRC,这是编程实践的一部分)。但是,简单地将单元测试放在#ifdef块中可能会更容易。通常你可以单独运行预处理器来处理这类事情。我知道one project使用Perl作为超级预处理器。

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上那样完成。

3

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

http://github.com/panyam/DocTestPlusPlus

这是一个Python脚本,通过你的意见去提取测试,并生成测试文件。

仍处于开发和测试阶段。欣赏任何和所有的反馈。

欢呼 斯里兰卡

4

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

它不是用于在注释中编写测试 - 而是直接在生产代码中编写测试。它完全不适合你的需求,但它仍然是C++中最好的选择,没有预处理步骤