C++

使用 bash 命令測試 C++ 程式碼

  • January 8, 2012

我讀過一個程式問題,然後我為它寫了程式碼。但我認為我的算法不能正常工作,所以我寫了另一段程式碼,它不是最優的,但我認為是正確的。

現在我有大約 100 個輸入和輸出數據集,我想將此輸入提供給 C++ 程序並比較輸出。如果輸出有差異,我會找出我的程式碼是否不正確。

我的問題是測試案例太多(大約 100 個)並且輸出是大文本文件,我無法自己檢查它們。我想知道如何使用 bash 函式和命令來做到這一點?

我的輸入文本文件是input1.txt,input2.txt等。我的輸出文本文件類似於輸入。我的程序是用 C++ 編寫的。

比較文本文件的最佳方法是使用以下diff命令:

diff output1.txt output1.txt

對於質量比較,您可以diff循環呼叫:

for x in input*.txt; do
 slow-program <"$x" >"$x.out-slow"
 fast-program <"$x" >"$x.out-fast"
 diff "$x.out-slow" "$x.out-fast"
done

如果上面的程式碼片段產生任何輸出,那麼你的快速程序是有問題的。在 bash/ksh/zsh 中,不需要將中間文件儲存在磁碟上。然而,這不一定是一件好事,因為在閒暇時檢查不同的輸出可能很有用。

for x in input*.txt; do
 diff <(slow-program <"$x") <(fast-program <"$x")
done

將輸入和輸出放在單獨的目錄中並執行遞歸差異可能更方便。

for x in inputs/*; do slow-program <"$x" >"slow/${x##*/}"; done
for x in inputs/*; do fast-program <"$x" >"fast/${x##*/}"; done
diff -ru slow fast

我的建議是編寫一個執行測試並執行比較的生成文件(在單獨的目標中)。(在我放置 8 個空格的地方使用製表符。)

all_test_inputs = $(wildcard input*.txt)  # relies on GNU make
%.out-slow: %.txt slow-program
       ./slow-program <$< >$@.tmp
       mv $@.tmp $@
%.out-fast: %.txt fast-program
       ./fast-program <$< >$@.tmp
       mv $@.tmp $@
%.diff: %.out-slow %.out-fast
       -diff $*.out-slow $*.out-fast >$@.tmp
       mv $@.tmp $@
# Test that all diff files are empty
test: $(all_test_inputs:%.txt=%.diff)
       for x in $^; do ! test -s "$x"; done
.PHONY: test

執行make test以處理所有輸入文件(僅針對輸入文件或自上次更改後的程序)並比較結果。當且僅當所有測試都正確執行並且兩個程序的輸出在每種情況下都相同時,該命令才會成功。

引用自:https://unix.stackexchange.com/questions/28629