[JAVA] Eine Lösung, die es einfach macht, Vor- und Nachteile sowie Webtests einzugeben, um die Ergebnisse zu überprüfen

Einführung

Ich habe AtCoder gestartet. Procon macht Spaß, weil es eine Gehirnübung ist! Ich dachte nur, ich mache es

Es ist ärgerlich, den Testfall manuell einzugeben und die Ausgabe zu überprüfen!

Das ist. Aber ich kann es mir nicht leisten, einen Unit-Test zu schreiben ... Können Sie es leichter überprüfen ...

Das ist richtig, warum nicht ein Skript schreiben! !! !! !!

Also habe ich es versucht.

Umgebung

Die Umgebung sollte Folgendes erfüllen:

Testfälle automatisch validieren

Dieses Mal werden wir das folgende Problem als Beispiel lösen. A-Willkommen bei AtCoder

Problemstellung

Herr Takahashi möchte die Daten verarbeiten. Gegeben sind die ganzen Zahlen $ a, b, c $ und die Zeichenfolge $ s $. Zeigen Sie die Ganzzahl $ a + b + c $ und die Zeichenfolge $ s $ nebeneinander an.

Eingabe

Die Eingabe erfolgt im folgenden Format.

Eingang


a
b c
s

Ausgabe

Drucken Sie $ a + b + c $ und $ s $ in die durch Leerzeichen getrennte Zeile $ 1 $. ** Fügen Sie außerdem am Ende der Ausgabe einen Zeilenumbruch ein. ** **.

Schreiben Sie den Testfall in eine Textdatei, damit Sie den Testfall in die Standardeingabe eingeben können.

input.txt


1
2 3
test

Lassen Sie uns anhand der Beispielantwort von AtCoder überprüfen.

Main.java


import java.util.*;
public class Main {
	public static void main(String[] args){
		Scanner sc = new Scanner(System.in);
		//Eingabe einer Ganzzahl
		int a = sc.nextInt();
		//Geben Sie durch Leerzeichen getrennte Ganzzahlen ein
		int b = sc.nextInt();
		int c = sc.nextInt();
		//Eingabe der Zeichenkette
		String s = sc.next();
		//Ausgabe
		System.out.println((a+b+c) + " " + s);
	}
}

Alles, was Sie tun müssen, ist, diesen Testfall in die Standardeingabe zu leiten.

terminal


$ javac Main.java #Da es Java ist, kompilieren Sie es
$ cat input.txt | java Main #Lauf

#Ausgabeergebnis
6 test

Wenn Sie mit dem Ausgabebeispiel vergleichen möchten, können Sie die verschiedenen Teile mit dem Befehl diff leicht finden.

Erstellen Sie zunächst eine Textdatei des Ausgabebeispiels.

expected.txt


6 text

Sie können dies überprüfen, indem Sie den folgenden Befehl ausführen.

terminal


$ javac Main.java #Da es Java ist, kompilieren Sie es
$ cat input.txt | java Main > output.txt #Lauf&In Datei schreiben
$ diff -u expected.txt output.txt

#Keine Ausgabe bei genauer Übereinstimmung

Alles was Sie tun müssen, ist dies in ein Shell-Skript zu schreiben und es auf eine schöne Weise zusammenzusetzen, und Sie sind fertig!

test.sh


#!/bin/sh

javac Main.java #Da es Java ist, kompilieren Sie es
cat input.txt | java Main > output.txt #Lauf&In Datei schreiben
diff -u expected.txt output.txt

Sammeln Sie alle Verzeichnisstrukturen im selben Verzeichnis wie unten gezeigt.

terminal


$ tree .
├── input.txt
├── expected.txt
└── test.sh

Lauf


$ sh test.sh

Abschlussskript

Unten ist das Shell-Skript, das ich gemacht habe. Zu Ihrer Information.

GitHub https://github.com/terappy/auto-test-tool

test.sh


#!/bin/sh

CMDNAME=`basename $0`

# get option
while getopts e: OPT
do
  case $OPT in
    "e" ) FLG_E="TRUE" ; VALUE_E="$OPTARG" ;;
      * ) echo "Usage: $CMDNAME [-e VALUE] PARAMETERS" 1>&2
          exit 1 ;;
  esac
done

# remove option value
shift `expr $OPTIND - 1`

# check the number of arguments
if [ $# -ne 2 ]; then
  echo "Usage: $CMDNAME classname input-file-name" 1>&2
  exit 1
fi

echo "---------------------"
echo "input is":
echo "---------------------"
cat $2

echo ""
echo "---------------------"
echo "output is":
echo "---------------------"
# decide output file name.
OUTFILE_NAME="out-$2"

# compile the target java file.
javac $1.java

# execute with input file and write result into $OUTFILE_NAME
cat $2 | java $1 > $OUTFILE_NAME
cat $OUTFILE_NAME


if [ "$FLG_E" = "TRUE" ]; then
  echo ""
  echo "---------------------"
  echo "verification result":
  echo "---------------------"

  # verification
  if diff -u $VALUE_E $OUTFILE_NAME ; then
    echo "====================="
    echo "All matched!!"
    echo "====================="
  else
    echo "====================="
    echo "Miss matched"
    echo "====================="
  fi
fi

Wie benutzt man

Mach Folgendes: Geben Sie die folgenden Argumente ein.

$ sh test.sh ${CLASS_NAME} ${INPUT_TEXTFILE}

or

Bei der Überprüfung mit dem Ausgabebeispiel


$ sh test.sh -e ${EXPECTED_RESULT_TEXTFILE} ${CLASS_NAME} ${INPUT_TEXTFILE}

Anwendungsbeispiel

$ sh test.sh -e expected.txt Main input.txt

Bonus

Für Java verwenden viele Leute IntelliJ als IDE. IntelliJ verfügt über ein praktisches Plug-In namens CHelper, das in Procon verwendet werden kann. Dies erleichtert die Ausführung des Testfalls, den ich dieses Mal durchgeführt habe, und ermöglicht es Ihnen, die Klasse und Methode für die Eingabe und Ausgabe anzugeben. Wenn Sie einen professionellen Computer in Java erstellen möchten, sollten Sie diesen ← verwenden.

CHelper Referenzseite

Schließlich

Die Beantwortungszeit ist in Procon wertvoll, und die Überprüfung ist eine Aufgabe, die häufig ausgeführt wird. Daher halte ich es für ein Muss, auf diese Weise schnell mit einem Skript überprüfen zu können. Ich bin froh, wenn Sie es als Referenz verwenden können.

Recommended Posts

Eine Lösung, die es einfach macht, Vor- und Nachteile sowie Webtests einzugeben, um die Ergebnisse zu überprüfen
Erstellt eine Bibliothek, die die Handhabung von freigegebenen Android-Einstellungen erleichtert
Ich habe eine GitHub-Aktion erstellt, die es einfach macht, das Ausführungsergebnis von RSpec zu verstehen
Erstellen Sie eine Spring Boot-Webanwendung, die IBM Cloudant verwendet, und stellen Sie sie in Cloud Foundry bereit
Shell-Skript, das ein Docker-Image erstellt und an ECR weiterleitet
Suchen Sie einen geeigneten Wert für eine Methode und machen Sie sie zu einem ValueObject
Eine Lösung für einen Fehler, der Sie verärgert, dass Sie in einer Produktionsumgebung nicht der MySQL-Standardeinstellung ONLY_FULL_GROUP_BY folgen und diese nicht eindeutig ist.
Ich möchte PowerMock in einer Klasse verwenden, die parametrisierte Tests und gewöhnliche Tests kombiniert