subtest - python unittest warning
python, unittest: Gibt es eine Möglichkeit, Befehlszeilenoptionen an die App zu übergeben (4)
Ich habe ein Modul, das nur Tests importiert und einige Testfälle enthält. Ich möchte einige Befehlszeilenoptionen akzeptieren (zum Beispiel den Namen einer Datendatei), aber wenn ich versuche, die Option zu übergeben, erhalte ich die Meldung "Option -i nicht erkannt". Ist es möglich, für die App unittest + Optionen zur Verfügung zu stellen (Hinweis: Ich verwende optparse, um mit den Optionen umzugehen)? Vielen Dank.
$ python test_app_data.py -i data_1.txt
option -i not recognized
=======================
Follow-up: Dies ist eine Implementierung der vorgeschlagenen Lösung:
import cfg_master #has the optparse option-handling code
...
if __name__ == '__main__':
#add you app's options here...
options_tpl = ('-i', '--in_dir', '-o', '--out_dir')
del_lst = []
for i,option in enumerate(sys.argv):
if option in options_tpl:
del_lst.append(i)
del_lst.append(i+1)
del_lst.reverse()
for i in del_lst:
del sys.argv[i]
unittest.main()
Aufbauend auf Alex 'Antwort ist es mit argparse
eigentlich ziemlich einfach:
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('--input', default='My Input')
parser.add_argument('filename', default='some_file.txt')
parser.add_argument('unittest_args', nargs='*')
args = parser.parse_args()
# TODO: Go do something with args.input and args.filename
# Now set the sys.argv to the unittest_args (leaving sys.argv[0] alone)
sys.argv[1:] = args.unittest_args
unittest.main()
Ich habe nicht alle Flags getestet, die Sie in unittest übergeben können, um zu sehen, ob sie funktionieren oder nicht, aber das Übergeben von Testnamen funktioniert, zB:
python test.py --input=foo data.txt MyTest
Führt MyTest mit foo
und data.txt
.
Für kleine Standalone-Apps verwende ich eine anfängliche Sentinel-Option (-t) und rufe unittest.main () auf, bevor Sie argparse.ArgumentParser () aufrufen.
if __name__ == "__main__":
if len(sys.argv) > 1 and sys.argv[1] in ["-t", "--test"]:
del(sys.argv[1])
sys.exit(unittest.main()) # pass sys.argv[
p = argparse.ArgumentParser()
. . .
In Ihrem Abschnitt if __name__ == '__main__':
den Sie uns nicht optparse
, müssen Sie optparse
und dann del sys.argv[1:]
bevor Sie die Kontrolle an unittest
Code übergeben, sodass der letztere Code nicht ausgeführt wird Versuchen Sie nicht, Ihre Befehlszeilenoptionen erneut zu interpretieren, wenn Sie sie bereits behandelt haben. (Es ist ein bisschen schwieriger, einige eigene Optionen zu haben und auch einige auf unittest
, obwohl dies auch möglich ist, wenn Sie solch komplexe Anforderungen haben.)
Sie sollten keine Argumente und Optionen zur Ausführung von Unittests verwenden, da diese auf diese Weise unter anderen, weniger vorhersehbaren Bedingungen ausgeführt werden. Sie sollten herausfinden, warum Sie Tests mit unterschiedlichen Daten durchführen müssen, und Sie sollten die Test-Suite vollständig genug machen, um den Grund für alle Datensätze abzudecken, ohne jedes Mal anders ausgeführt zu werden.