Bash コマンドを使用した C++ コードのテスト

Bash コマンドを使用した C++ コードのテスト

プログラミングの問題を読んで、そのためのコードを書いた。ところで、私のアルゴリズムがうまく動作しないようで、別のコードを書いていましたが、それは最適ではありませんが、正しいと思います。

これで、約100個の入力および出力データセットがあり、この入力を2つのC ++プログラムに提供して出力を比較したいと思います。出力に違いがある場合は、私のコードが間違っているかどうかを見てみましょう。

私の問題は、テストケースが多すぎて(約100個)、出力が大きいテキストファイルであるため、直接確認できないことです。 bash関数とコマンドを使用してこれを行う方法を知りたいです。

私の入力テキストファイルは等ですinput1.txtinput2.txt私の出力テキストファイルは入力に似ています。私のプログラムはC ++で書かれています。

答え1

テキストファイルを比較する最良の方法は、次を使用することです。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

上記のコードスニペットが出力を生成する場合は、Expressプログラムに問題があります。 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

私の提案は、テストを実行して比較を実行するmakefileを作成することです(別のターゲットから)。 (8つのスペースを入れたタブを使用してください。)

all_test_inputs = $(wildcard input*.txt)  # relies on GNU make
%.out-slow: %.txt slow-program
        ./slow-program <$< >[email protected]
        mv [email protected] $@
%.out-fast: %.txt fast-program
        ./fast-program <$< >[email protected]
        mv [email protected] $@
%.diff: %.out-slow %.out-fast
        -diff $*.out-slow $*.out-fast >[email protected]
        mv [email protected] $@
# 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すべての入力ファイル(入力ファイルまたは最後から変更されたファイルのみ)を処理し、結果を比較するプログラムを実行します。すべてのテストが正しく実行され、両方のプログラムの出力がすべての場合に同じ場合にのみ、コマンドは成功します。

答え2

prog1プログラムを と でコンパイルし、 からprog2出力を生成すると仮定すると、stdout次のことができます。

#! /bin/bash

for input in input*.txt ; do
  ./prog1 $input > $input.out1
  ./prog2 $input > $input.out2
  if cmp $input.out1 $input.out2 > /dev/null ; then
     echo Programs disagreed on $input
  else
     echo Programs agreed on $input
  fi
done

出力ファイルをバイト単位で比較します。diff比較用として使用することもできます。
すべての実行の出力は、inputX.txt.out1名前が一致しないファイルにあるため、.out2一致しないことを確認できます。

関連情報