Ich habe gerade einen halben Tag damit verbracht, einen Fehler auf ein Diktat zu untersuchen, das ich beim Überstreichen vergessen habe. Obwohl dieser Teil des Codes getestet wurde, haben die Tests ihn nicht aufgenommen, da das Diktat während des Tests eine wiederholbare Reihenfolge aufwies. Nur wenn ich das Diktat gemischt habe, sind die Tests fehlgeschlagen! (Ich habe eine intermediäre random.shuffle
'd-Liste verwendet und ein OrderedDict
erstellt)
Das macht mir Angst, weil es überall ähnliche Fehler geben könnte!
Gibt es eine Möglichkeit, alle Dicts während des Tests global ungeordnet zu machen?
Update: Ich denke, ich habe zumindest herausgefunden, was den Fehler verursacht hat. Wie hier hier beschrieben, werden dicts mit int-Schlüsseln normalerweise sortiert, sind aber möglicherweise nicht immer vorhanden. Meine Hypothese: In meinen Tests sind die Ints immer klein (Ordnung 10) und damit immer in der Reihenfolge. Im realen Lauf sind die Ints jedoch viel größer (Ordnung 10 ^ 13) und daher nicht immer geordnet. Ich konnte dieses Verhalten in einer interaktiven Sitzung reproduzieren: list(foo.keys()) == sorted(foo.keys())
war immer True
für kleine Schlüssel, aber nicht für jedes Diktat mit sehr großen Schlüsseln.
Ab Version 3.6 enthalten dicts die Schlüsselreihenfolge . Wenn Sie möchten, dass sie sich auf eine bestimmte Weise verhalten, können Sie eine Klasse erstellen, die von einem Diktat erbt und ihr das gewünschte Verhalten geben (z. B. sicherstellen, dass die Schlüsselliste vor der Rückgabe gemischt wird).
Unabhängig von der Version von Python, die Sie verwenden, sollten Sie die Implementierungsdetails überprüfen, wenn Sie versuchen möchten, sich auf ein bestimmtes Verhalten der dict-Implementierung zu verlassen. Besser noch, für die Portabilität, kodieren Sie einfach eine Lösung, die sicherstellt, dass sie sich so verhält, wie Sie es erwarten, entweder wie oben erwähnt, oder indem Sie eine Liste der Schlüssel mischen oder etwas anderes.
Tags und Links python unit-testing python-3.x