[PYTHON] Testen Sie die Version des Argparse-Moduls

Probleme, mit denen Sie sich befassen möchten

Angenommen, es gibt einen solchen Parser.

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

Angenommen, Sie möchten testen, ob dieser Verison-Teil ordnungsgemäß verwendet werden kann.

Das Problem ist, dass parser.parse_args (['-v']) dazu führt, dass SystemExit an diesem Punkt fliegt.

>>> from main import prepare_parser
>>> parser = prepare_parser()
>>> args = parser.parse_args(['-v'])
0.0.1
$     <--Der Interpreter wurde beendet, weil der Systemausgang fliegt.

Dies ist eine Spezifikation der Versionsaktion von 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

Ich möchte nicht, dass sys.exit () mitten in einem Unit-Test beiläufig fliegt. Außerdem möchte ich bestätigen, dass die Version ordnungsgemäß ausgegeben wird.

Möglicherweise gibt es einen Patch (https://docs.python.jp/3/library/unittest.mock-examples.html#patch-decorators), aber wenn möglich, möchte ich den Inhalt von argparse als Black Box behandeln.

Was ich getan habe

Versuche Folgendes.

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()

Indem der Kontextmanager die Zeichenfolge ausgibt, die beim Überspringen der Ausnahme an stdout gesendet wurde, in der Hoffnung, dass der "SystemExit" übersprungen wird.

Ich bin gekommen, um testen zu können.

Beim Auskommentieren des optionalen Teils, der -v usw. analysiert.

$ 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)

Wenn Sie einen Kommentar abgeben

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

OK

Impressionen

Ich denke nicht, dass es die Art von Test ist, die ich machen möchte. Ist dieser Test anfällig ...? Ich bin mir nicht sicher.

Gibt es einen besseren Weg?

Umgebung zur Bestätigung verwendet

Referenz

Recommended Posts

Testen Sie die Version des Argparse-Moduls
Verwenden wir die Python-Version des Confluence-API-Moduls.
Erhöhen Sie die Version von pyenv selbst
Testen Sie die Eignung der Verteilung
pyenv-change die Python-Version von virtualenv
Was ist die Standard-TLS-Version des Python-Anforderungsmoduls?
So überprüfen Sie die Version von Django
Übergeben Sie den Pfad des importierten Python-Moduls
Informationen zur virtuellen Umgebung von Python Version 3.7
[Python] Probieren Sie pydash der Python-Version von lodash aus
Überprüfen Sie den Pfad des importierten Python-Moduls
Migemo-Version des Befehls: find,: mfind
Über den Test
Test von emacs-org parser orgparse für Python
Die Geschichte der Herstellung des Mel Icon Generator Version 2
[Python] Testen Sie die Mondmatagi des relativen Deltas
Verwenden Sie die neueste Version von PyCharm unter Ubuntu
Schreiben Sie eine Notiz über die Python-Version von Python Virtualenv
Probieren Sie Progate Free Edition [Python I]
[Python] Ein grobes Verständnis des Protokollierungsmoduls
Versuchen Sie es mit dem Sammlungsmodul (ChainMap) von python3
Der Beginn von cif2cell
Scraping Community Cycle Nutzungsverlauf PhantomJS-Version
Installieren Sie die neueste Version von CMake unter Ubuntu 18.04.4 LTS
Holen Sie sich die GNOME-Version
Die Bedeutung des Selbst
Öffnen Sie die Chrome-Version von LINE über die Befehlszeile [Linux].
Installation von OpenMDAO (Version 1.7.1)
Finden Sie die Version der Sprache heraus, die Sie ausführen
[Python] Ruft die Liste der im Modul definierten Klassen ab
der Zen von Python
Die Geschichte von sys.path.append ()
Lassen Sie uns die medizinische Kollapshypothese des neuen Koronavirus testen
Verwalten Sie die Paketversionsnummer von require.txt mit pip-tools
So greifen Sie auf die globale Variable des importierten Moduls zu
Die neueste Version von Pillow 7.0.0 wird die Transformation von Pytorch beenden.
Überprüfen Sie den Linux-Verteilungstyp und die Version
Zusammenfassung der Testmethode
Laden Sie das Modul dynamisch.
Rache der Typen: Rache der Typen
Ich habe versucht, den Beispielcode des Ansible-Moduls auszuführen
Hinweis zur Version von CUDA, cuDNN, in der Tensorflow-GPU funktioniert hat
Stellen Sie die neueste Version von Python in Linux (Debian) von Chromebook
So testen Sie die Attribute, die durch add_request_method of pyramid hinzugefügt wurden
Erleichtern Sie die Anzeige von Python-Modulausnahmen
Anzeigen mit dem Python-Modul des mobilen Nifty Cloud-Backends
(Hinweis) So übergeben Sie den Pfad Ihres eigenen Moduls
Schließen Sie den ersten Import des Moduls an und drucken Sie den Modulpfad
[Linux] [Kernelmodul] Geben Sie die Ausführungs-CPU von kthread an / begrenzen Sie sie
Installieren Sie die neueste Version von Git auf Ihrem Linux-Server
Befehle und Dateien zum Überprüfen der Version von CentOS Linux
26.11.2015 Python> Funktionsliste des Moduls anzeigen> Mathematik importieren> Verzeichnis (Mathematik)
Die Geschichte der Herabstufung der Version von Tensorflow in der Demo von Mask R-CNN.
Scraping das Ergebnis von "Schedule-Kun"
Automatisch die installierte Version abrufen
10. Zählen der Anzahl der Zeilen
Die Geschichte des Baus von Zabbix 4.4
Auf dem Weg zum Ruhestand von Python2
Für die Prüfung G-Test 2020 # 2