我认为Python's doctests的概念非常出色,作为一个实时商店的C++程序员,我非常嫉妒。我们基本上没有单元测试功能,这是一个严重的障碍。我见过C++ Unit等,但是有什么能够从Python的doctests之类的注释中提取测试用例,而不是直接将它们放入代码中?C++等价于Python的doctests?
回答
我刚刚看过doctest,确实很精彩。 Python语言的易用性方法也是如此。
但是,对于C++,您可能不会找到这样的工具。
如果其中一个测试失败,您可能想调试发生了什么。从评论中产生测试案例的来源并不那么容易。相反,在C++的现有单元测试框架中,您可以使用特殊语法来测试源代码,该语法经过编译并易于调试。 此外,来自评论的来源的生成将是另一个额外的(预)编译步骤,这将使生活更加艰难。
您应该接受的一点是,C++中的编码不像Python中那样快速,因此单元测试的难度相似。 另一方面,你有更多的工具,你可以把类型关系的静态断言,例如,这在Python中是不可能的。
简而言之,我认为与现有工具相比,Python ++ doctest for C++的模拟会有很多缺点,因此没有人开始实施它。
如果您真的相信它可以比现有工具更好,请提供一些示例。我几乎不相信真实生活中的情况可以更好用。
我正在考虑从注释中生成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的一致性。
我知道把事情置于实际代码注释中的旧技巧(IIRC,这是编程实践的一部分)。但是,简单地将单元测试放在#ifdef
块中可能会更容易。通常你可以单独运行预处理器来处理这类事情。我知道one project使用Perl作为超级预处理器。
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上那样完成。
您可能会觉得这很有用。我需要在我自己的代码中开始开发。
http://github.com/panyam/DocTestPlusPlus
这是一个Python脚本,通过你的意见去提取测试,并生成测试文件。
仍处于开发和测试阶段。欣赏任何和所有的反馈。
欢呼 斯里兰卡
我刚刚发布doctest - 最轻的功能丰富的C++单头测试框架。
它不是用于在注释中编写测试 - 而是直接在生产代码中编写测试。它完全不适合你的需求,但它仍然是C++中最好的选择,没有预处理步骤
- 1. C#等价于python的struct.pack
- 2. C#等价于Python的os.path.exists()?
- 3. Python等价于C#的选择?
- 4. Python等价于bwmorph
- 5. Python等价于ignoreboth:erasedups
- 6. 等价于C++中的C++
- 7. Python等价于C++邻接表
- 8. C++等价于Tidy
- 9. C++等价于SerializeWithLengthPrefix
- 10. python等价于MATLAB的mxCreateDoubleMatrix
- 11. 等价于python“dir”的Java?
- 12. Python等价于Mathematica的ArrayPlot?
- 13. Python等价于Mathematica的“LaguerreL”
- 14. Perl的等价于python exec?
- 15. python等价于ruby的__method__?
- 16. python等价于MySQL的IFNULL
- 17. python等价于ruby的StringScanner?
- 18. Ruby等价于Python的DictWriter?
- 19. PHP等价于Python的requests.get
- 20. python等价于ruby的`map.with_index`?
- 21. C++等价的Python GETATTR
- 22. python等价的C++ getline()
- 23. C#等价的Python repr()
- 24. C#等价于C++ mem_fun?
- 25. C#等价于C const char **
- 26. getchar()等价于scanf(“%c”)和putchar()等价于printf(“%c”)?
- 27. JavaScript等价于C#的DynamicObject?
- 28. C#等价于Java的Character.digit
- 29. PHP的preg_match()等价于C++?
- 30. C++等价于Java的BlockingQueue
“你应该接受C++中的编码不像Python中那样快速工作”这种态度正是使用C++仍然很痛苦。 – Slava 2015-07-15 10:31:04