17.12.2012 Views

Programmation PYTHON - Zenk - Security - Repository

Programmation PYTHON - Zenk - Security - Repository

Programmation PYTHON - Zenk - Security - Repository

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>Programmation</strong> dirigée par les tests<br />

CHAPITRE 12<br />

Dans l’exemple, le protocole d’envoi d’un e-mail est connu et a été mis dans le test du<br />

patch, mais le principe de construction par essai-erreur peut s’appliquer en aveugle<br />

pour des objets non connus, en appelant directement le code client dans le test.<br />

Simulation d’un module complet<br />

Il est parfois nécessaire de simuler un module complet pour couper toute dépendance<br />

à des bibliothèques liées par des directives import. L’interpréteur gère un dictionnaire<br />

où il conserve tous les modules importés. À chaque nouvelle importation, ce<br />

dictionnaire est contrôlé et si le nom (sans chemin) du module apparaît dans la liste<br />

des clés, l’objet de type module n’est pas recréé.<br />

Remplacer un module par un autre module réservé aux tests consiste donc à supprimer<br />

l’entrée de ce module dans le dictionnaire et à en recréer une avec le module<br />

de remplacement.<br />

Il est fortement déconseillé d’utiliser le même nom que le module original : dans certains<br />

cas le patch peut s’activer lorsque ce n’est pas souhaité. Cette situation peut se<br />

produire lorsque le code appelant rencontre le module de patch avant le module réel,<br />

par le jeu des chemins de recherche.<br />

Un nom préfixé par fake_ par exemple, est plus explicite.<br />

Exemple de patch pour le module imaplib :<br />

Bouchon (fakeimaplib.py)<br />

""" ** Bouchon IMAP **<br />

"""<br />

class IMAP4:<br />

def login(sef, user, password):<br />

return True<br />

Unité de test<br />

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

# -*- coding: ISO-8859-15 -*import<br />

sys<br />

# déchargement du vrai module imap si nécessaire<br />

if 'imaplib' in sys.modules.keys():<br />

original_imap = sys.modules['imaplib']<br />

del sys.modules['imaplib']<br />

else:<br />

original_imap = None<br />

399

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

Saved successfully!

Ooh no, something went wrong!