Test fonctionnel
Impossible d'accéder à la ressource audio ou vidéo à l'adresse :
La ressource n'est plus disponible ou vous n'êtes pas autorisé à y accéder. Veuillez vérifier votre accès puis recharger la vidéo.
Objectif
Savoir écrire un test fonctionnel.
Mise en situation
Les tests fonctionnels testent directement les fonctionnalités d'un programme du point de vue de l'utilisateur. Pour cela, au lieu de tester une fonction du code source, on va tester une fonctionnalité du programme, par exemple que l'inscription fonctionne correctement sur un site web. Cette manière de tester est moins ancrée dans la technique que les tests unitaires, et plus orientée vers l'expérience utilisateur. On veut s'assurer ici que l'on n'introduit pas de régressions dans le fonctionnement de notre logiciel.
Rappel : Test fonctionnel
Le but d'un test fonctionnel est de vérifier le bon fonctionnement d'une fonctionnalité complète. Le test sera effectué sur une boite noire, c'est-à-dire que les opérations intermédiaires effectuées par la fonctionnalité sont ignorées. Ainsi, contrairement au test unitaire qui étudie le déroulé d'une composante, le test fonctionnel étudie le comportement d'un programme. Il s'agit donc d'un test plus global qui ne sera pas aussi exhaustif que le test unitaire.
Méthode : Comment tester fonctionnellement ?
Pour tester fonctionnellement, il y a deux étapes : le fonctionnement normal et le fonctionnement accidentel.
Le fonctionnement normal assure que la fonctionnalité se comporte correctement dans les grandes lignes sans essayer tous les cas de figures (la combinatoire est en général trop importante).
Le fonctionnement accidentel essaie des scénarios anormaux qui pourraient faire planter le programme.
Fondamental : Programme résistant aux accidents
Un programme que les tests de fonctionnement accidentel ne font pas planter, sera considéré comme un programme résistant aux accidents.
Il arrive également de croiser une terminologie anglaise plus négativement connotée : idiot-proof program
qui fait référence à l'idiotie supposée des entrées testées.
Attention : Loi de Murphy
Selon la Loi de Murphy, Tout ce qui est susceptible d'aller mal, ira mal. Elle est également vraie en programmation car les utilisateurs se trompent parfois dans l'utilisation d'une application. Cette recherche passera très souvent par un usage totalement illogique de la fonctionnalité. Ainsi, tester des cas de figures ridicules permettra d'éviter ce type d'erreurs pouvant parfois être utilisés pour attaquer une application. Par exemple, un utilisateur pourrait entrer « -18 »
dans la case « Age »
pour voir si le programme plantera à cause de l'âge inférieur à 0.
Exemple :
Voici un exemple simplifié de test fonctionnel de transfert d'argent d'une application bancaire.
Ici, deux cas sont essayés :
transférer avec assez de solde,
et transférer sans avoir assez de solde.
Le test fonctionnel sert ici à valider que le transfert échoue si le solde est insuffisant.
/** JavaScript : teste fonctionnellement le transfert d'argent. */
function checkAccount (account, amount) {
if (account.balance >= amount) {
return true
}
return false
}
function transfer (srcAccount, tgtAccount, amount) {
// Copies des variables
const newSrcAccount = { srcAccount }
const newTgtAccount = { tgtAccount }
if (checkAccount(newSrcAccount, amount)) {
newSrcAccount.balance = newSrcAccount.balance - amount
newTgtAccount.balance = newTgtAccount.balance + amount
console.log('Transfert réussi')
} else {
console.log('Echec du transfert')
}
return [newSrcAccount, newTgtAccount]
}
function testTransfer () {
let srcAcc = { owner: 'Jean Dupont', balance: 100 }
let tgtAcc = { owner: 'Anne Martin', balance: 20 }
let transferRes = transfer(srcAcc, tgtAcc, 60)
srcAcc = transferRes[0]
tgtAcc = transferRes[1]
// Transfert réussi
if (srcAcc.balance !== 40 || tgtAcc.balance !== 80) {
console.log('Test transfer échoué lors du premier transfert.')
return false
}
transferRes = transfer(srcAcc, tgtAcc, 60)
srcAcc = transferRes[0]
tgtAcc = transferRes[1]
// Transfert échoué donc les comptes doivent être inchangés
if (srcAcc.balance !== 40 || tgtAcc.balance !== 80) {
console.log('Test transfer échoué lors du second transfert.')
return false
}
console.log('Test réussi')
return true
}
testTransfer()
"""Python : teste fonctionnellement le transfert d'argent. """
def check_account(account, amount):
if account["balance"] >= amount:
return True
else:
return False
def transfer(src_account, tgt_account, amount):
new_src_account = src_account.copy()
new_tgt_account = tgt_account.copy()
if check_account(new_src_account, amount):
new_src_account["balance"] = new_src_account["balance"] - amount
new_tgt_account["balance"] = new_tgt_account["balance"] + amount
print("Transfert réussi")
else:
print("Echec du transfert")
return new_src_account, new_tgt_account
def test_transfer():
src_acc = {"owner": "Jean Dupont", "balance": 100}
tgt_acc = {"owner": "Anne Martin", "balance": 20}
src_acc, tgt_acc = transfer(src_acc, tgt_acc, 60)
# Transfert réussi
if src_acc["balance"] != 40 or tgt_acc["balance"] != 80:
print("Test transfer échoué lors du premier transfert.")
return False
src_acc, tgt_acc = transfer(src_acc, tgt_acc, 60)
# Transfert échoué donc les comptes doivent être inchangés
if src_acc["balance"] != 40 or tgt_acc["balance"] != 80:
print("Test transfer échoué lors du premier transfert.")
return False
print("Test réussi")
return True
test_transfer()
Rappel : Tester les entrées/sorties
Tester les entrées/sorties d'un programme est souvent une tâche complexe.
Ces tests sont facilités par les frameworks de test.
Les développeurs ont recours à des mocks, qui simulent des réponses de bases de données ou de serveurs.
Complément : Test d'intégration
Un test d'intégration vérifie que la communication de plusieurs fonctions se fait comme prévue. Il contrôle les assemblages de fonctions.
À retenir
Les tests fonctionnels sont des tests globaux qui testent le comportement d'une fonctionnalité.
Il est nécessaire de tester des valeurs correctes ainsi que des valeurs intentionnellement fausses afin que les fonctionnalités soient résistantes aux usages imprévus.
Pour développer des tests pour des projets de grande envergure il est nécessaire d'utiliser un framework de test.
Impossible d'accéder à la ressource audio ou vidéo à l'adresse :
La ressource n'est plus disponible ou vous n'êtes pas autorisé à y accéder. Veuillez vérifier votre accès puis recharger la vidéo.