[PYTHON] Tester la version du module argparse

Problèmes que vous souhaitez résoudre

Supposons qu'il existe un tel analyseur.

main.py


__version__ = '0.0.1'

def prepare_parser():
    parser = ArgumentParser(description=(__doc__),
                            formatter_class=RawDescriptionHelpFormatter)
    parser.add_argument('-d', '--debug', action='store_true',
                        help='Show debug log')
    parser.add_argument('-v', '--version', action='version',
                        version=__version__,
                        help='Show version and exit')
    return parser

Supposons que vous souhaitiez tester que cette partie de version peut être utilisée correctement.

Le problème est que `` parser.parse_args (['-v']) '' fera voler SystemExit à ce stade.

>>> from main import prepare_parser
>>> parser = prepare_parser()
>>> args = parser.parse_args(['-v'])
0.0.1
$     <--L'interpréteur s'est terminé car la sortie système vole.

Ceci est une spécification de l'action de version d'argparse.

'version' - This expects a version= keyword argument in the add_argument() call, and prints version information and exits when invoked:

https://docs.python.org/3.6/library/argparse.html#action

Je ne veux pas que `` sys.exit () '' vole avec désinvolture au milieu d'un test unitaire. En outre, je veux confirmer que la version est sortie correctement.

Il peut y avoir un correctif (https://docs.python.jp/3/library/unittest.mock-examples.html#patch-decorators), mais si possible, je voudrais traiter le contenu d'argparse comme une boîte noire.

Ce que j'ai fait

Essayez ce qui suit.

tests.py


from contextlib import contextmanager
from io import StringIO
import unittest
import sys

from main import prepare_parser, __version__

@contextmanager
def capture_stdout(command, *args, **kwargs):
    out, sys.stdout = sys.stdout, StringIO()
    try:
        command(*args, **kwargs)
    finally:
        sys.stdout.seek(0)
        yield sys.stdout.read()
        sys.stdout = out


class MyTest(unittest.TestCase):
    def test_version(self):
        parser = prepare_parser()
        with self.assertRaises(SystemExit):
            with capture_stdout(parser.parse_args, ['-v']) as output:
                self.assertIsNotNone(output)
                self.assertEqual(__version__, output.rstrip())

        with self.assertRaises(SystemExit):
            with capture_stdout(parser.parse_args,
                                ['--version']) as output:
                self.assertIsNotNone(output)
                self.assertEqual(__version__, output.rstrip())


if __name__ == '__main__':
    unittest.main()

En demandant au gestionnaire de contexte de fournir la chaîne qui a été envoyée à stdout lorsque l'exception a été ignorée, en espérant que `` SystemExit '' serait ignoré.

Je suis venu pour pouvoir tester.

Lors de la mise en commentaire de la partie facultative qui analyse `` -v '', etc.

$ python tests.py
usage: tests.py [-h] [-d]
tests.py: error: unrecognized arguments: -v
F
======================================================================
FAIL: test_version (__main__.MyTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "tests.py", line 26, in test_version
    self.assertEqual(__version__, output.rstrip())
AssertionError: '0.0.1' != ''
- 0.0.1
+


----------------------------------------------------------------------
Ran 1 test in 0.001s

FAILED (failures=1)

Si vous commentez dans

$ python tests.py
.
----------------------------------------------------------------------
Ran 1 test in 0.001s

OK

Impressions

Je ne pense pas que ce soit le genre de test que je veux faire. Ce test est-il vulnérable ...? Je ne suis pas sûr.

Y a-t-il un meilleur moyen?

Environnement utilisé pour la confirmation

référence

Recommended Posts

Tester la version du module argparse
Utilisons la version Python du module API Confluence.
Élever la version de pyenv elle-même
Tester l'adéquation de la distribution
pyenv-changer la version python de virtualenv
Quelle est la version TLS par défaut du module de requêtes python?
Comment vérifier la version de Django
Passez le chemin du module python importé
À propos de l'environnement virtuel de Python version 3.7
[Python] Essayez pydash de la version Python de lodash
Vérifiez le chemin du module importé Python
Version Migemo de la commande: find ,: mfind
À propos du test
Essai du parseur d'emacs-org orgparse pour python
L'histoire de la création du Mel Icon Generator version 2
[Python] Teste le matagi lunaire du delta relatif
Utilisez la dernière version de PyCharm sur Ubuntu
Écrire une note sur la version python de python virtualenv
Essayez Progate Free Edition [Python I]
[Python] Une compréhension approximative du module de journalisation
Essayez d'utiliser le module de collections (ChainMap) de python3
Le début de cif2cell
Scraping de l'historique d'utilisation du cycle de la communauté Version PhantomJS
Installez la dernière version de CMake sur Ubuntu 18.04.4 LTS
Obtenez la version GNOME
Le sens de soi
Ouvrez la version Chrome de LINE à partir de la ligne de commande [Linux]
Installation d'OpenMDAO (version 1.7.1)
Découvrez la version de la langue que vous utilisez
[python] Récupère la liste des classes définies dans le module
le zen de Python
L'histoire de sys.path.append ()
Testons l'hypothèse d'effondrement médical du nouveau virus corona
Gérez le numéro de version du package de requirements.txt avec pip-tools
Comment accéder à la variable globale du module importé
La dernière version de Pillow 7.0.0 tuera la transformation de pytorch.
Vérifiez le type et la version de la distribution Linux
Résumé de la méthode d'essai
Chargez dynamiquement le module.
La vengeance des types: la vengeance des types
J'ai essayé d'exécuter l'exemple de code du module Ansible
Notes sur la version de CUDA, cuDNN où tensorflow-gpu fonctionnait
Mettez la dernière version de Python dans Linux (Debian) du Chromebook
Comment tester les attributs ajoutés par add_request_method de pyramid
Facilitez la compréhension de l'affichage des exceptions du module Python
Afficher à l'aide du module python du backend mobile Nifty Cloud
(Note) Comment passer le chemin de votre propre module
Accrocher à la première importation du module et imprimer le chemin du module
[Linux] [module du noyau] Spécifier / limiter le CPU d'exécution de kthread
Installez la dernière version de Git sur votre serveur Linux
Commandes et fichiers pour vérifier la version de CentOS Linux
2015-11-26 python> Afficher la liste des fonctions du module> import math> dir (math)
L'histoire de la rétrogradation de la version de tensorflow dans la démo de Mask R-CNN.
Grattage du résultat de "Schedule-kun"
Récupérer automatiquement la version installée
10. Compter le nombre de lignes
L'histoire de la construction de Zabbix 4.4
Vers la retraite de Python2
Pour se préparer au test G 2020 # 2