J'ai lancé AtCoder. Procon est amusant car c'est un exercice cérébral! Je pensais juste que je le faisais
C'est. Mais je n'ai pas les moyens d'écrire un test unitaire ... Pouvez-vous le vérifier plus facilement ...
Alors j'ai essayé.
L'environnement doit répondre aux conditions suivantes:
--Environnement dans lequel Bash peut être exécuté --Cette fois sous macOS --Langage qui peut être exécuté à partir de la ligne de commande --Cette fois, Java 8 est utilisé --Il devrait être possible de prendre en charge d'autres langues (non vérifiées)
Cette fois, nous allons résoudre le problème suivant à titre d'exemple. A-Bienvenue sur AtCoder
Énoncé du problème
Takahashi souhaite traiter les données. Étant donné les entiers $ a, b, c $ et la chaîne $ s $. Affichez l'entier $ a + b + c $ et la chaîne $ s $ côte à côte.
Entrée
L'entrée est donnée dans le format suivant.
contribution
a
b c
s
--La ligne $ 1 $ reçoit l'entier $ a $$ (1 ≤ a ≤ 1,000) $. --La ligne $ 2 $ reçoit les entiers $ b, c $$ (1 ≤ b, c ≤ 1,000) $. --La ligne $ 3 $ reçoit la chaîne $ s $. La longueur de cette chaîne est supérieure ou égale à 1 $ et inférieure ou égale à 100 $.
Sortie
Imprimez $ a + b + c $ et $ s $ sur la ligne $ 1 $, séparés par des blancs. ** Insérez également un saut de ligne à la fin de la sortie. ** **
Écrivez le scénario de test dans un fichier texte afin de pouvoir saisir le scénario de test dans l'entrée standard.
input.txt
1
2 3
test
Vérifions en utilisant l'exemple de réponse d'AtCoder.
Main.java
import java.util.*;
public class Main {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
//Entrée d'un entier
int a = sc.nextInt();
//Entrez des entiers séparés par des espaces
int b = sc.nextInt();
int c = sc.nextInt();
//Saisie de la chaîne de caractères
String s = sc.next();
//production
System.out.println((a+b+c) + " " + s);
}
}
Tout ce que vous avez à faire est de diriger ce cas de test dans l'entrée standard.
terminal
$ javac Main.java #Compilez parce que c'est Java
$ cat input.txt | java Main #Courir
#Résultat de sortie
6 test
De plus, si vous souhaitez comparer avec l'exemple de sortie, vous pouvez facilement trouver la partie différente en utilisant la commande diff
.
Tout d'abord, créez un fichier texte de l'exemple de sortie.
expected.txt
6 text
Vous pouvez vérifier en exécutant la commande suivante.
terminal
$ javac Main.java #Compilez parce que c'est Java
$ cat input.txt | java Main > output.txt #Courir&Écrire dans un fichier
$ diff -u expected.txt output.txt
#Aucune sortie si correspondance exacte
Tout ce que vous avez à faire est d'écrire ceci dans un script shell et de le mettre en place de manière agréable et vous avez terminé!
test.sh
#!/bin/sh
javac Main.java #Compilez parce que c'est Java
cat input.txt | java Main > output.txt #Courir&Écrire dans un fichier
diff -u expected.txt output.txt
Collectez toutes les structures de répertoires dans le même répertoire comme indiqué ci-dessous.
terminal
$ tree .
├── input.txt
├── expected.txt
└── test.sh
Courir
$ sh test.sh
Voici le script shell que j'ai créé. FYI.
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
Procédez comme suit: Entrez les arguments suivants.
$ sh test.sh ${CLASS_NAME} ${INPUT_TEXTFILE}
or
Lors de la vérification avec l'exemple de sortie
$ sh test.sh -e ${EXPECTED_RESULT_TEXTFILE} ${CLASS_NAME} ${INPUT_TEXTFILE}
$ sh test.sh -e expected.txt Main input.txt
Pour Java, de nombreuses personnes utilisent IntelliJ comme IDE. IntelliJ dispose d'un plug-in pratique appelé CHelper qui peut être utilisé dans Procon, ce qui facilite l'exécution du cas de test qui a été fait cette fois-ci, et vous permet également de spécifier la classe et la méthode utilisées pour l'entrée et la sortie. Si vous voulez faire un ordinateur professionnel en Java, vous devez utiliser ceci ←.
Le temps de réponse est précieux dans Procon, et la vérification est une tâche qui est effectuée plusieurs fois, donc je pense que c'est un must pour pouvoir vérifier rapidement avec un script de cette manière. Je suis heureux que vous puissiez l'utiliser comme référence.
Recommended Posts