subtest - python unittest warning




python, unittest: Gibt es eine Möglichkeit, Befehlszeilenoptionen an die App zu übergeben (4)

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 .

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

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.





unit-testing