2011-04-09 43 views
2

我想重寫一些遺留的C代碼,並想在實際開始重寫之前進行一些測試。爲了這個,我看了看CppUTest並試圖組成一個頭文件chrtostr.h的一個示例應用程序,實現文件chrtostr.c和測試文件名爲其內容羅列如下test_chrtostr.cCppUTest不工作​​

#include <CppUTest/CommandLineTestRunner.h> 

#include "chrtostr.h" 

TEST_GROUP(chrtostr) 
{ 
} 

TEST(chrtostr, test_chrtostr) 
{ 
    CHECK_EQUAL(chrtostr('n'), "sfsdfds"); 
} 

int main(int ac, char **av) 
{ 
    return CommandLineTestRunner::RunAllTests(ac, av); 
} 

和相應的Makefile.am

AUTOMAKE_OPTIONS = foreign 

CPPUTEST_HOME = ./cpputest 
CFLAGS = -g -Wall -I$(CPPUTEST_HOME)/include 
LDFLAGS = -L$(CPPUTEST_HOME)/lib -lCppUTest 

bin_PROGRAMS = chrtostr test_chrtostr 
chrtostr_SOURCES = chrtostr.c chrtostr.h main.c 
test_chrtostr_SOURCES = test_chrtostr.c 

的問題是,每次我嘗試運行make我得到以下回溯,它實際上並不幫助我太多:http://pastebin.com/BK9ts3vk

回答

2

該測試驅動程序是用C++編寫的。您需要將它編譯爲C++,因此請將文件重命名爲.cpp,並確保調用g++來驅動編譯/鏈接(而不是gcc)。

+0

格兒,那麼爲什麼他們主張它作爲一個C和C++單元測試框架?謝謝你! – hyperboreean 2011-04-09 10:24:27

+0

因爲你可以用它來測試C代碼。 – Mat 2011-04-09 10:25:14

+0

是的,但是如果我有純粹的C代碼,我只想用gcc編譯*而不是g ++,那麼這是一種痛苦。 C和C++不是同一種語言。 – hyperboreean 2011-04-09 10:28:10

5

您應該首先獲取其中一個演示。您可以看到CppUTest如何與C一起使用。我的書「嵌入式C的測試驅動開發」將幫助您開始。前幾章使用C-Only測試工具。後來的例子使用CppUTest(我是CppUTest的作者之一)。我還描述了C++測試工具的優勢,爲C.

詹姆斯

P.S. - 有關CppUTest的更多信息,請參見CppUTest.org

+0

順便說一句:CppUTest有它自己的makefile。因此,構建它的最簡單方法是從根運行make。然後去看例子。 – 2011-04-11 13:24:35

+0

對C使用C++測試工具還存在一個問題:如果在實際測試運行之前(在setup()上)必須設置很多狀態,那麼您必須在C++中執行此操作,對嗎?感謝指針也。 – hyperboreean 2011-04-28 19:48:59

+0

您可以在C中進行設置。在此頁面的另一條評論中,我提到必須在外部「C」塊中聲明來自C++的c引用。 – 2011-07-27 20:25:05

1

不幸的是,CppUTest中的「HelloWorld」示例未記錄,而「嵌入式C的測試驅動開發」中的附錄僅列出了11個條件檢查,我發現還有更多的無證助手功能(幾乎沒有記錄)。除非你想了解TDD的概念,否則我不會推薦CppuTest。

我會尋找更多的商業產品,或者你會挑起很多不良的TDD習慣,或者非常沮喪,繼續前進。

+0

你對商業產品有什麼建議嗎? – 2011-09-19 19:03:27

0

我只是看着這個。你的代碼有幾個問題。 C++錯誤並不總是有助於清除它們。

我在我修好之前添加了評論。

#include "CppUTest/TestHarness.h" 

//The test file is c++. YOu have to tell it when you are linking to C code 
extern "C" 
{ 
#include "chrtostr.h" 
} 

//A test group needs to have a ';' after it. Under the hood, this macro 
//create a base class for the test cases of the same name 
TEST_GROUP(Chrtostr) 
{ 
}; 

//CHECK_EQUAL uses ==. STRCMP_EQUAL actually compares c-strings 
TEST(Chrtostr, wrong) 
{ 
    STRCMP_EQUAL(chrtostr('n'), "sfsdfds"); 
} 
+0

感謝James的評論。事實是,我還沒有做出任何行動 - 我想重構的項目與文件系統有很多互動,我正在考慮git的測試方法,那就是基於TAP的框架。使用CppUTest將意味着很多C++設置代碼才能開始測試。我仍然試圖將事情保持平衡並找出最佳的行動方案。再次感謝! – hyperboreean 2011-07-24 07:18:10