I/O redirection technique can be used to semi-automate the testing of text UIs.
Sections below explain how to use that technique in a small project.
Given below re steps to set it up for a project.
Create a folder to hold the relevant files e.g.,
runtest.bat (if you are on Windows) or
runtest.sh (if you are on a *nix OS) into the folder, containing the script below.
@ECHO OFF REM create bin directory if it doesn't exist if not exist ..\bin mkdir ..\bin REM delete output from previous run del ACTUAL.TXT REM compile the code into the bin folder javac -cp ..\src\main\java -Xlint:none -d ..\bin ..\src\main\java\*.java IF ERRORLEVEL 1 ( echo ********** BUILD FAILURE ********** exit /b 1 ) REM no error here, errorlevel == 0 REM run the program, feed commands from input.txt file and redirect the output to the ACTUAL.TXT java -classpath ..\bin Duke < input.txt > ACTUAL.TXT REM compare the output to the expected output FC ACTUAL.TXT EXPECTED.TXT
# create bin directory if it doesn't exist if [ ! -d "../bin" ] then mkdir ../bin fi # delete output from previous run if [ -e "./ACTUAL.TXT" ] then rm ACTUAL.TXT fi # compile the code into the bin folder, terminates if error occurred if ! javac -cp ../src/main/java -Xlint:none -d ../bin ../src/main/java/*.java then echo "********** BUILD FAILURE **********" exit 1 fi # run the program, feed commands from input.txt file and redirect the output to the ACTUAL.TXT java -classpath ../bin Duke < input.txt > ACTUAL.TXT # compare the output to the expected output diff ACTUAL.TXT EXPECTED.TXT if [ $? -eq 0 ] then echo "Test result: PASSED" exit 0 else echo "Test result: FAILED" exit 1 fi
java commands in the script to match the name/location of your main class.
If you are using packages, the two commands need to take the packages into account too.
EXPECTED.txt to the same folder, containing the expected output.
input.txt containing the input commands.
.sh file to execute the test.
The purpose of testing as explained in the previous section is to confirm there are no i.e., there are no unintentional behavior changesregressions. However, we often update the behavior of the program intentionally e.g., enhance an existing feature. Let's look at how to update our test set up in those cases.
Option 1: This is the ideal but more tedious approach.
Option 2: This is a more practical shortcut.
EXPECTED.TXTi.e., we accept that the actual behavior should be the new expected behavior. Rerun the test to confirm that it passes this time.
EXPECTED.TXTlooks exactly the same but the test fails.
dos2unixutility (available in git-bash and *nix operating systems) to convert a file to Unix format.