CherryPy - Test
Le test est un processus au cours duquel l'application est conduite sous différents angles afin de -
- Trouvez la liste des problèmes
- Trouvez les différences entre le résultat attendu et réel, la sortie, les états, etc.
- Comprenez la phase de mise en œuvre.
- Trouvez l'application utile à des fins réalistes.
Le but des tests n'est pas de mettre le développeur en faute mais de fournir des outils et d'améliorer la qualité pour estimer l'état de santé de l'application à un moment donné.
Les tests doivent être planifiés à l'avance. Cela nécessite de définir l'objectif des tests, de comprendre la portée des cas de test, de dresser la liste des besoins métiers et d'être conscient des risques impliqués dans les différentes phases du projet.
Les tests sont définis comme une gamme d'aspects à valider sur un système ou une application. Voici une liste descommon test approaches -
Unit testing- Ceci est généralement effectué par les développeurs eux-mêmes. Cela vise à vérifier si une unité de code fonctionne comme prévu ou non.
Usability testing- Les développeurs peuvent généralement oublier qu'ils écrivent une application pour les utilisateurs finaux qui ne connaissent pas le système. Les tests d'utilisabilité vérifient les avantages et les inconvénients du produit.
Functional/Acceptance testing - Alors que les tests d'utilisabilité vérifient si une application ou un système est utilisable, les tests fonctionnels garantissent que chaque fonctionnalité spécifiée est mise en œuvre.
Load and performance testing- Ceci est effectué pour comprendre si le système peut s'adapter aux tests de charge et de performance à effectuer. Cela peut entraîner des modifications du matériel, l'optimisation des requêtes SQL, etc.
Regression testing - Il vérifie que les versions successives d'un produit ne cassent aucune des fonctionnalités précédentes.
Reliability and resilience testing - Les tests de fiabilité aident à valider l'application du système avec la panne d'un ou plusieurs composants.
Test unitaire
Les applications Photoblog utilisent constamment des tests unitaires pour vérifier les éléments suivants:
- Les nouvelles fonctionnalités fonctionnent correctement et comme prévu.
- Les fonctionnalités existantes ne sont pas interrompues par la nouvelle version du code.
- Les défauts sont corrigés et restent fixes.
Python est livré avec un module standard unittest offrant une approche différente des tests unitaires.
Test de l'unité
unittest est enraciné dans JUnit, un package de test unitaire Java développé par Kent Beck et Erich Gamma. Les tests unitaires renvoient simplement des données définies. Des objets simulés peuvent être définis. Ces objets permettent de tester par rapport à une interface de notre conception sans avoir à s'appuyer sur l'application globale. Ils fournissent également un moyen d'exécuter des tests en mode isolement avec d'autres tests inclus.
Définissons une classe factice de la manière suivante -
import unittest
class DummyTest(unittest.TestCase):
def test_01_forward(self):
dummy = Dummy(right_boundary=3)
self.assertEqual(dummy.forward(), 1)
self.assertEqual(dummy.forward(), 2)
self.assertEqual(dummy.forward(), 3)
self.assertRaises(ValueError, dummy.forward)
def test_02_backward(self):
dummy = Dummy(left_boundary=-3, allow_negative=True)
self.assertEqual(dummy.backward(), -1)
self.assertEqual(dummy.backward(), -2)
self.assertEqual(dummy.backward(), -3)
self.assertRaises(ValueError, dummy.backward)
def test_03_boundaries(self):
dummy = Dummy(right_boundary=3, left_boundary=-3,allow_negative=True)
self.assertEqual(dummy.backward(), -1)
self.assertEqual(dummy.backward(), -2)
self.assertEqual(dummy.forward(), -1)
self.assertEqual(dummy.backward(), -2)
self.assertEqual(dummy.backward(), -3)
L'explication du code est la suivante -
Le module unittest doit être importé pour fournir des capacités de test unitaire pour la classe donnée.
Une classe doit être créée en sous-classant unittest.
Chaque méthode du code ci-dessus commence par un test de mot. Toutes ces méthodes sont appelées par le gestionnaire unittest.
Les méthodes assert / fail sont appelées par le scénario de test pour gérer les exceptions.
Considérez ceci comme un exemple pour exécuter un cas de test -
if __name__ == '__main__':
unittest.main()
Le résultat (sortie) pour exécuter le cas de test sera le suivant -
----------------------------------------------------------------------
Ran 3 tests in 0.000s
OK
Test fonctionel
Une fois que les fonctionnalités de l'application commencent à prendre forme conformément aux exigences, un ensemble de tests fonctionnels peut valider l'exactitude de l'application par rapport à la spécification. Cependant, le test doit être automatisé pour de meilleures performances, ce qui nécessiterait l'utilisation de produits tiers tels que Selenium.
CherryPy fournit une classe d'aide comme des fonctions intégrées pour faciliter l'écriture des tests fonctionnels.
Test de charge
En fonction de l'application que vous écrivez et de vos attentes en termes de volume, vous devrez peut-être exécuter des tests de charge et de performances afin de détecter les goulots d'étranglement potentiels dans l'application qui l'empêchent d'atteindre un certain niveau de performances.
Cette section ne détaillera pas comment effectuer un test de performance ou de charge car il est hors de son package FunkLoad.
L'exemple très basique de FunkLoad est le suivant -
from funkload.FunkLoadTestCase
import FunkLoadTestCase
class LoadHomePage(FunkLoadTestCase):
def test_homepage(self):
server_url = self.conf_get('main', 'url')
nb_time = self.conf_getInt('test_homepage', 'nb_time')
home_page = "%s/" % server_url
for i in range(nb_time):
self.logd('Try %i' % i)
self.get(home_page, description='Get gome page')
if __name__ in ('main', '__main__'):
import unittest
unittest.main()
Voici une explication détaillée du code ci-dessus -
Le scénario de test doit hériter de la classe FunkLoadTestCase afin que le FunkLoad puisse faire son travail interne de suivi de ce qui se passe pendant le test.
Le nom de la classe est important car FunkLoad recherchera un fichier basé sur le nom de la classe.
Les cas de test conçus ont un accès direct aux fichiers de configuration. Les méthodes Get () et post () sont simplement appelées contre le serveur pour obtenir la réponse.