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