2009-01-27 238 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++中最好的選擇,沒有預處理步驟