17.12.2012 Views

Programmation PYTHON - Zenk - Security - Repository

Programmation PYTHON - Zenk - Security - Repository

Programmation PYTHON - Zenk - Security - Repository

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

396<br />

Techniques avancées<br />

QUATRIÈME PARTIE<br />

Cette technique consiste à modifier à la volée, au moment du test, la portion de code<br />

qui accède à une ressource externe pour la remplacer par du code qui se contente de<br />

renvoyer un résultat convenable pour la suite des tests. L’objectif est de faire croire au<br />

code appelant que tout s’est bien déroulé, et de lui renvoyer un résultat correct. La<br />

qualité d’imitation du résultat renvoyé dépend de l’utilisation qui en est faite dans le<br />

code et peut parfois être grossière.<br />

Python est un langage suffisamment souple pour permettre de modifier les définitions<br />

de modules, classes et fonctions à la volée, et cette technique peut être appliquée<br />

à tous les étages du code.<br />

Modification de fonctions et méthodes<br />

L’exemple ci-dessous modifie temporairement la fonction urlopen d’urllib2 avant<br />

de démarrer les tests, pour qu’elle renvoie un résultat même si la machine de test ne<br />

peut pas se connecter à l’URL indiquée.<br />

Bouchon pour urllib<br />

#!/usr/bin/python<br />

# -*- coding: utf8 -*import<br />

urllib<br />

import StringIO<br />

# fonction de remplacement<br />

def fakeopen(url, data=None):<br />

res = StringIO.StringIO('Dummy Page')<br />

return res<br />

# monkey patching<br />

original_urllib = urllib.urlopen<br />

urllib.urlopen = fakeopen<br />

# test d'exemple<br />

res = urllib.urlopen('http://google.fr')<br />

assert(res.readlines(),<br />

['Dummy Page'])<br />

...<br />

# retrait du patch<br />

urllib.urlopen = original_urllib<br />

Le test d’exemple ne sert qu’à valider que le patch a bien été appliqué. Dans cette<br />

zone, tout accès à la fonction urlopen, exécutera le patch, sauf si la directive reload<br />

est appelée sur le module unittest.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!