web-dev-qa-db-ja.com

Unittest-リストのアイテムのセットが別のリストに含まれている(または含まれていない)ことを表明する

こんにちは私はプログラミングの初心者であり、項目のリスト内のany項目が別のリストに存在するかどうかを確認するテストを作成しようとしています(unittest in Python 2.7)。

たとえば、リスト["dog"、 "cat"、 "frog]があり、テストしているメソッドの結果が[" tiger "、" lion "、" kangaroo "、" frog]である場合、テストに前のリスト(「カエル」)の項目の1つが含まれているため、失敗します。また、テストで両方のリストに含まれる単語を教えてください(つまり、テストが失敗した原因となった単語)。

私が試してみました:

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

メソッドの結果は["cat"、 "dog"、 "tiger"]ですが、テストの結果は不合格で、次のように述べています。

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

「cat」と「dog」が2番目のリストにあるため、このテストでokが返されるようにします。それはassertInが私がするだろうと思ったことをしないようです(私はそれが a のいずれかが b に存在するかどうかをチェックすることだと思った)。

逆の場合も、失敗させたい場合はassertNotInが通過します。

しばらく探していましたが、何を探しているのかわからないので見つけにくいです。

お読みいただきありがとうございます。

[〜#〜] edit [〜#〜]:クリスの解決策を試してみました。

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

エラーメッセージで重複する(つまり、失敗をトリガーする)単語のリストを取得するために、ここから以下のコードを追加しました Python AssertionErrorのメッセージを変更する方法

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

結果はまさに私が欲しいものです:

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

この質問 を確認すると、次のようなことが簡単にわかります。

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

この関数は、失敗または成功を示すブール値と、両方のリストで発生するアイテムのリストを含むタプルを返します。

これをアサートステートメントで本当に実行したい場合は、そのタプルの最初の要素を使用できます...

4
Chris

リストとassertInを反復処理するか、setsを使用してself.assertTrue(set(a).issuperset(set(b)))のようなことを行うことができます。

2
Alex
self.assertTrue(any(animal in method("cat dog tiger") for animal in ("cat", "dog")))
1
user2729400

シーケンスで繰り返し不可の値が予想される場合は、セットの使用を検討する方が良いかもしれません。これにより、オーバーラップの種類を簡単にチェックできます。

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

したがって、abのサブセットであることを確認すると、次のようになります。

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

1
Violet Red