我認爲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