내 프로그램을 테스트하기 위해 쉘 스크립트를 작성하려고 합니다. 이에 대해 몇 가지 기본적인 질문이 있습니다.
목표: 쉘 스크립트는 특정 프로그램을 테스트하고 해당 프로그램이 테스트에 통과하는지 실패하는지 확인할 수 있어야 합니다.
내 접근 방식: 여기서 우리는 두 가지, 즉 프로그램의 입력과 그에 따른 프로그램의 출력을 처리해야 합니다. 이를 위해 mytest.in 및 mytest.out과 같은 I/O 테스트 파일이 있고 이를 테스트에 사용한다고 가정해 보겠습니다.
질문: 내 장애물은 - mytest.in을 프로그램(예: program.c)에 어떻게 전달합니까? 즉, 이 경우 입력 리디렉션을 어떻게 수행할 수 있습니까? 이 작업이 완료되면 어떻게 출력을 얻고 이를 mytest.out의 출력과 비교합니까?
노트:
-> 파일에 제공된 입력은 프로그램이 명령줄을 통해 매개변수를 얻지 못한다고 가정하고 stdin을 통해 제공됩니다.
-> 다음과 같이 쉘 스크립트를 사용한다고 가정합니다.
./testscript tests folder program
이를 증명할 수 있는 예를 들어주시면 좋을 것 같습니다.
답변1
프로그램에 특정 입력이 있습니다.
- 명령줄(
"${inputArgs[@]}"
) - 표준 입력
- (+가능: 암시적 입력 파일, 시스템 상태)
그리고 일부 출력
- 반품 상태(
$?
) - 표준 출력
- 표준 에러
- (+가능: 암시적 출력 파일, 시스템 상태 변경)
괄호로 묶인 입력 및 출력은 체계적으로 테스트하기가 어렵습니다. 이를 피할 수 있다면 테스트 스위트는 기본적으로 다음을 수행해야 합니다(문자 그대로는 아님).
./program "${inputArgs[@]}" < stdin.txt > stdout.txt 2>stderr.txt; status=$?
if [ "$status" -eq "$expectedStatus" ] && cmp stdout.txt expectedStdout.txt && cmp stderr.txt expectedStderr.txt; then
echo OK
else
[ ! $status -eq $expectedStatus ] && echo "Status $status != $expectedSattus"
diff stdout.txt expectedStdout.txt
diff stderr.txt expectedStderr.txt
fi