Bash 명령을 사용하여 C++ 코드 테스트

Bash 명령을 사용하여 C++ 코드 테스트

프로그래밍 문제를 읽고 그에 대한 코드를 작성했습니다. 그런데 내 알고리즘이 제대로 작동하지 않는 것 같아서 또 다른 코드를 작성했는데, 최적은 아니지만 맞다고 생각합니다.

이제 약 100개의 입력 및 출력 데이터세트가 있고 이 입력을 두 개의 C++ 프로그램에 제공하고 출력을 비교하려고 합니다. 출력에 차이가 있으면 내 코드가 잘못된지 알아 보겠습니다.

내 문제는 테스트 케이스가 너무 많고(약 100개) 출력이 큰 텍스트 파일이어서 직접 확인할 수 없다는 것입니다. bash 함수와 명령을 사용하여 이를 수행하는 방법을 알고 싶습니다.

내 입력 텍스트 파일은 등 입니다 input1.txt. input2.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일치하지 않는지 확인할 수 있습니다.

관련 정보