c++ 單元測試編譯時錯誤
有沒有辦法測試編譯時錯誤,但沒有實際生成錯誤?例如,如果我建立一個不可複製的類,我想測試一下這個事實:嘗試複製它會生成編譯器錯誤,但是我仍然希望執行其他執行時測試.
struct Foo { int value_; Foo(int value) : value_(value) {} private: Foo(const Foo&); const Foo& operator=(const Foo&); }; int main() { Foo f(12); assert(f.value_ == 12); assert(IS_COMPILER_ERROR(Foo copy(f);)); } // Would like this to compile and run fine.
我想這不能像這樣做,但是有一個慣用的方法來做到這一點,還是應該滾動自己的解決方案(也許使用指令碼編譯單獨的測試檔案和測試結果?)?
N.B .:我只是非拷貝來說明我的觀點,所以我對使用boost :: noncopyable等的回答不感興趣.
你可以使用make做.每個測試都將是一個程式碼段.以下是VC的2個測試工作示例. (我使用2個批處理檔案進行通過測試和失敗測試).我在這裡使用GNU make.
Makefile檔案:
FAILTEST = .\failtest.bat PASSTEST = .\passtest.bat tests: must_fail_but_passes \ must_pass_but_fails must_fail_but_passes: @$(FAILTEST) [email protected] must_pass_but_fails: @$(PASSTEST) [email protected]
must_pass_but_fails.cpp
struct Foo { int value_; Foo(void) : value_(0) {} private: Foo(const Foo&); const Foo& operator=(const Foo&); }; int main() { Foo f(12); return 0; }
must_fail_but_passes.cpp
struct Foo { int value_; Foo(int value) : value_(value) {} private: Foo(const Foo&); const Foo& operator=(const Foo&); }; int main() { Foo f(12); return 0; }
passtest.bat
@echo off cl /nologo %1 >NUL if %errorlevel% == 0 goto pass @echo %1 FAILED :pass
failtest.bat
@echo off cl /nologo %1 >NUL if not %errorlevel% == 0 goto pass @echo %1 FAILED :pass
請注意,cl.exe(即Visual Studio編譯器)需要在您的路徑中才能“正常工作”
玩的開心!
附:我懷疑這樣會讓我著迷:-)
http://stackoverflow.com/questions/605915/unit-test-compile-time-error