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 : AttributeError: (module) has no attribute 'runTest'


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 6
    Par défaut pyunit : AttributeError: (module) has no attribute 'runTest'
    Bonjour à tous,

    J'utilise pyunit avec pour objectif de lancer des tests fonctionnels avec Selenium pour tester des sites webs.
    Débutant en Python, je bloque depuis quelques temps sur une erreur qui, à mon avis est triviale. J'ai regardé les diférents tutoriels mais je n'ai rien vu qui pourrait me débloquer.
    Je souhaite rajouter des paramètres à unittest.TestCase pour faire passer à mes fonctions de tests le navigateur désiré.
    J'ai enlevé tout le code inutile pour que vous compreniez mieux mon problème. Actuellement je n'arrive pas à rajouter un paramètre à ma classe 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
     
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.common.keys import Keys
    from selenium.webdriver.support.ui import Select
    from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
    from selenium.common.exceptions import NoSuchElementException
    import unittest, time, re
     
    class TestClass(unittest.TestCase):      
        def __init__(self, browser="Firefox"):        
            super(TestClass, self).__init__()
            self.browser = browser
     
        def setUp(self):                
            print("début" + self.browser)
     
        def test_IRH_compatibility(self):
            print("test")
     
        def tearDown(self):        
            print("fin")
     
    if __name__ == "__main__":
        unittest.main()
    Je me retrouve avec l'erreur : AttributeError: TestClass object has no attribute 'runTest'.
    Note : J'ai la même erreur si je remplace "super(...) par unittest.TestCase.__init__(self)
    Merci par avance pour des éclaircissements sur ce point car je ne sais plus où chercher.

  2. #2
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 6
    Par défaut
    J'ai fait pas mal de recherches sur le net. Il semblerait que ce que je souhaite ne soit pas possible.

    Sur cette page, il explique que justement ce n'est pas possible (j'étais passée sur cette info sans la voir :-) mais il propose aussi une solution de contournement. Toutefois, je n'arrive pas à l'appliquer.

    Voici mon nouveau code :
    parametrisedTestCase.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
     
    import unittest
     
    class ParametrizedTestCase(unittest.TestCase):
     
        def __init__(self, methodName='runTest', param=None):
            super(ParametrizedTestCase, self).__init__(methodName)
            self.param = param
     
        @staticmethod
        def parametrize(testcase_klass, param=None):
            testloader = unittest.TestLoader()
            testnames = testloader.getTestCaseNames(testcase_klass)
            suite = unittest.TestSuite()
            for name in testnames:
                suite.addTest(testcase_klass(name, param=param))
            return suite
    testClass.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    import ParametrizedTestCase
     
    class TestClass(ParametrizedTestCase):      
     
        def test_01(self):
            print("param1" + self.param)
     
        def test_02(self):
            print("param2" + self.param)
    testClassSuite.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    import unittest
    import ParametrizedTestCase
    import testClass
     
    suite = unittest.TestSuite()
    suite.addTest(ParametrizedTestCase.parametrize(test_01, param=42))
    suite.addTest(ParametrizedTestCase.parametrize(test_02, param=13))
    unittest.TextTestRunner(verbosity=2).run(suite)
    Lorsque je lance testClassSuite.py j'ai le message suivant :
    TypeError: module.__init__() takes at most 2 arguments (3 given). En effet dans le __init__ de la classe parametrized il y a 3 parametres mais cest justement le but de cet init.
    Je ne comprends pas bien mon erreur. Pourriez-vous me mettre sur la voie ?

    Merci d'avance

  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,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class TestClass(unittest.TestCase):      
        def __init__(self, browser="Firefox"):        
            super(TestClass, self).__init__()
            self.browser = browser
    se remplace facilement par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    class TestClass(unittest.TestCase):      
         browser="Firefox"
    ou par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    class TestClassFirefox(unittest.TestCase):      
         ...
    ranger des tests dans des "testclass", c'est pas si complique, si?

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 6
    Par défaut
    Merci pour ta réponse mais je t'avoue que soit je n'ai pas compris ta réponse soit je n'ai pas bien expliqué ce que je voulais faire. Maintenant, il est vrai que je débute dans le test et dans Python, il est donc possible que je veuille faire quelquechose de compliqué alors qu'il y a plus simple à faire.

    Je vais tenter d'être plus clair : je dois faire plusieurs tests fonctionnels pour vérifier si un site web réagit bien et notamment sur différents navigateurs. Je me suis donc tourné sur Selenium et une solution en ligne appelé Browserstack (désolé pour la pub) qui stocke des images virtuelles permettant de tester des navigateurs. Pour se connecter à leur solution j'ai choisi le langage Python.

    Pour le moment j'arrive à lancer des scripts très simple en python (notamment en les exportant via Firefox IDE) et les lancer sur l'imagevirtuelle. Ce que je voudrais faire maintenant c'est faire une suite de tests qui lance ma classe de test avec en paramètre le navigateur, la version, l'OS et la version de l'os afin de ne pas avoir à modifié à chaque fois mon code pour changer de navigateur.

    Comme pour le moment, j'en suis au balbutiement et au tatonnement avec Python, je regarde si il est possible de rajouter des paramètres à la classe unittest.testcase pour qu'à l'avenir je puisse lui en rajouter 4 (os, version, etc.). Merci d'avance pour vos éclaircissements.

    Par rapport à ta solution, je me trompe peut-être, mais je ne peux changer le navigateur.
    J'espère avoir été plus clair et surtout ne pas avoir été trop à côté de la plaque.

  5. #5
    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
    j'en suis au balbutiement et au tatonnement avec Python, je regarde si il est possible de rajouter des paramètres à la classe unittest.testcase pour qu'à l'avenir je puisse lui en rajouter 4 (os, version, etc.). Merci d'avance pour vos éclaircissements.
    Les setUp/tearDown des testcases se font au niveau module, class ou instance.
    Associes a ces objets, il y a des notions de scope et de durée de vie d'objets Python.
    Si vous ouvrez la boite a outil Selenium sans maîtriser le b.a.ba de tout cela, ca va pas être facile.
    Les testunits emploient ces fonctionnalités a fond, et il faut apprendre a surfer sur la vague.

    Par rapport à ta solution, je me trompe peut-être, mais je ne peux changer le navigateur.
    Essayez plus fort!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class TestClass(unittest.TestCase):      
         browser="Firefox"
         ...
     
    if __name__ == "__main__":
        TestClass.browser="Safari"
        unittest.main()
    Ceci dit ce n'est qu'une "option" parmi d'autres.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 6
    Par défaut
    Merci de nouveau pour votre réponse,

    J'ai testé dans tous les sens mais votre solution ne semble pas me permettre de lancer plusieurs fois le même test. Si j'ai bien compris la fonction unittest.main(), elle va lancer la fonction __init__ (si elle existe) afin d'initialiser la classe, puis setUp(), puis toutes les fonctions commençant par test puis va terminer par tearDown() pour faire les traitements de fin. Mais tout ceci, qu'une seule fois. La lancer 2 fois en changeant le navigateur n'est pas possible.

    Après plusieurs recherches (avec mon faible niveau de compréhension de l'anglais technique) il semblerait que surcharger la classe unittetst.testcase ne soit pas possible, d'où mon idée de tester la solution d'Eli (cf plus haut) mais sans succès pour le moment.
    Dans mon cas, j'ai besoin de lancer plusieurs fois une fonction de test avec en paramètre plusieurs variables (pour l'instant on va l'appeler "browser"). Alors bien-sûr je pourrais faire une fonction test_firefox(), test_safari(), etc dans la classe TestClass. mais ce n'est pas propre et pas maintenable sur le long terme.

    Y aurait-il une autre solution qui me permettrait de "variabiliser" ma fonction de test ? Merci d'avance pour vos suggestions et aides sur le sujet.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 6
    Par défaut
    Bon, à défaut de mieux j'ai décidé de faire comme ci-après.
    Ca risque d'être très trivial pour des développeurs un tant soit peu aguerri mais ça semble fonctionner. Si ça peut débloquer quelqu'un, on ne sait jamais.

    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
     
    class TestClass(unittest.TestCase):      
        _browser = "Firefox"
     
        def setUp(self):                
            print("début")
     
        def test_compatibility(self):
            print("test" + self._browser)
     
        def tearDown(self):        
            print("fin")
     
        def runmain(self):
            self.setUp()
            self.test_compatibility()
            self.tearDown()
     
    if __name__ == "__main__":  
        a = TestClass()
        b = TestClass()
        a._browser = "Safari"
        b._browser = "Opera"
        a.runmain()
        b.runmain()
        #unittest.main()
    J'ai viré le unittest.main() et j'en ai bricolé un dans ma classe. Ca ne me satisfait pas trop mais bon... ça a au moins le mérite de lancer plusieurs navigateurs sans réécrire de fonctions pour chacune.

    Si vous avez des suggestions plus judicieuses, je suis preneur.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 04/03/2014, 22h41
  2. AttributeError: 'module' object has no attribute 'ipv4_cksum
    Par comtention dans le forum Général Python
    Réponses: 6
    Dernier message: 05/10/2012, 18h09
  3. Selenium - AttributeError: 'module' object has no attribute
    Par bender1979 dans le forum Général Python
    Réponses: 4
    Dernier message: 09/11/2010, 22h03
  4. Réponses: 2
    Dernier message: 26/05/2006, 14h48

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