IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Recuperation de la liste des fonction d'une classe


Sujet :

Python

  1. #1
    Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 167
    Points : 58
    Points
    58
    Par défaut construire une batterie de tests de non régression
    Bonjour,

    je debute sous python et je souhaite recuperer la liste des methodes d'une classe d'un module avec la fonction Info()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    def info(object, spacing=10, collapse=1): 
    		"""Print methods and doc strings.
                    
                    Takes module, class, list, dictionary, or string."""
    		methodList = [method for method in dir(object)		if callable(getattr(object, method))]
    		processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s)
    		print "\n".join(["%s %s" %(method.ljust(spacing),processFunc(str(getattr(object, method).__doc__))) for method in methodList])
     
    if __name__ == "__main__":                
        print info.__doc__
    je passe en parametre ma classe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    class Toto(SerialTester):
        def __init__(self, port, logfile=LOGFILE):
            SerialTester.__init__(self, port)
        def fonction2():
              .......
    le probleme c'est que je n'arrive pas a recuperer juste les fonctions de TOTO mais aussi celle hérité (SerialTester).

    avez vous une idée??? pour recuperer que les fonctions de TOTO pour que je puise faire une batterie de teste automatique sur ces dernieres

    merci

  2. #2
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Points : 970
    Points
    970
    Par défaut
    bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    methodList = [method for method in object.__dict__ if callable(getattr(object, method))]
    mais ne s'applique pas si la classe n'a pas de __dict__ (certaines classes qui sont des proxies de classes ou structures implémentée dans un autre langage, si on a utilisé __slots__, ...)

    voir aussi le module inspect pour l'introspection.

  3. #3
    Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 167
    Points : 58
    Points
    58
    Par défaut
    merci pour ta réponse
    en fait : je n'est pas de __dict__
    si je reformule, admettons que j'ai:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    liste1 = [1,2,3,4,5]
    liste2 = [1,2,3]
    #je souhaite recuperer liste3 = [4,5]
    #j'ai testé ce bout de code mais sa ne fonctionne pas 
    liste =[]
     for elm in liste1:
    	if elm in liste2:
    		liste3.append(elm)
    liste3 est toujour vide

  4. #4
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 76
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Points : 1 913
    Points
    1 913
    Par défaut
    Essaie plutôt cela:
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    liste1 = [1,2,3,4,5]
    liste2 = [1,2,3]
    #je souhaite recuperer liste3 = [4,5]
    #j'ai testé ce bout de code mais sa ne fonctionne pas 
    liste3 =[]
    for elm in liste1:
    	if elm not in liste2:
    		liste3.append(elm)
    print liste3
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  5. #5
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Points : 1 384
    Points
    1 384
    Par défaut
    Ou ceci, si conserver l'ordre n'est pas essentiel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    liste3 = list(set(liste1)-set(liste2))
    La reconversion en liste n'est sans doute même pas nécessaire...

  6. #6
    Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 167
    Points : 58
    Points
    58
    Par défaut construire une batterie de tests de non régression
    changement de titre

  7. #7
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Citation Envoyé par rosty38 Voir le message
    si vous avez une autre idée aussi pour le titre du sujet
    Je te propose : "Récupérer les méthodes d'une classe mais pas de sa sous-classe".

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Je ne comprends pas trop comment vous vous proposez de passer de la liste de course (les méthodes à tester) aux tests qui devront à priori être spécifiques à chacune des méthodes.

    Cela peut éventuellement vous permettre de créer un 'patron' avec une classe de tests associée à la classe à tester ou seront prédéfinies des test_methode1, test_methode2,...
    Mais pour écrire leur contenu, il faudra quand même savoir ce que çà fait et donc "regarder"

    Plus préoccupant, si A définit la méthode m:
    - rien n'empêche B sous classe de redéfinir m qui du coup ne sera pas testé,
    - ou encore d'autoriser des valeurs d'attributs qui ne plairont pas nécessairement à la méthode m 'originale'.

    Dans tous les cas, il faudra faire un 'plan' de tests, i.e. décrire au moins quels sont les résultats attendus sur une variation significative des paramètres de chaque méthode - la liste ne vous permet que de cocher le fait/à faire...

    Cela n'exclut pas un 'plan' de test mais attendu que Python est un langage de script et que je fais pleins de fautes d'orthographes qui ne seront détectées que lorsque la ligne en question sera interprétée, je m'appuie toujours sur les résultats de "coverage" pour m'assurer que mes tests sont passés à peu près partout.
    Cordialement,
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 167
    Points : 58
    Points
    58
    Par défaut
    merci wiztricks,

    si je comprend bien, je dois faire un/plusieurs teste pour chaque méthode,
    donc je dois pas récupérer la liste des fonctions a tester mais faire des testes sur chaque méthode(connue a l'avance).
    si je dis les choses clairement, je ne comprend pas comment faire une batterie de teste automatisé sur des fonctions déjà existante, écrites par un autre développeur et qui peuvent éventuellement changer!!

  10. #10
    Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 167
    Points : 58
    Points
    58
    Par défaut
    je rajoute un petit détail, le chef de projet n'a défini aucun comportement attendus de nos fonctions, c a d que je dois écrire un script qui automatise les testes sans connaitre la partie fonctionnel

  11. #11
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    si je comprend bien, je dois faire un/plusieurs teste pour chaque méthode, donc je dois pas récupérer la liste des fonctions a tester mais faire des testes sur chaque méthode(connue a l'avance).
    La liste des méthodes à tester est une chose, ce qu'elles sont supposées retourner, faire, ... en sont d'autres.

    si je dis les choses clairement, je ne comprend pas comment faire une batterie de teste automatisé sur des fonctions déjà existante, écrites par un autre développeur et qui peuvent éventuellement changer!!
    Suivant le modèle de développement choisi et la stabilité des API, cela peut servir à construire une batterie de tests de non régression: si la réalisation change, on pourra vérifier que çà fait toujours ce qu'on attend.
    => inutile dans ce cas de récupérer toutes les méthodes, seules celles qui sont supposées être "interfaces" méritent d'être testées (et stabilisées), les autres non.
    Note: En Python, les notions de public, privé, protégées, sont assez conventionnelles : faire commencer le nom des méthodes protégées par '_', privées par '__'.
    Le '__' est plus que conventionnel.

    Le rajoute un petit détail, le chef de projet n'a défini aucun comportement attendus de nos fonctions, c a d que je dois écrire un script qui automatise les testes sans connaitre la partie fonctionnel
    Le chef de projet peut avoir un "plan" qu'il ne vous a pas communiqué pour des raisons qui lui sont propres: aujourd'hui on commence par çà, demain travaille sur un autre sujet, puis encore un autre...

    A la fin, le tout s'assemble et prend son sens.

    Ce style de management ne fonctionne pas trop mal sur les chantiers BTP ou vous ne savez pas trop quel maçon, électricien, plombier sera disponible demain,... Et où vous avez un statut d'avancement qui est assez visible...
    Pour les projets informatiques, c'est plus discutable car tant que la chose n'est pas livrée sa réalisation demande "conception" à des niveaux divers et difficile de "concevoir" proprement sans un minimum de vision d'ensemble.

    Il peut aussi avoir des clauses contractuelles "bizarres".
    Il peut être à côté de ses pompes ou tout simplement tester vos savoirs avant de vous confier des taches plus sophistiquées.
    Allez savoir ce qui lui passe par la tête... le mieux est d'essayer d'en discuter avec lui ou avec vos collègues.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  12. #12
    Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 167
    Points : 58
    Points
    58
    Par défaut
    wiztricks, si comme si on travaillez dans la même boite , justement je suis en stage (6mois pour validé un bac+4 CNAM), j'ai fais 5 mois de .net et la je descends un peut dans l'architecture car je passe au firmeware(le responsable de la boite ma dit que mon recrutement ou pas dépendra de ce que je ferai en python )
    lors de ma discution avec le chef de projet (une seule mais je pense que c'est suffisant car j'ai l'impression que ce qu'il me demande de faire est très simple d'après mon chef !!))il ma dit de construire une batterie de tests de non régression sur la classe (du firmeware) qui contient toutes les fonctions utiles .
    mais malheureusement je patauge car je ne trouve pas de la doc ou des exemples.
    mais c'est surement ma naïveté qui fait qu'avec toutes les docs sur le net je ne fais pas la différence entre ce qui est moins utile (pour le moment) car il veut quelque chose qui fonctionne.
    je commence a flippé pour la suite car je trouve que je suis lent, j'i passé 1 semaine a apprendre python et la je me rend compte que je suis encore loin

  13. #13
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Points : 970
    Points
    970
    Par défaut
    bonsoir,

    si on considère que:

    construire une batterie de tests de non-régression
    est l'énoncé.

    on est assez loin de la problématique initiale qui consiste à lister les méthodes d'une classe.

    déjà, avant toute chose, ne panique pas on va forcément trouver un moyen de te sortir de là.

    personnellement, si j'étais dans ta situation, c'est le module unittest que j'utiliserai.

    http://docs.python.org/library/unittest.html

    Je retiens également de tes posts, que tu veux que ce soit automatique.

    On peut comprendre automatique de deux façon:

    - le code pour générer les tests est écrit de manière automatique (bon courage là, vraiment ).
    - on se pèle le code de test à la main, et ensuite tous les tests sont lancés automatiquement (et là unittest est ton ami).

    J'ai déjà utilisé cette librairie unittest pour générer du test unitaire sur une petite librairie que j'ai faite, à peu près 600 tests. Je te cache pas que c'est pénible à faire, mais après, la base de non-régression est immédiate. Tu modifies la classe, tu lances les tests, et tu sais en quelques secondes si tu as pas tout cassé (ce qui est assez fréquent si comme moi tu as les doigts un peu boudinés)

    Je pense que c'est ça que te demande ton maitre de stage.

    D'ailleurs j'ai un stagiaire Python en ce moment, et il va devoir faire un peu de unittest. Et franchement, je me vois pas lui demander de faire un code qui génère automatiquement les cas tests. D'abord parce que ça lui apporterait pas grand chose. Ensuite parce que ça m'apporterait pas grand chose à moi.

  14. #14
    Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 167
    Points : 58
    Points
    58
    Par défaut
    effectivement je suis partie sur la récupération des fonctions pour pouvoir faire des testes dessus mais après le différentes réponse(d'ailleurs je vous remercie énormément, c'est fou ce qu'on apprend et j'espère que sa va servir au autres) je pense que j'ai mal compris l'objectif initial. maintenant je sais et je suis sur que le chef de projet souhaite faire une batterie de testes sur son script.
    Kango ta entièrement raison, il faut que
    on se pèle le code de test à la main, et ensuite tous les tests sont lancés automatiquement (et là unittest est ton ami).
    j'ai commencé a écrire un script de teste, je le poste demain car la j y pas accès

  15. #15
    Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 167
    Points : 58
    Points
    58
    Par défaut
    Bonjour,
    voila j'ai écris un script de test:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
     
    import unittest
    import os
    import sys
     
    import fftest_20100623_CH_XX 
     
     
     
    class fftestTestBase(unittest.TestCase):
    	""" entrees et sorties basiques"""
     
     
     
    	def setUp(self):     #appeler avant chaque test
    		logfile = "fftestTestBase_"+timestamp+".log"
    		self.a = ClassTester("COM3",logfile)
    		print ("fftestMain.fftestTestBase.setUp()  is OK")
     
     
    	def test_ping(self):
    		result = self.a.ping()         #expected result -->to be change
    		self.assertEqual(self.a.ping(),result )
    		print ("fftestMain.fftestTestBase.ping()  is OK")
     
     
    if __name__ == "__main__":
    	unittest.main()
    	os.system("pause")
    print ("fftestMain.fftestTestBase  __name__ == __main__")
    os.system("pause")
    le probleme c'est qu'il n'exécute pas la methode "test_ping"
    voila le resultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    >>> import fftestMain
    fftestMain.fftestTestBase  __name__ == __main__

  16. #16
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut
    Lorsque vous faites:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    >>> import fftestMain
    fftestMain.fftestTestBase  __name__ == __main__
    __name__ ne sera pas __main__ et:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if __name__ == "__main__":   # s'execute si __name__ == ...
    	unittest.main()
    # s'execute dans les autres cas:
    # ... print ("fftestMain.fftestTestBase  __name__ == __main__")
    # affiche la valeur de __name___
    print ("fftestMain.fftestTestBase  __name__ == %s" % __name__ )
    A quoi servent les "os.system("pause")"?

    => vous ne passez pas par unittest.main()
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  17. #17
    Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 167
    Points : 58
    Points
    58
    Par défaut construire une batterie de tests de non régression
    j'utilise "os.system("pause") pour que la console ne disparaisse pas (j'utilise idle)
    vous ne passez pas par unittest.main()
    normalement oui si je double click sur mon fichier .py non!!!!

  18. #18
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Vous ne passez par unittest.main que si le nom du module (__name__) est '__main___'...
    Ce qui suppose 'par exemple' de lancer le script avec:
    $ python fftestMain.py
    et non via
    python
    >>> import fftestMain
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  19. #19
    Membre du Club
    Inscrit en
    Juillet 2008
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 167
    Points : 58
    Points
    58
    Par défaut
    en fait je le lance via DOS, fftestMain.pyc
    mais c'est toujours le même problème les méthodes de testes ne sont pas lancé

Discussions similaires

  1. Liste des instances d'une classe
    Par alexdevl dans le forum Général Python
    Réponses: 32
    Dernier message: 14/09/2011, 22h52
  2. OO et liste des objets d'une classe.
    Par alainbb dans le forum Langage
    Réponses: 1
    Dernier message: 03/01/2011, 17h35
  3. afficher liste des eleve d'une classe d un tableau T
    Par clem62173 dans le forum VB 6 et antérieur
    Réponses: 19
    Dernier message: 10/11/2009, 12h20
  4. colorier liste en fonction d'une classe
    Par Emcy dans le forum Mise en page CSS
    Réponses: 7
    Dernier message: 04/09/2008, 11h30
  5. Réponses: 14
    Dernier message: 15/01/2004, 01h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo