Kmelia - Le test
Exemple support
Originalité
Construction de cas de test et paramétrage
Caractéristiques de l'exécution du test (trouver un nom pour ce machin !)
états
traces
assertions
exceptions
résultat (retour)
Verdict se basant sur le test
pass/fail/irrelevant
responsabilité ( programme, source de donnée)
confiance (exception lourde (div/0), assertions, boucle inf …)
Utilisation variable de l'observation de l'exécution du test selon l'objectif
validation du prog/ sources données
Validation des cas de test par mutation ( pas de comparaison des traces, par exemple)
test de non régression (pas de comp de traces non plus, contrats éventuellement altérés) ⇒ sens des implications
Particularités vis a vis de Baudry/traon
: contrat <> oracle :
oracle = CP (contrat du programme) + CT (contrat spécifique au cas de test).
CP n'a pas vocation à être améliorée si ce n'est après avoir corrigé une erreur.
CT (initialement vide ou remplie manuellement) peut être améliorée suite à l'analyse de mutation.
Pour des raisons de généralité, d'ouverture (le composant n'est pas dans un monde clos), et de substituabilité, il est normal de sous-spécifier les contrats de CP (alors que les CT doivent être les plus précis possibles pour être efficaces)
Mutation
niveau modèle
opérateurs classiques,
opérateurs sur le LTS
partir de fautes plutôt que d'opérateurs élémentaires pour tenter de réduire l'explosion combinatoire
Nouvelle Version : mutations du modèle et pas du java
que teste-t'on ?
⇒ les post sont des oracles (elles sont donc supposées correctes (jusqu'à l'analyse de mutation?) )
l'échec d'un test signifie donc que - la pre n'est pas suffisante pour assurer la post, ou bien que le déroulement possède une erreur
De quoi dispose t'on :
des modèles Kmelia
de code Java permettant d'initialiser un composant et d'exécuter un service (pour l'instant avec des bouchons pour les communications)
les services peuvent dire si leur pre est vérifiable, et si oui, si des données la satisfont (partiellement pour les requis actuellement)
les services peuvent dire si leur post est vérifiable, et si oui, si des données la satisfont (faux pour les requis)
les services ne modifient pas leurs paramètres
les composants peuvent dire si leur invariant est vérifiable, et si oui, si des données le satisfont
d'un mode d'exécution pas à pas assez sommaire
test passé si :
le service termine (il faut pouvoir interrompre le service s'il est “manifestement” en boucle infinie du fait d'une mutation) sans déclencher d'exception
les services appelés le sont dans le respect de leur pre condition (Exception sinon)
la post du service est respectée (vérifié à la fin)
l'invariant du service est respecté (vérifié à chaque état des zones interruptibles du service et à la fin)
les paramètres d'appel du service (conformes à la pre)
les réceptions de services (conformes à la post du requis : peut dépendre des entrées, du contexte virtuel …)
Mutations sur le modèle
mutations cohérentes du LTS :
par catégories :
gardes
actions élémentaires
modification effectuées :
peut on se permettre de modifier le déroulement du LTS et des comms ? Il faudrait le faire de façon a n'introduire ni deadlock, ni boucles infinies. C'est très limitant. et dur a détecter. Plus tard ….
Vieille version
Sujet
Bankaccount,
service transaction supposé unique
Protocole simple
utilisation des gardes pour partitionner le domaine
Mutations
pour la generation de mutation, pourrait on prévoir une annotation à mettre sur les methodes concernées par la mutation (ou à ne pas muter) ?
est il raisonnable de muter le lts (et pas seulement ses actions) ?
si oui, quelles mutations seraient pertinentes ?
A ajouter à la génération