• [^] # Re: le python c'est bon

    Posté par (site web personnel) . En réponse à la dépêche Sortie de Python 2.4. Évalué à 6.

    Chuis vert, j'ai passe 10 minutes a mettre ce post en forme et tout est nique parce que j'ai appuye sur le mauvais bouton au mauvais moment.
    Ca sert aussi dans le cas de test unitaires pour faire des objets 
    moqueurs (www.easymock.org).
    Exemple:
    def my_communication_protocol( my_interface, data ):
     # call many methods of my_interface
     # depending on the execution of each of them, handle
     # the communication protocol
     # return the result
    Maintenant, comment on teste un bazar pareil ? J'ai justement eu le 
    probleme recemment ou j'ai du ecrire exactement ce genre de code, 
    une fois en C++ et une fois en python. 
    En C++, j'ai du creer une interface generique, rajouter des 
    methodes virtuelles, passer pas mal de temps a memoriser les 
    echanges et pas mal de temps a tester mon objet de test. En 
    python, c'est 10 fois plus simple. Tu passes un objet mock qui va 
    enregistrer tous les appels qui seront faits sur ton interface et qui 
    peut eventuellement retourner des donnees fictives. 
    Exemple reel tire de mon code de test:
     # correct data, correct sw my_rd = Mock( 
     { "exchangeApdu": data + sw, 
     "powerOn": [0x3B, 0] } ) 
     sp = ScriptPlayerBase( my_rd ) 
     sp.setUnexpectedRaisesException( 0 ) 
     my_rd.clearCalls() 
     self.assertEquals( sp.send( cmd, sw=sw ), data + sw ) 
     allCalls = my_rd.getAllCalls() 
     self.assertEquals( len(allCalls), 1 ) 
     self.assertEquals( allCalls[0].params[0], cmd ) 
    - my_rd est un objet fictif qui retournera data+sw a la methode 
    exchangeApdu, et la liste [0x3B, 0x00] a la methode powerOn. 
    - je le passe a ScriptPlayerBase en lieu et place d'un objet lecteur 
    reel 
    - j'appelle la methode send sur my_rd. Derriere mon dos, sp va 
    appeler my_rd et recevoir les reponses qu'il attend 
    - je verifie que la reponse est correct de send est correcte 
    - ensuite, je liste tous les appels effectues sur my_rd et je verifie 
    qu'ils sont bien ce qu'ils doivent etre. Les capacites dynamiques de 
    python permettent de faire facilement ce genre de chose. Le code 
    pour la classe Mock fait 80 lignes commentaires et documenation 
    comprise. 
    Pour faire le meme test en utilisant une methode a la 
    EasyMock, on aurait: 
     # correct data, correct sw 
     my_rd = EasyMock() 
     my_rd.record() 
     my_rd.powerOn() 
     my_rd.setReturn( [0x3B, 0 ] ) 
     my_rd.exchangeApdu( cmd ) 
     my_rd.setReturn( data+sw ) 
     my_rd.replay() 
     sp = ScriptPlayerBase( my_rd ) 
     sp.setUnexpectedRaisesException( 0 ) 
     self.assertEquals( sp.send( cmd, sw=sw ), data + sw ) 
     # if something went wrong, an exception would have been raised 
    Malheureusement, personne n'a encore ecrit d'easymock pour 
    python. Mais ca doit bien demander une heure de travail a tout 
    casser.