Ausgehend von Greg Haskin's answer in this question, ich habe versucht, einen Unittest zu machen, um zu überprüfen, dass argparse den entsprechenden Fehler gibt, wenn ich es einige Args übergebe, die nicht in choices
vorhanden sind. unittest
generiert jedoch einen falschen positiven Wert mit der folgenden Anweisung try/except
.Unittest verwenden, um Argparse zu testen - Exit-Fehler
Zusätzlich, wenn ich einen Test unter Verwendung nur einer with assertRaises
Anweisung mache, zwingt argparse
das System beenden und das Programm führt keine weiteren Tests.
Ich möchte in der Lage sein, einen Test dafür zu haben, aber vielleicht ist es redundant angesichts der Tatsache, dass argparse
bei einem Fehler beendet?
#!/usr/bin/env python3
import argparse
import unittest
class sweep_test_case(unittest.TestCase):
"""Tests that the merParse class works correctly"""
def setUp(self):
self.parser=argparse.ArgumentParser()
self.parser.add_argument(
"-c", "--color",
type=str,
choices=["yellow", "blue"],
required=True)
def test_required_unknown_TE(self):
"""Try to perform sweep on something that isn't an option.
Should return an attribute error if it fails.
This test incorrectly shows that the test passed, even though that must
not be true."""
args = ["--color", "NADA"]
try:
self.assertRaises(argparse.ArgumentError, self.parser.parse_args(args))
except SystemExit:
print("should give a false positive pass")
def test_required_unknown(self):
"""Try to perform sweep on something that isn't an option.
Should return an attribute error if it fails.
This test incorrectly shows that the test passed, even though that must
not be true."""
args = ["--color", "NADA"]
with self.assertRaises(argparse.ArgumentError):
self.parser.parse_args(args)
if __name__ == '__main__':
unittest.main()
Fehler:
Usage: temp.py [-h] -c {yellow,blue}
temp.py: error: argument -c/--color: invalid choice: 'NADA' (choose from 'yellow', 'blue')
E
usage: temp.py [-h] -c {yellow,blue}
temp.py: error: argument -c/--color: invalid choice: 'NADA' (choose from 'yellow', 'blue')
should give a false positive pass
.
======================================================================
ERROR: test_required_unknown (__main__.sweep_test_case)
Try to perform sweep on something that isn't an option.
----------------------------------------------------------------------
Traceback (most recent call last): #(I deleted some lines)
File "/Users/darrin/anaconda/lib/python3.5/argparse.py", line 2310, in _check_value
raise ArgumentError(action, msg % args)
argparse.ArgumentError: argument -c/--color: invalid choice: 'NADA' (choose from 'yellow', 'blue')
During handling of the above exception, another exception occurred:
Traceback (most recent call last): #(I deleted some lines)
File "/anaconda/lib/python3.5/argparse.py", line 2372, in exit
_sys.exit(status)
SystemExit: 2
Die Testdatei 'test/test_argparse.py' hat eine Fülle von Beispielen, da sie die meisten Funktionen des Moduls testet. Das 'sys.exit' benötigt eine spezielle Handhabung. – hpaulj
Danke @hpaulj, wo kann ich diese Datei auf meinem System finden? [Ich habe herausgefunden, worüber ich hier spreche] (https://hg.python.org/cpython/file/default/Lib/test/test_argparse.py). – conchoecia
Ja, das ist die Datei. Möglicherweise benötigen Sie eine Entwicklungsversion von Python, um sie auf Ihrem eigenen Computer zu finden. Suchen Sie nach dem Verzeichnis 'Lib/test'.Aber der Download aus dem Repository ist auch in Ordnung. Die meisten Tests, die auf 'ParserTestCase' aufbauen, kümmern sich nicht um die Fehlermeldung; nur ob der Fall läuft oder nicht. Testen Sie weiter unten in der Datei nach Fehlermeldungen. – hpaulj