2010-03-08 7 views
28

Warum nehmen so viele assertEquals() oder ähnliche Funktionen den erwarteten Wert als ersten Parameter und den tatsächlichen Wert als Sekunde?
Das scheint mir kontraproduktiv, gibt es also einen besonderen Grund für diese ungewöhnliche Reihenfolge?Warum sind assertEquals() Parameter in der Reihenfolge (erwartet, aktuell)?

+1

diesem Grund habe ich in der Regel mit Matcher am Ende, wie assertThat (tatsächliche, ist (erwartet)) Ich finde es so viel einfacher zu lesen – JonathanC

+0

Sind Sie sicher, dass wirklich die Reihenfolge ist? Die Dokumente geben keinen Standard für 'assertEqual' selbst an https://docs.python.org/2/library/unittest.html#unittest.TestCase.assertEqual und das Durchsuchen dieser Seite zeigt, dass die Reihenfolge innerhalb des Unittest-Moduls selbst inkonsistent ist . Aber dieses Python-Problem impliziert (tatsächlich, erwartet) ist in der Tat der Standard: http://bugs.python.org/issue10573 –

+0

Beachten Sie auch, dass 'assertEquals' veraltet ist - verwenden Sie' assertEqual' (obwohl zumindest in 2.7, es zeigt nicht wirklich an, welcher Parameter erwartet wird und welcher tatsächlich ist) –

Antwort

19

Weil die Autoren eine 50% ige Chance hatten, zu Ihrer Intuition zu passen.

Wegen der anderen Überlastung

assertWhatever(explanation, expected, actual) 

Und die Erklärung, die von dem, was Sie wissen, geht mit der erwarteten, das ist, was Sie wissen, wie es zu dem eigentlichen Gegensatz, was Sie nicht tun wissen Sie, wann Sie den Code schreiben.

+9

In diesem Fall wird es jedoch etwas inkonsistent, da in den meisten Sprachen die erforderlichen Parameter zuerst und die obligatorischen zuletzt angezeigt werden. Deshalb würde ich natürlich gehen für assertWhatever (tatsächlich, erwartet [, Erklärung]) – jor

+5

Sorry, ich meinte die _optional_ Einsen erscheinen zuletzt, nicht zwingend ... – jor

+2

Genau, jor! Außerdem ist es in Conditionals häufiger üblich, if (s == "a") zu schreiben als if ("a" == s) (obwohl es umstritten ist, ob es umgekehrt besser wäre - in Bezug auf die Gemeinsamkeit der erste) man gewinnt aber). – benroth

2

Die xUnit-Testkonvention ist erwartet/aktuell. Für viele ist das die natürliche Ordnung, denn das haben sie gelernt.

Interessanterweise in einer Pause von der Konvention für ein xUnit-Framework geht qunit für tatsächlich/erwartet. Mindestens mit Javascript können Sie einfach eine neue Funktion erstellen, die den alten und weisen Sie die ursprüngliche Variable kapselt:

var qunitEquals = equals; 
equals = function(expected, actual, message) { 
    qunitEquals(actual, expected, message); 
}; 
4

ich mit dem Konsens darüber einig, dass die Konsistenz # 1, aber das Verhalten des Vergleichens Wörterbücher kann sein, hilfreicher Datenpunkt, wenn Sie diese Frage bewerten.

Wenn ich ein "+" auf einem Diff sehe, lese ich dies als "das Verfahren, das geprüft wird, fügte dieses hinzu." Auch hier gelten persönliche Vorlieben.

Hinweis: Ich habe alphabetische Schlüssel verwendet und das Wörterbuch länger gemacht, so dass sich nur ein mittlerer Schlüssel aus Gründen der Klarheit des Beispiels ändern würde. Andere Szenarien zeigen mehr verschleierte Diffs an. Ebenfalls bemerkenswert, assertEqual uses assertDictEqual in> = 2,7 und> = 3,1

exl.py

from unittest import TestCase 


class DictionaryTest(TestCase): 

    def test_assert_order(self): 
     self.assertEqual(
      { 
       'a_first_key': 'value', 
       'key_number_2': 'value', 
       'z_last_key': 'value', 
       'first_not_second': 'value', 
      }, 
      { 
       'a_first_key': 'value', 
       'key_number_2': 'value', 
       'z_last_key': 'value', 
       'second_not_first': 'value', 
      } 
     ) 

Ausgang:

$ python -m unittest exl 
F 
====================================================================== 
FAIL: test_assert_order (exl.DictionaryTest) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "exl.py", line 18, in test_assert_order 
    'second_not_first': 'value', 
AssertionError: {'a_first_key': 'value', 'z_last_key': 'value', 'key_number_2': 'value', 'first_ [truncated]... != {'a_first_key': 'value', 'z_last_key': 'value', 'key_number_2': 'value', 'second [truncated]... 
    {'a_first_key': 'value', 
- 'first_not_second': 'value', 
    'key_number_2': 'value', 
+ 'second_not_first': 'value', 
    'z_last_key': 'value'} 

---------------------------------------------------------------------- 
Ran 1 test in 0.001s 

FAILED (failures=1) 
Verwandte Themen