ich Schwierigkeiten Testen Python Funktionen aufweisen, die, wie Funktionen eine iterable zurück, die Nachgeben oder Funktionen, die einfach eine iterable zurückkehren, wie return imap(f, some_iter)
oder return permutations([1,2,3])
.Testfunktionen iterable in Python Rückkehr
So mit dem Beispiel Permutationen erwarte ich die Ausgabe der Funktion [(1, 2, 3), (1, 3, 2), ...]
. Also beginne ich meinen Code zu testen.
def perm3():
return permutations([1,2,3])
# Lets ignore test framework and such details
def test_perm3():
assertEqual(perm3(), [(1, 2, 3), (1, 3, 2), ...])
arbeiten Dies wird nicht, da perm3()
ein iterable, kein Liste. So können wir dieses spezielle Beispiel beheben.
def test_perm3():
assertEqual(list(perm3()), [(1, 2, 3), (1, 3, 2), ...])
Und das funktioniert gut. Aber was, wenn ich iterable verschachtelt habe? Das ist iterable ergibt iterables? Wie sagen die Ausdrücke product(permutations([1, 2]), permutations([3, 4]))
. Nun ist dies wahrscheinlich nicht sinnvoll, aber es ist klar, dass es (einmal die Iteratoren entrollt) etwas wie [((1, 2), (3, 4)), ((1, 2), (4, 3)), ...]
. Wir können jedoch nicht nur list
um unser Ergebnis wickeln, da das nur iterable<blah>
zu [iterable<blah>, iterable<blah>, ...]
wird. Nun natürlich kann ich map(list, product(...))
, aber dies funktioniert nur für einen Verschachtelungsebene von 2.
So hat die Python-Test-Community haben keine Lösung für die Probleme wenn Iterables testen? Natürlich können einige Iterables nicht auf diese Weise getestet werden, wie wenn Sie einen unendlichen Generator wollen, aber immer noch dieses Problem sollte genug sein, dass jemand darüber nachgedacht haben könnte darüber.
Ich werde das akzeptieren, weil es so gut wie die Antwort von dbw ist. Anders als meine Antwort können Sie 'Tupel' /' Listen' mischen. Diese Antwort ist auch nur kopierbar runableable. :) Aber! Ich wäre zufriedener, wenn es eine Antwort gäbe, bei der Sie (1) tatsächlich prüfen, ob sie eine iterierbare (Rückgabewerte ([1,2,3]) 'zurückgibt zu' Liste (Permutationen ([1,2,3 ])) 'sollte nicht übergeben ** und ** (2) der geschachtelte erwartete Wert sollte korrekte Typen haben.Das Ändern eines der Tupel zu einer Liste sollte nicht passieren (ändern Sie' (2, 3, 1) 'in' [2, 3, 1] '). – Tarrasch
Ah, das ist gut genug, ich nehme an, dass ich Testtypen normalerweise vermeide und stattdessen versuche, Interfaces zu testen, damit die Implementierungsdetails sich ändern und die gleichen Daten/Ergebnisse erhalten bleiben – dbn