Commit abff0bf2 authored by Guillaume Huard's avatar Guillaume Huard
Browse files

Doc en cours d'écriture

parent 00d8e3a5
......@@ -22,9 +22,9 @@ particulier elle permet :
qui ont été produites.
En outre, cette activité est :
- indépendante de tout langage de programmation, la manière dont un programme
soumis par un étudiant doit être pris en charge (compilation, exécution) est indiquée au besoin dans
le fichier de configuration de l'activité ;
- indépendante de tout langage de programmation, la manière dont un programme soumis par un étudiant
doit être pris en charge (compilation, exécution) est indiquée au besoin dans le fichier de
configuration de l'activité ;
- conçue pour limiter les failles de sécurité classiques de VPL :
- si toutes les données concernant une activité sont contenues dans le fichier de configuration
(comme cela est présenté dans cette documentation), rien n'est présent sur le système de fichier
......@@ -178,6 +178,181 @@ différentes sortie ou son code de retour. Cela correspond aux réglages :
** Solution
Un test peut être validé en fournissant une solution au problème posé. La solution sera alors
exécutée dans les même conditions que le programme soumis par l'étudiant (mêmes entrées, mêmes
arguments) et son résultat sera utilisé comme valeurs attendues. Par défaut, seule la sortie
standard produite par une solution est prise en compte. Les réglages correspondant à une solution
sont :
- =solution= : valeur scalaire contenant le code directement exécutable de la solution ou référence
à une table de hachage contenant une description plus complète du programme solution. Nous
reviendrons sur cette seconde forme par la suite, dans la section consacrée à la compilation et
l'exécution ;
- =match= : référence à un tableau contenant une ou plusieurs des valeurs =output=, =error= ou
=code= correspondant aux valeurs produites par la solution dont il faut tenir compte pour le
programme soumis. Par défaut, =match= vaut =[ 'output' ]=. Remarque : si le réglage =output= est
donné en même temps qu'une solution avec =match= contenant =output=, c'est la solution qui est
prise en compte. Il en va de même pour les réglages =error= et =code=.
Exemple :
#+BEGIN_SRC perl :exports code
my $input = q{texte fourni en entrée
à notre programme que nous desirons
tester
};
my $solution=q{#!/bin/bash
cut -d' ' -f$1-$2
};
{
"exercice_cut.sh" => {
tests => {
test_1 => {
input => $input,
args => [ 2, 3 ],
solution => $solution,
match => [ 'output', 'code' ]
}
}
}
}
#+END_SRC
** Validateur
Un validateur est un programme qui détermine si l'exécution d'un programme soumis satisfait ou non
le test concerné. Un validateur est plus général qu'une solution car il ne se contente pas de
reproduire le même calcul mais va aussi examiner les effets de bord du programme soumis, typiquement
dans le système de fichiers. Un validateur est exécuté avec la même entrée et les même arguments que
le programme testé. Il a accès aux fichiers suivant :
- =.program_name.txt= : le nom du programme soumis (et exécuté)
- =.output.txt=, =.error.txt=, =.code.txt= : respectivement la sortie standard, la sortie d'erreur
standard et le code de retour produits par le programme soumis
- =.expected_output=, =.expected_error.txt=, =.expected_code.txt= : respectivement la sortie standard, la sortie d'erreur
standard et le code de retour attendus, donnés respectivement par les réglage =output=, =error= et
=code= ou l'équivalent fourni par le réglage =solution=. Remarque : si l'un de ces réglages n'est
pas donné, le fichier de sortie attendue sera tout simplement absent.
Un validateur est donné par le réglage suivant :
- =validator= : valeur scalaire contenant le code directement exécutable du validateur ou référence
à une table de hachage contenant une description plus complète du programme de validation. Le test
est satisfait par un validateur si le code de retour de ce validateur est nul.
Par exemple, supposons qu'une activité demande à un étudiant de créer le fichier dont le nom est
fourni en premier argument et de lui donner les droits en exécution. Cette activité pourra être
testée de la manière suivante :
#+BEGIN_SRC perl :exports code
my $validator = q{#!/bin/bash
[ -f $1 -a -x $1 ]
};
{
"creer_toto.sh" => {
tests => {
test_1 => {
args => [ "toto.sh" ],
validator => $validator
}
}
}
}
#+END_SRC
** Autre réglages
Les autres réglages associés à un test sont :
- =weight= : poids associé au test dans le cas de test (1 par défaut) ;
- =show= : si ce réglage a une valeur vraie (au sens Perl, non nulle), alors les entrée / sorties du
programme soumis, attendues et du validateur sont montrées à l'étudiant lorsque le test n'est pas
satisfait ;
- =cleanup_level= : plus la valeur est élevée plus les differentes sorties sont nettoyées avant
d'être vérifiées. Plus en détails pour une valeur de :
- 0 : aucun traitement n'est appliqué aux sorties ;
- 1 : supprime les lignes vides au début et à la fin du texte, supprime les séparateurs à la fin
de chaque ligne ;
- 2 (défaut) : comme 1 et supprime en plus les séparateurs en début de lignes, remplace les
tabulations par des espaces et les séquence d'espaces par un seul espace ;
- 3 ou plus : comme 2 et joint les différentes lignes en les séparant par un espace.
- =setup= : valeur scalaire contenant le code directement exécutable d'un programme de mise en place
ou référence à une table de hachage contenant une description plus complète de ce
programme. Est exécuté avant le programme étudiant pour mettre en place tout ce qui doit l'être
(typiquement des fichiers requis par le test).
Voici un exemple synthétique qui reprend les exemples précédents et y ajoute ces derniers réglages :
#+BEGIN_SRC perl :exports code
my $cases = {};
$cases->{"hello_world.sh"} = {
tests => {
test_1 => { output => "Hello world !", show => 1 }
}
};
my $input = q{texte fourni en entrée
à notre programme que nous desirons
tester
};
my $solution=q{#!/bin/bash
cut -d' ' -f$1-$2
};
$cases->{"exercice_cut.sh"} = {
tests => {
test_1 => {
input => $input,
args => [ 2, 3 ],
solution => $solution,
match => [ 'output', 'code' ],
cleanup_level => 0
}
}
};
my $validator = q{#!/bin/bash
[ -f $1 -a -x $1 ]
};
my $setup = q{#!/bin/bash
[ -f $1 ] && rm $1
};
$cases->{"creer_toto.sh"} = {
validator => $validator,
setup => $setup,
tests => {
test_1 => { args => [ "toto.sh" ], weight => 2 },
test_2 => { args => [ "tata.sh" ] }
}
};
$cases;
#+END_SRC
Cela correspond à une activité contenant 3 cas de tests (3 programmes) devant être soumis par
l'étudiant. Vous pouvez remarquer que nous pouvons tirer parti de la syntaxe
Perl pour écrire le fichier, en particulier, la table de hachage globale peut être remplie cas de
test par cas de test afin de rendre le fichier plus lisible.
* Execution et compilation
Tous les programmes manipulés, cas de test, solutions données ou validateurs, peuvent avoir des
contraintes d'exécution (langage imposé, interprétation dans une machine virtuelle) ou peuvent avoir
besoin d'être compilés avant l'exécution. Ceci est géré par un ensemble de réglages applicables
indifféremment à tous ces types de programmes. Attention, les réglages d'un cas de test ne sont pas
pris comme valeur par défaut pour les solutions ou les validateurs qu'ils contiennent (sinon cela
gênerait, par exemple, la réalisation d'une solution en Perl pour un programme en C attendu de la
part de l'étudiant).
** Fichiers
Un programme peut être associé à un ensemble de fichiers source. Ces fichiers peuvent être soumis
par l'étudiant, écrits par l'enseignant ou donnés comme contenu brut dans la configuration de
l'activité et sont gérés par les réglages suivants :
- =files= : référence à un tableau contenant les noms des fichiers impliqués ;
- =content= : valeur scalaire correspondant au contenu de l'un des fichiers. Sera sauvé par défaut dans le
fichier dont le nom est, selon le cas, le nom du cas de test, =.solution= ou =.validator= ;
- =filename= : nom du fichier dans lequel =content= doit être stocké. Est ajouté implicitement à =files=.
** Exécution et compilation
L'exécution et la compilation sont assurés par des programmes qui disposent de deux variables
d'environnement :
- =NAME= : le nom du programme exécutable (à produire ou à exécuter) ;
- =FILES= : l'ensemble des fichiers impliqués (donné par le réglage =files=).
et sont donnés par les réglages suivants, qui sont des programmes permettant :
- =compile= : de produire le programme de nom =NAME=
- =execute= : d'exécuter le programme de nom =NAME=
Bien entendu, même si un contenu scalaire vient plutôt à l'idée pour ces programmes, typiquement
quelques lignes de shell, il peuvent néanmoins être spécifiés plus en détails et être eux même
compilés ou exécutés de manière particulière. Cela peut continuer ainsi sans limite particulière
d'imbrication, la prise en compte de ces réglage étant elle-même récursive.
#+BEGIN_SRC txt :mkdirp yes :tangle Basic_System/vpl_id.txt :exports none
22733
#+END_SRC
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment