[JAVA] Une solution qui facilite la saisie des avantages et des tests Web pour vérifier les résultats

introduction

J'ai lancé AtCoder. Procon est amusant car c'est un exercice cérébral! Je pensais juste que je le faisais

C'est ennuyeux d'entrer manuellement le cas de test et de vérifier la sortie!

C'est. Mais je n'ai pas les moyens d'écrire un test unitaire ... Pouvez-vous le vérifier plus facilement ...

C'est vrai, pourquoi ne pas écrire un script! !! !! !!

Alors j'ai essayé.

environnement

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)

Valider automatiquement les cas de test

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

Script d'achèvement

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

Comment utiliser

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}

Exemple d'utilisation

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

prime

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 ←.

Site de référence CHelper

finalement

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

Une solution qui facilite la saisie des avantages et des tests Web pour vérifier les résultats
Création d'une bibliothèque qui facilite la gestion des préférences partagées Android
J'ai créé une action GitHub qui facilite la compréhension du résultat de l'exécution de RSpec
Créez une application Web Spring Boot qui utilise IBM Cloudant et déployez-la sur Cloud Foundry
Script Shell qui construit une image Docker et la pousse vers ECR
Trouvez une valeur pratique pour avoir une méthode et en faire un ValueObject
Une solution à une erreur qui vous met en colère parce que vous ne suivez pas le paramètre par défaut de MySQL ONLY_FULL_GROUP_BY en production et qu'il n'est pas unique
Je souhaite utiliser PowerMock dans une classe qui combine des tests paramétrés et des tests ordinaires