2010-06-02 9 views

Antwort

20

assert False löst eine Ausnahme ohne nützliche Protokollierungsinformationen aus. Der Test hatte einen Fehler.

self.assertFalse() löst eine Testfehlerausnahme mit Testfehlerinformationen wie einer Nachricht und einem Testnamen aus.

Es gibt einen Unterschied zwischen einem Fehler - Test konnte nicht einmal ausgeführt werden - und ein Fehler - Testcode funktioniert, aber die falsche Antwort produziert.

Fehler sind ein schwerwiegendes Problem mit Ihrem Code.

Fehler sind nur Fehler, die behoben werden müssen.

+0

Danke, das macht nützlich zu wissen, muss ich die 'assert False'-Zeilen entfernen. +1 – chrissygormley

+1

Hallo, das ist anscheinend falsch. Der Test-Runner sollte "AssertionError" erfassen (und tut dies) und sie korrekt als Testfehler melden. – wim

33

Wenn Sie laufen

import unittest 

class Test_Unittest(unittest.TestCase): 
    def test_assert(self): 
     assert False 
    def test_assertFalse(self): 
     self.assertFalse(True) 

if __name__ == '__main__': 
    unittest.main() 

Sie die gleichen Protokollinformationen zu erhalten, die gleiche failure:

FF 
====================================================================== 
FAIL: test_assert (__main__.Test_Unittest) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "/home/unutbu/pybin/test.py", line 6, in test_assert 
    assert False 
AssertionError 

====================================================================== 
FAIL: test_assertFalse (__main__.Test_Unittest) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "/home/unutbu/pybin/test.py", line 8, in test_assertFalse 
    self.assertFalse(True) 
AssertionError 

---------------------------------------------------------------------- 
Ran 2 tests in 0.000s 

FAILED (failures=2) 

Der Grund beide das gleiche behandelt werden, weil unittest.TestCase definiert

failureException = AssertionError 

Wenn Sie assert False sagen, wird ein AssertionError ausgelöst. Wenn Sie self.assertFalse(True) sagen, wird failureExeception ausgelöst.

Da diese Ausnahmen identisch sind, gibt es keinen offensichtlichen Unterschied.

assert und self.assertFalse unterscheiden sich jedoch in der herkömmlichen Verwendung.

assert wird verwendet, um zu deklarieren, dass eine bestimmte Bedingung an einem bestimmten Punkt im Code gelten soll. Es wird während der Entwicklung als Krücke verwendet, ist jedoch nicht für die Verwendung in Produktionscode gedacht. Wenn Sie python -O my_unittest.py ausführen, werden alle assert-Anweisungen ignoriert. Dies würde Ihre beabsichtigte Verwendung von assert untergraben, wodurch möglicherweise Ihre Komponententests auch bei einem Fehler bestanden werden.

Auch wenn (ohne das -O-Flag) das Ergebnis gleich ist, ist assert nicht für die Verwendung im Komponententestcode gedacht. Verwenden Sie self.assertTrue oder self.assertFalse beim Schreiben von Komponententests.

+0

anstelle von 'self.assertFalse (True) 'Sie können (und sollten wahrscheinlich)' self.fail() 'verwenden. – freaker

10

Ein Punkt die Antworten bisher versäumt haben, zu erwähnen ist, dass es mehrere Test-Frameworks (zB py.test und nose), die Selbstbeobachtung Magie Verwendung Python, damit Sie Unit-Tests wie so schreiben:

# test_this_and_that.py 
def test_frobber(): 
    assert frobber('x') == 'y' 
# EOF 

ohne Sie müssen einen der oben genannten untestest boilerplate eingeben. In einigen Fällen kann es auf ein Framwork/Stilproblem hinauslaufen.

Verwandte Themen