2017-08-17 2 views
1

Hallo Ich bin neu in der Programmierung und und versuchen, einen Test zu machen, der prüft, ob Elemente in einer Liste von Elementen vorhanden sind eine andere Liste (mit Unittest in Python 2.7).Unittest - Assert eine Reihe von Elementen einer Liste sind (oder nicht) in einer anderen Liste enthalten

Zum Beispiel wenn ich eine Liste ["Hund", "Katze", "Frosch"] habe und das Ergebnis der Methode die ich teste ist ["Tiger", "Löwe", "Känguru", "Frosch"] möchte, dass der Test fehlschlägt, weil er eines der Elemente der vorherigen Liste enthält ("Frosch"). Ich möchte auch, dass der Test mir sagt, welche Wörter beide Listen hatten (d. H. Welche Wörter den Test als einen Fehler verursacht haben).

Ich habe versucht:

self.assertIn(["cat", "dog"], method("cat dog tiger")) 

Das Ergebnis des Verfahrens ist [ „Katze“, „Hund“, „tiger“] noch das Ergebnis des Tests wird ein fehlschlagen und sagt:

AssertionError: ['cat', 'dog'] not found in ['cat', 'dog', 'tiger'] 

Ich möchte, dass dieser Test OK zurückgibt, weil "Katze" und "Hund" in der zweiten Liste vorhanden sind. Es scheint assertIn tut nicht, was ich dachte, es würde tun (ich dachte, es war zu überprüfen, ob eines von ein in b vorhanden sind).

Und umgekehrt, übergibt assertNotIn, wenn ich will, dass es fehlschlägt.

Ich habe schon eine Weile gesucht, aber weil ich nicht sicher bin, wonach ich suche, ist es schwer zu finden.

Vielen Dank für das Lesen, ich hoffe, das macht Sinn.

EDIT: Ich habe mit Chris Lösung gegangen und es funktioniert, wie ich will:

def myComp(list1, list2): 
    section = list(set(list1).intersection(list2)) 

die Liste der Wörter zu erhalten, die (dh Auslösen der Fail) in der Fehlermeldung überlappen, habe ich die Code unten von hier How to change the message in a Python AssertionError?:

try: 
    assert(len(section)==0) 
except AssertionError as e: 
    e.args += ('The following are present in the processed text', 
    section) 
    raise 

Das Ergebnis ist genau das, was ich will:

AssertionError: ('The following are pressent in the processed text', ['dog', 
'cat']) 
+0

die Liste '[ 'Katze', 'Hund'] 'ist nicht gefunden in der Liste '['cat', 'dog', 'tiger']' versuche 'print ['a'] in ['a']' in einer Eingabeaufforderung - es ist falsch, weil die Liste nicht in der Liste ist, und es macht keinen elementweisen Vergleich. – Stael

Antwort

0

Sie sollten einen Blick auf this question haben, dann können Sie leicht erkennen, dass so etwas wie:

def myComp(list1, list2): 
    section = list(set(list1).intersection(list2)) 
    return ((len(section)==0), section) 

diese Funktion ein Tupel mit einem boolean zurück angibt, nicht gelingt oder Erfolg und die Liste der Elemente auftretenden beide Listen.

wenn Sie wirklich diese Aussage in einer Assertion tun wollen Sie könnten nur das erste Element des Tupels verwenden ...

+0

Danke Chris, das hat genau so funktioniert, wie ich will. Ich möchte die assert-Anweisung behalten, wollte aber auch eine Liste haben, was den Fehler verursacht hat. Suche Stack Overflow Ich habe einen Beitrag über die Änderung der Assert Error Statement gefunden, die ich am Ende des Codes hinzugefügt habe, ich hoffe es ist in Ordnung Programmierpraxis, da es genau das tut was ich brauche !: proved: assert (len (section) == 0) außer AssertionError als e: e.args + = ('Die folgenden sind in der verarbeiteten Text', Abschnitt) erhöhen – RubyJane

0
self.assertTrue(any(animal in method("cat dog tiger") for animal in ("cat", "dog"))) 
0

Sie können entweder durchlaufen Ihre Liste und assertIn, oder verwenden Sie set s und Sie tun können, etwas wie self.assertTrue(set(a).issuperset(set(b))).

1

Wenn Sie nicht wiederholbare Werte in Ihren Sequenzen erwarten, ist es vielleicht besser, Sätze zu verwenden, da Sie sie leicht auf Überlappungen überprüfen können.

>>> a, b = {'dog', 'cat'}, {'dog', 'cat', 'wolf', 'crab'} 
>>> a & b 
set(['dog', 'cat']) 
>>> a^b 
set(['wolf', 'crab']) 

Also für eine Überprüfung ist Teilmenge von b wäre so etwas wie dieses:

>>> not bool(a^b & a) 
True 

etc

Verwandte Themen