4 votes

Comment supprimer les arguments CLI en utilisant argparse pour que unittest accepte la liste des arguments ?

J'aimerais passer mes propres arguments dans les fichiers qui sont configurés pour unittest. Ainsi, l'appeler à partir de la ligne de commande comme ceci devrait fonctionner :

python Test.py --c keith.ini SomeTests.test_one

Je rencontre actuellement deux problèmes.

1) Arg parse ne permet pas les arguments inconnus

l'utilisation : Test.py [-h] [--c CONFILE] Test.py : erreur : arguments non reconnus : SomeTests.test_one

2) Les tests unitaires n'autorisent pas les arguments inconnus. Donc --c nomdefichier n'est pas accepté par unittest et renvoie :

AttributeError : l'objet "module" n'a pas d'attribut "keith".

L'idée est donc de collecter mes arguments et de les supprimer avant d'appeler unittest runner.

import unittest
import argparse

myArgs = None

def getArgs( allArgs ):
    parser = argparse.ArgumentParser( )
    parser.add_argument('--c', dest='conFile', type=str, default=None, help='Config file')
    args = parser.parse_args()

    if ( args.conFile == None ):
        parser.print_help()

    return args

class SomeTests(unittest.TestCase):
    def test_one(self):
        theTest( 'keith' )

    def test_two(self):
        otherTest( 'keith' )

if __name__ == '__main__':
    myArgs = getArgs( sys.argv )
    print 'Config File: ' + myArgs.conFile
    unittest.main( argv=sys.argv, testRunner = unittest.TextTestRunner(verbosity=2))

Intéressant je viens de trouver parse_known_args() donc j'ai changé la ligne de parse en :

args = parser.parse_known_args(['--c']). 

Je pensais que cela résoudrait mon problème et me donnerait quelque chose à transmettre à unittest. Malheureusement, j'obtiens :

Test.py: error: argument --c: expected one argument. 

Cela ne devrait-il pas fonctionner ?

4voto

Keith Points 357

OK, cela a demandé un peu d'effort, mais j'ai trouvé la solution. C'est tout à fait possible. La documentation de argparse n'est pas correcte. La fonction parse_known_args() ne devrait pas inclure une liste d'arguments connus. De plus, argparse supprime arg[0] qui est important de retourner pour que les autres commandes voient une liste d'arguments valide. Je considérerais cette suppression comme un bogue. J'ai inclus le code d'exemple final.

import unittest
import argparse
import sys

myArgs = None

def getArgs( allArgs ):
    parser = argparse.ArgumentParser( )
    parser.add_argument('--c', dest='conFile', type=str, default=None, help='Configuration file. (Required)')
    args, addArgs = parser.parse_known_args( )

    if ( args.conFile == None ):
        parser.print_help()
        sys.exit(2)

    # argparse strips argv[0] so prepend it
    return args, [ sys.argv[0]] + addArgs

def verify( expected, actual ):
    assert expected == actual, 'Test Failed: '

# Reusable Test
def theTest( exp ):
    print 'myargs: ' + str( myArgs )
    verify( exp, 'keith' )

def otherTest( exp ):
    theTest( exp )

class SomeTests(unittest.TestCase):
    def test_one(self):
        theTest( 'keith' )

    def test_two(self):
        otherTest( 'keith2' )

if __name__ == '__main__':
    myArgs, addArgs = getArgs( sys.argv )
    unittest.main( argv=addArgs, testRunner = unittest.TextTestRunner(verbosity=2))

Une fois que vous l'avez enregistré dans un fichier, vous pouvez l'appeler comme dans les exemples ci-dessous et tout fonctionnera.

python Test.py                     # Requires config file
python Test.py --c keith.ini       # Runs all tests
python Test.py --c keith.ini SomeTests          # Runs Class
python Test.py --c keith.ini SomeTests.test_one # Runs test

HTH, Enjoy

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X