2017-10-09 1 views
0

résumé rapide: obtenir un unittest en python au travail qui prend en arguments de ligne cmd et en utilisant le drapeau -b pour exécuter le testpython unittest avec des arguments passés -b


je le code suivant dans un fichier appelé: filetool.py

def get_passedargdict(): 
    '''need a place to setup args''' 
    parser = argparse.ArgumentParser(description="pass me some data") 
    parser.add_argument("-skipmd5", "--skipmd5", help="skip the md5 check", required=False) 
    parser.add_argument("-keepinput", "--keepinput", help="copy instead of moving the input file", required=False) 
    parser.add_argument("-keepconfig", "--keepconfig", help="copy instead of moving the config file", required=False) 
    passedargs = parser.parse_args() 
    passedargdict = {} 

    if passedargs.skipmd5 == "y": 
     passedargdict["skipmd5"] = True 
    else: 
     passedargdict["skipmd5"] = False 

    if passedargs.keepinput == "y": 
     passedargdict["keepinput"] = True 
    else: 
     passedargdict["keepinput"] = False 

    if passedargs.keepconfig == "y": 
     passedargdict["keepconfig"] = True 
    else: 
     passedargdict["keepconfig"] = False 

    return passedargdict 

Assez simple, fonctionne très bien. Je prends des choses de la ligne de commande et je m'en occupe dans un dictionnaire. Maintenant, je veux ajouter un test unitaire très basique (j'ai déjà beaucoup qui travaillent) à l'aide:

import unittest 

dans un fichier appelé test_filetools.py et cela fonctionne:

def test_get_passedargdict(self): 
    passedargdict = get_passedargdict() 
    self.assertFalse(passedargdict["keepinput"]) 
    self.assertFalse(passedargdict["keepconfig"]) 
    self.assertFalse(passedargdict["skipmd5"]) 

Et je peux courir :

test_filetools.py 

Et cela fonctionne très bien. J'aime la vie. Mais j'ai beaucoup de unittests ici et je ne veux pas tout le spam sur l'écran, je veux juste les petits points, alors j'ai essayé:

test_filetools.py -b 

Et je reçois un échec:

Stderr: 
usage: test_filetools.py [-h] [-skipmd5 SKIPMD5] [-keepinput KEEPINPUT] 
         [-keepconfig KEEPCONFIG] 
test_filetools.py: error: unrecognized arguments: -b 

Donc, il semble que mon get_passedargdict() essaie d'insérer le -b. Si j'effectue ce test, tout fonctionne bien avec -b.

Des idées comment je peux avoir ce unittest qui prend en arguments et être capable d'utiliser l'option -b en même temps sans causer cet échec? Je vous remercie!

Répondre

0

On dirait que mon propre message est une sorte de dupe alors je vais y répondre moi-même! Ce poste semble avoir beaucoup d'options:

How do you write tests for the argparse portion of a python module?

Je suis allé avec rendre la fonction de prendre les args, et dans le code réel passer la substance de ligne de commande pour elle, dans le test de code dur vide.

Et voici ce que j'ai changé pour mon test:

def test_get_passedargdict(self): 
    passedargdict = get_passedargdict([]) 
    self.assertFalse(passedargdict["keepinput"]) 
    self.assertFalse(passedargdict["keepconfig"]) 
    self.assertFalse(passedargdict["skipmd5"]) 

et mon code actuel est comme ça maintenant:

passedargdict = get_passedargdict(sys.argv[1:]) 

et la fonction:

def get_passedargdict(args): 
    '''need a place to setup args''' 
    parser = argparse.ArgumentParser(description="pass me some data") 
    parser.add_argument("-skipmd5", "--skipmd5", help="skip the md5 check", required=False) 
    parser.add_argument("-keepinput", "--keepinput", help="copy instead of moving the input file", required=False) 
    parser.add_argument("-keepconfig", "--keepconfig", help="copy instead of moving the config file", required=False) 
    passedargs = parser.parse_args(args) 
    passedargdict = {} 

    if passedargs.skipmd5 == "y": 
     passedargdict["skipmd5"] = True 
    else: 
     passedargdict["skipmd5"] = False 

    if passedargs.keepinput == "y": 
     passedargdict["keepinput"] = True 
    else: 
     passedargdict["keepinput"] = False 

    if passedargs.keepconfig == "y": 
     passedargdict["keepconfig"] = True 
    else: 
     passedargdict["keepconfig"] = False 

    return passedargdict