Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème pytest et paramètres en ligne de commande

    22 mai 2019 à 21:38:03

    Bonsoir à tous  :)

    J'ai fait un petit script de traduction en ligne de commande. Lors du lancement du programme on lui passe un mot ou plusieurs entre guillemets en guise d'arguments, et il renvoie la traduction en utilisant une API. Pour l'exercice je voudrais tester mon script avec pytest mais je ne parviens pas à tester l'action d'appeler des arguments en ligne de commande.

    Voici le script: (sans mon apikey bien sûr)

    #!/usr/bin/python3.6
    # -*- coding:Utf-8 -*-
    
    import json
    import argparse
    
    from ibm_watson import LanguageTranslatorV3
    
    
    def translate(text, language):
    	"""Reçoit un texte et un string décrivant le sens de traduction voulu
    	Utilise l'API d'IBM Watson Language Translator et renvoie le texte traduit
    
    	"""
    	apikey='******************************'
    	language_translator = LanguageTranslatorV3(
    			version='2018-05-01',
    			iam_apikey=apikey,
    			url='https://gateway-lon.watsonplatform.net/language-translator/api')
    
    	translation = language_translator.translate(
    			text,
    			language).get_result()
    	return json.dumps(translation['translations'][0]['translation']).replace("\"", "")
    
    def main():
    	"""Fonction principale"""
    	parser = argparse.ArgumentParser(description="Traducteur en ligne de commande")
    	parser.add_argument("text", help="Texte à traduire")
    	parser.add_argument("-e", "--english", action="store_true", help="traduit dans le sens français => anglais")
    	args = parser.parse_args()
    
    	if args.english:
    		language = "fr-en"
    	else:
    		language = "en-fr"
    	
    	print(translate(args.text, language))
    
    if __name__ == "__main__":
    	main()


    Et voici ma tentative de test:

    import trad as script
    
    def test_main(capsys):
    	script.main("door")
    	captured = capsys.readoutter()
    	assert captured.out == "Porte"
    

    L'idée étant de lancer le script avec un argument et de capturer l'impression écran pour comparer le résultat obtenu avec le résultat espéré...


    Le message d'erreur:

    ============================= test session starts ==============================
    platform linux -- Python 3.6.7, pytest-4.5.0, py-1.8.0, pluggy-0.11.0
    rootdir: /home/julien/Bureau/tests
    collected 1 items                                                              
    
    
    test_trad.py F                                                         [100%]
    
    =================================== FAILURES ===================================
    _________________________________ test_main ____________________________________
    
    capsys = <_pytest.capture.CaptureFixture object at 0x7f36ee8ec208>
    
        def test_main(capsys):
    >   	script.main("door")
    
    test_trad.py:5: 
    _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
    trad.py:9: in main
        args = parser.parse_args()
    /usr/lib/python3.6/argparse.py:1743: in parse_args
        args, argv = self.parse_known_args(args, namespace)
    /usr/lib/python3.6/argparse.py:1775: in parse_known_args
        namespace, args = self._parse_known_args(args, namespace)
    /usr/lib/python3.6/argparse.py:2010: in _parse_known_args
        ', '.join(required_actions))
    /usr/lib/python3.6/argparse.py:2402: in error
        self.exit(2, _('%(prog)s: error: %(message)s\n') % args)
    _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
    
    self = ArgumentParser(prog=('door',), usage=None, description=None, formatter_class=<class 'argparse.HelpFormatter'>, conflict_handler='error', add_help=True)
    status = 2
    message = "('door',): error: the following arguments are required: text\n"
    
        def exit(self, status=0, message=None):
            if message:
                self._print_message(message, _sys.stderr)
    >       _sys.exit(status)
    E       SystemExit: 2
    
    /usr/lib/python3.6/argparse.py:2389: SystemExit
    ----------------------------- Captured stderr call -----------------------------
    usage: ('door',) [-h] valeur
    ('door',): error: the following arguments are required: text
    ====================== 1 failed in 0.42 seconds ======================

    Donc le script fonctionne comme prévu, je voudrais juste trouver comment on peut tester l'appel à un script avec paramètres...

    • Partager sur Facebook
    • Partager sur Twitter

    Problème pytest et paramètres en ligne de commande

    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
    • Editeur
    • Markdown