practices - python unittest setupclass




Unittest verursacht sys.exit() (4)

Egal was ich tue, sys.exit () heißt unittest, selbst die trivialsten Beispiele. Ich kann nicht sagen, ob meine Installation versaut ist oder was passiert.

IDLE 1.2.2      ==== No Subprocess ====
>>> import unittest
>>> 
>>> class Test(unittest.TestCase):
        def testA(self):
            a = 1
            self.assertEqual(a,1)

>>> unittest.main()
option -n not recognized
Usage: idle.pyw [options] [test] [...]

Options:
  -h, --help       Show this message
  -v, --verbose    Verbose output
  -q, --quiet      Minimal output

 Examples:
   idle.pyw                               - run default set of tests
   idle.pyw MyTestSuite                   - run suite 'MyTestSuite'
   idle.pyw MyTestCase.testSomething      - run MyTestCase.testSomething
   idle.pyw MyTestCase                    - run all 'test*' test methods
                                           in MyTestCase

Traceback (most recent call last):
  File "<pyshell#7>", line 1, in <module>
    unittest.main()
  File "E:\Python25\lib\unittest.py", line 767, in __init__
    self.parseArgs(argv)
  File "E:\Python25\lib\unittest.py", line 796, in parseArgs
    self.usageExit(msg)
  File "E:\Python25\lib\unittest.py", line 773, in usageExit
    sys.exit(2)
SystemExit: 2
>>> 

Öffne den Quellcode zu unittest.py . unittest.main() ist sys.exit() , um sys.exit() nach dem Ausführen aller Tests sys.exit() . Verwenden Sie TextTestRunner , um TextTestRunner über die Eingabeaufforderung auszuführen.


Versuchen Sie nicht, unittest.main unittest.main() von IDLE aus auszuführen. Es versucht, auf sys.argv , und es erhält die Argumente, mit denen IDLE gestartet wurde. Führen Sie Ihre Tests auf andere Weise als IDLE aus, oder rufen Sie unittest.main() in seinem eigenen Python-Prozess auf.


Ihr Beispiel wird auch auf meiner Installation beendet. Ich kann es die Tests ausführen lassen und in Python bleiben, indem ich

unittest.main()

zu

unittest.TextTestRunner().run(unittest.TestLoader().loadTestsFromTestCase(Test))

Weitere Informationen finden Sie hier in der Python-Bibliotheksreferenz.


Es ist schön, in der Lage zu sein, zu demonstrieren, dass Ihre Tests funktionieren, wenn Sie das Unittest-Modul zum ersten Mal ausprobieren, und um zu wissen, dass Sie Ihre Python-Shell nicht beenden werden. Diese Lösungen sind jedoch versionsabhängig.

Python 2.6

Ich benutze Python 2.6 bei der Arbeit und import unittest2 as unittest (das ist das unittest Modul, das angeblich in Python 2.7 gefunden wurde).

Der unittest.main(exit=False) funktioniert nicht in Pitton 2.6's unittest2, während JoeSkoras Lösung dies tut und wiederholt:

unittest.TextTestRunner().run(unittest.TestLoader().loadTestsFromTestCase(Test))

Um dies in seine Komponenten und Standardargumente aufzugliedern, mit korrekten semantischen Namen für die verschiedenen zusammengesetzten Objekte:

import sys # sys.stderr is used in below default args

test_loader = unittest.TestLoader()
loaded_test_suite = test_loader.loadTestsFromTestCase(Test)
                                           # Default args:
text_test_runner = unittest.TextTestRunner(stream=sys.stderr,
                                           descriptions=True, 
                                           verbosity=1)
text_test_runner.run(loaded_test_suite)

Python 2.7 und 3

In Python 2.7 und höher sollte Folgendes funktionieren.

unittest.main(exit=False)




unit-testing