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 :

pyUnit test unitaire


Sujet :

Python

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2011
    Messages
    297
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 297
    Par défaut pyUnit test unitaire
    Bonjour
    j'ai une classe qui contient un ensemble des fonctions et j'aimerais bien tester chacune de ces fonctions ,
    vous avez un exemple sur le test unitaire pyUnit si on veut l'appliquer à des méthodes précises ?
    merci

  2. #2
    Membre expérimenté

    Profil pro
    Développeur Java
    Inscrit en
    Mars 2010
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 87
    Par défaut
    Bonjour nancy maman,
    pourquoi ne pas utiliser doctests, quant à l'utilisation pyUnit, il suffit d'appeler la méthode avec des paramètres variables dans ton jeu de tests.

    Olivier.

  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Salut,
    unittest ou PyUnit est livré avec Python en standard au moins depuis 2.6, 2.7 et 3.x. En supposant que vous avez jeté un œil à la documentation qui illustre les utilisations de base avec des exemples, quels sont vos soucis?
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 114
    Par défaut
    Bonjour


    Pour info, voici mon modèle pour les unittest :
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    # utt_template.py
    # -*- coding: utf-8 -*-
    # ----------------------------------------------------------------------------
    # Template file for unittes
    # ----------------------------------------------------------------------------
     
    __version__ = "$Revision: 10527 $"
    __verbose__ = 0
     
    #-----------------------------------------------------------------------------
    #  Import
    #-----------------------------------------------------------------------------
     
    # Python standard library ( in alphabetical order)
    import unittest
     
    # Project ( in alphabetical order)
    #from core.error import err_logger
     
    # tested file : import class to test
    from template import vdr_template
     
    #-----------------------------------------------------------------------------
    # Class
    #-----------------------------------------------------------------------------
     
     
    class UTT_TestTemplate(unittest.TestCase):
     
        # as it's a template, set an empty method
        def setUp(self):
            pass
     
        # test case
        def testTemplate(self):
            # call to method
            # VDR_Template.myMethod()
            self.assertEqual(1, 1)
     
        # as it's a template, set an empty method
        def tearDown(self):
            pass
     
     
    def UTT_TestSuiteTemplate(testSuite):
        for t in ('testTemplare',
                  # add other test name herer
                  # 'testInit',
                  # 'testRead',
     
                  ):
            testSuite.addTest( UTT_TestTemplate( t ) )
     
    #-----------------------------------------------------------------------------
    #  Invoke main 
    #----------------------------------------------------------------------------- 
     
    # Call main() when this file is run as a script (not imported as a module)
     
    if __name__ == '__main__':
     
        print('utt_template.py start ------------------------------')
     
        testSuite = unittest.TestSuite()
        UTT_TestSuiteTemplate(testSuite)
        unittest.TextTestRunner(verbosity=2).run(testSuite)
     
        print('utt_template.py stop------------------------------')
     
     
    # end of file

    Cordialement
    Emmanuel

  5. #5
    Membre expérimenté

    Profil pro
    Développeur Java
    Inscrit en
    Mars 2010
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 87
    Par défaut
    Merci emmanuel_dumas pour ton template, il me sera utile
    je pense juste remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    def UTT_TestSuiteTemplate(testSuite):
        for t in ('testTemplare',
                  # add other test name herer
                  # 'testInit',
                  # 'testRead',
     
                  ):
            testSuite.addTest( UTT_TestTemplate( t ) )
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    def UTT_TestSuiteTemplate(testSuite):
            testSuite.addTest( map(UTT_TestTemplate, [ 'testTemplare', ...]))

  6. #6
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Par défaut
    Salut,

    Par pure curiosité, quelqu'un utilise l'instruction assert (qui correspond à la macro assert du C) qui ne nécessite pas d'import particulier? Je fais tous mes test unitaires avec cette fonction.

    A+

    Pfeuh

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    def IntegerToAscii(value):
        return "%i"%value
     
    assert IntegerToAscii(0) == "0"
    assert IntegerToAscii(0x80000000) == "2147483648"
    assert IntegerToAscii(0xffffffff) == "4294967295"
    assert IntegerToAscii(-0x80000000) == "-2147483648"

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2011
    Messages
    297
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 297
    Par défaut
    merci à vous tous
    pour les docs , je m'en sors pas trop en anglais
    mon souci ce que j'arrive pas à lier entre les méthodes qu'on veut tester et la classe de test je vous passe mon code que j'ai fais en se basant sur vos exemples :
    j'aimerais tester les fontions : donnerNom et nomFonction
    code : ClassePersonne.py
    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
    #!/usr/bin/python
    # -*- coding: iso-8859-1 -*-
     
    class ClassePersonne():
     
        def __init__(self,nom):
            self.nom=nom
     
        def nomFonction(self):
            print "salut",self.nom
     
        def donnerNom(self):
           print "-----------------------"
           print "votre nom : "
           nom = raw_input()
           print "Bonjour ",nom
    code : AppelClassePersonne.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    from ClassePersonne import *
    class AppelClassePersonne:
     
           def __init__(self):
               self.c=AppelClassePersonne()
     
           def aff(self):
               print "hi"
     
    if __name__ == "__main__":
          personne=ClassePersonne('Nancy')
          personne.nomFonction()  
          personne.donnerNom()
    code : Test_AppelTestClasse.py
    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
    33
    # utt_template.py
    # -*- coding: utf-8 -*-
     
    import unittest
    from ClassePersonne import ClassePersonne
     
    class UTT_TestClasse(unittest.TestCase):
     
        def setUp(self):
            self.c=ClassePersonne()
            personne=ClassePersonne('Nancy')
     
     
        def testClasse(self):
     
            ClassePersonne.donnerNom()
            ClassePersonne.nomFonction("maman")
            self.assertEqual(1, 1)
     
        def tearDown(self):
            pass
     
     
    def UTT_TestSuiteClasse(testSuite):
            testSuite.addTest( map(UTT_TestClasse, ['testClasse']))
     
     
     
    if __name__ == '__main__':
     
        testSuite = unittest.TestSuite()
        UTT_TestSuiteClasse(testSuite)
        unittest.TextTestRunner(verbosity=2).run(testSuite)
    j'ai qq messages d'erreurs

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 114
    Par défaut
    Bonjour

    Quelques idées pour procédé différement, attention, toutes ces idées ne sont pas directement opérationnels.

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    # utt_template.py
    # -*- coding: utf-8 -*-
     
    import unittest
    from ClassePersonne import ClassePersonne
     
    # test unitaire sur la création
    class UTT_TestClasse(unittest.TestCase):
     
        def setUp(self):
            pass
     
        def testClasse1(self):
            " test l'appel à l'init"
            self.c=ClassePersonne()
            personne=ClassePersonne('Nancy')
     
        def testClasse2(self)
            "test le nom et la fonction de la personne"
            personne=ClassePersonne('Nancy')
            self.asserEqual(personne.donnerNom(), 'Nancy')
            self.asserEqual(personne.nomFonction("maman"), "maman")
     
        def tearDown(self):
            pass
     
     
    # test unitaire sur l'utilisation
    class UTT_TestClasse2(unittest.TestCase):
     
        def setUp(self):
            self.personne = ClassePersonne()
     
        def testClasse1(self):
            elf.asserEqual(self.personne.donnerNom(), 'Nancy')
     
        def testClasse2(self)
            "test la fonction de la personne"
            self.asserEqual(self.personne.nomFonction("maman"), "maman")
     
        def tearDown(self):
            pass
     
     
    def UTT_TestSuiteClasse(testSuite):
            testSuite.addTest( map(UTT_TestClasse, ['testClasse1',
                                                                      'testClasse2']))
            testSuite.addTest( map(UTT_TestClasse2, ['testClasse1',
                                                                      'testClasse2']))
     
     
     
    if __name__ == '__main__':
     
        testSuite = unittest.TestSuite()
        UTT_TestSuiteClasse(testSuite)
        unittest.TextTestRunner(verbosity=2).run(testSuite)
    Cordialement
    Emmanuel

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2011
    Messages
    297
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 297
    Par défaut
    Bonjour,
    merci
    j'ai testé ton exemple mais ca marche pas
    il génère des erreurs au niveau des lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    testSuite.addTest( map(UTT_TestClasse, ['testClasse1','testClasse2']))
            testSuite.addTest( map(UTT_TestClasse2, ['testClasse1','testClasse2']))

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2011
    Messages
    297
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 297
    Par défaut
    j'ai corrigé les erreurs , voici le code
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    # utt_template.py
    # -*- coding: utf-8 -*-
     
    import unittest
    from ClassePersonne import ClassePersonne
     
    # test unitaire sur la création
    class UTT_TestClasse(unittest.TestCase):
     
        def setUp(self):
            pass
     
        def testClasse1(self):
            " test l'appel à l'init"
            self.c=ClassePersonne()
            personne=ClassePersonne('Nancy')
     
        def testClasse2(self):
            "test le nom et la fonction de la personne"
            personne=ClassePersonne('Nancy')
            self.asserEqual(personne.donnerNom(), 'Nancy')
            self.asserEqual(personne.nomFonction("maman"), "maman")
     
        def tearDown(self):
            pass
     
     
    # test unitaire sur l'utilisation
    class UTT_TestClasse2(unittest.TestCase):
     
        def setUp(self):
            self.personne = ClassePersonne()
     
        def testClasse1(self):
            self.asserEqual(self.personne.donnerNom(), 'Nancy')
     
        def testClasse2(self):
            "test la fonction de la personne"
            self.asserEqual(self.personne.nomFonction("maman"), "maman")
     
        def tearDown(self):
            pass
     
    def suite(testSuite):
            loader = unittest.TestLoader()
            s = unittest.TestSuite()
            s.addTest(loader.loadTestsFromTestCase(UTT_TestClasse))
            #s.addTest(loader.loadTestsFromTestCase(testClasse2))
            return s
     
    #def UTT_TestSuiteClasse(testSuite):
            #testSuite.addTest( map(UTT_TestClasse, ['testClasse1','testClasse2']))
            #testSuite.addTest( map(UTT_TestClasse2, ['testClasse1','testClasse2']))
     
     
     
    if __name__ == '__main__':
     
        testSuite = unittest.TestSuite()
        suite(testSuite)
        #UTT_TestSuiteClasse(testSuite)
        unittest.TextTestRunner(verbosity=2).run(testSuite)
    et quand je l'execute j'ai ce resultat :
    ----------------------------------------------------------------------
    Ran 0 tests in 0.000s

    OK

    j'aimerais savoir la signification de ces résultats , est ce que ca veut dire que aucun test n'a été effectué donc le test n'est pas validé ???
    merci

  11. #11
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 114
    Par défaut
    Citation Envoyé par nancy maman Voir le message
    j'ai corrigé les erreurs , voici le code
    et quand je l'execute j'ai ce resultat :
    ----------------------------------------------------------------------
    Ran 0 tests in 0.000s

    OK

    j'aimerais savoir la signification de ces résultats , est ce que ca veut dire que aucun test n'a été effectué donc le test n'est pas validé ???
    Ran 0 : aucun test d'effectué.

    Bon ce code là , je l'ai fait marché. Je suis pas copain avec les map, je suis revenu à mes boucles for (NB je suis en Python 3):
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    # utt_template.py
    # -*- coding: utf-8 -*-
     
    import unittest
    #from ClassePersonne import ClassePersonne
     
     
    class ClassePersonne():
     
        def __init__(self,nom):
            self.nom=nom
     
        def nomFonction(self):
            print("salut",self.nom)
     
        def donnerNom(self, Nom):
            print("-----------------------")
            print("votre nom : ")
            self.nom = Nom
            print("Bonjour ",self.nom)
     
    # test unitaire sur la cr←ation
    class UTT_TestClasse(unittest.TestCase):
     
        def setUp(self):
            pass
     
        def testClasse1(self):
            " test l'appel ¢ l'init"
            self.c=ClassePersonne('toto')
            personne=ClassePersonne('Nancy')
     
        def testClasse2(self):
            "test le nom et la fonction de la personne"
            personne=ClassePersonne('Nancy')
            self.assertEqual(personne.donnerNom('Nancy'), 'Nancy')
            self.assertEqual(personne.nomFonction("maman"), "maman")
     
        def tearDown(self):
            pass
     
     
    # test unitaire sur l'utilisation
    class UTT_TestClasse2(unittest.TestCase):
     
        def setUp(self):
            self.personne = ClassePersonne('toto')
     
        def testClasse1(self):
            self.assertEqual(self.personne.donnerNom('titi'), 'Nancy')
     
        def testClasse2(self):
            "test la fonction de la personne"
            self.assertEqual(self.personne.nomFonction(), "maman")
     
        def tearDown(self):
            pass
     
     
    def UTT_TestSuiteClasse(testSuite):
        for t in ('testClasse1','testClasse2'):
            testSuite.addTest( UTT_TestClasse(t) )
        for t in ('testClasse1','testClasse2'):
            testSuite.addTest( UTT_TestClasse2(t) )
     
     
     
    if __name__ == '__main__':
     
        testSuite = unittest.TestSuite()
        UTT_TestSuiteClasse(testSuite)
        unittest.TextTestRunner(verbosity=2).run(testSuite)
    Cordialement
    Emmanuel

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2011
    Messages
    297
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 297
    Par défaut
    j'ai testé ton code , et j'ai ca comme résultat :
    test l'appel ¢ l'init ... ok
    test le nom et la fonction de la personne ... -----------------------
    votre nom :
    ('Bonjour ', 'Nancy')
    FAIL
    testClasse1 (__main__.UTT_TestClasse2) ... FAIL
    test la fonction de la personne ... FAIL

    ======================================================================
    FAIL: test le nom et la fonction de la personne
    ----------------------------------------------------------------------
    Traceback (most recent call last):
    File "C:\Documents and Settings\py3.py", line 36, in testClasse2
    self.assertEqual(personne.donnerNom('Nancy'), 'Nancy')
    AssertionError: None != 'Nancy'
    -----------------------
    votre nom :
    ('Bonjour ', 'titi')
    ('salut', 'toto')

    ======================================================================
    FAIL: testClasse1 (__main__.UTT_TestClasse2)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
    File "C:\Documents and Settings\py3.py", line 50, in testClasse1
    self.assertEqual(self.personne.donnerNom('titi'), 'Nancy')
    AssertionError: None != 'Nancy'

    ======================================================================
    FAIL: test la fonction de la personne
    ----------------------------------------------------------------------
    Traceback (most recent call last):
    File "C:\Documents and Settings\py3.py", line 54, in testClasse2
    self.assertEqual(self.personne.nomFonction(), "maman")
    AssertionError: None != 'maman'

    ----------------------------------------------------------------------
    Ran 4 tests in 0.000s

    FAILED (failures=3)

  13. #13
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 114
    Par défaut
    Citation Envoyé par nancy maman Voir le message
    j'ai testé ton code , et j'ai ca comme résultat :
    ....
    ----------------------------------------------------------------------
    Ran 4 tests in 0.000s

    FAILED (failures=3)
    Là, il dit que la classe Personne ne fait pas ce qu'on attend d'elle.
    Il n'y a plus d'erreur de syntaxe python, il ya juste des "testcase" échoué. Quand dans le code il est écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.assertEqual( valeur1, 'valeur')
    il faut que la variable valeur1 soit égale à 'valeur', sinon vous avez un des messages cité plus haut.

    Donc arrivé là, je pense que plus personne ne peut vous aider, si vous ne déterminer pas précisément :
    - ce que fait la classe Personne
    - ce que vous voulez tester avec le unittest

    NB : commencer par tester que la classe "affiche" bien un résultat est loin d'être la chose la plus évidente à faire. On commence en général par vérifier que les champs ont bien une certaine valeur, exemple que self.nom est bien rempli avec 'Nancy'.

    Cordialement
    Emmanuel

Discussions similaires

  1. Tests unitaires & base de données
    Par lalystar dans le forum Test
    Réponses: 15
    Dernier message: 18/06/2010, 16h50
  2. Tests Unitaires - Production de documents
    Par giviz dans le forum Test
    Réponses: 13
    Dernier message: 07/02/2005, 08h41
  3. Tests unitaires en C#
    Par Bouboubou dans le forum Test
    Réponses: 2
    Dernier message: 01/10/2004, 13h03
  4. [TESTS] Tests unitaires
    Par mathieu dans le forum Test
    Réponses: 4
    Dernier message: 08/01/2004, 12h59

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