3

私はPythonのunittestライブラリを使用していくつかのユニットテストを作成しようとしています。オブジェクトの順序付けられていないリストを返す関数があります。オブジェクトが同じであることを確認したいので、assertCountEqualを使用してこれを実行しようとしています。

ただし、個々のオブジェクトが互いに等しい()にもかかわらず、これは失敗しているよう==です。アサーションの失敗からの「diff」出力は次のとおりです。

First has 1, Second has 0:  Intersection(time=8.033252939677466e-08, del_time=8.033252939677466e-08, pos=Vector(10.00, 0.00), line=Line(Vector(500.00, 0.00), Vector(0.00, 0.00)), ent=None, oth=None, invalid=False)
First has 1, Second has 0:  Intersection(time=-9.918729244820295e-16, del_time=-9.918729244820295e-16, pos=Vector(10.00, 0.00), line=Line(Vector(500.00, 0.00), Vector(0.00, 0.00)), ent=None, oth=None, invalid=False)
First has 0, Second has 1:  Intersection(time=8.033252939677466e-08, del_time=8.033252939677466e-08, pos=Vector(10.00, 0.00), line=Line(Vector(500.00, 0.00), Vector(0.00, 0.00)), ent=None, oth=None, invalid=False)
First has 0, Second has 1:  Intersection(time=-9.918729244820295e-16, del_time=-9.918729244820295e-16, pos=Vector(10.00, 0.00), line=Line(Vector(500.00, 0.00), Vector(0.00, 0.00)), ent=None, oth=None, invalid=False)

それらが等しいことを確認します。

>>> i = Intersection(time=8.033252939677466e-08, del_time=8.033252939677466e-08, pos=Vector(10.00, 0.00), line=Line(Vector(500.00, 0.00), Vector(0.00, 0.00)), ent=None, oth=None, invalid=False)
>>> j = Intersection(time=8.033252939677466e-08, del_time=8.033252939677466e-08, pos=Vector(10.00, 0.00), line=Line(Vector(500.00, 0.00), Vector(0.00, 0.00)), ent=None, oth=None, invalid=False)
>>> i == j
True
>>> i = Intersection(time=-9.918729244820295e-16, del_time=-9.918729244820295e-16, pos=Vector(10.00, 0.00), line=Line(Vector(500.00, 0.00), Vector(0.00, 0.00)), ent=None, oth=None, invalid=False)
>>> j = Intersection(time=-9.918729244820295e-16, del_time=-9.918729244820295e-16, pos=Vector(10.00, 0.00), line=Line(Vector(500.00, 0.00), Vector(0.00, 0.00)), ent=None, oth=None, invalid=False)
>>> i == j
True

私の推測では、この関数は、2つが等しいというよりもassertCountEqual、同じID(たとえば)を持っているかどうかをチェックしていると思います。i is j

  • 同じdiff機能を提供するが、同一性ではなく等価比較を使用する単体テスト関数はありますか?
  • または、同様に機能する関数を作成する方法はありassertCountEqualますか?

編集:私はPython3.2.2を実行しています。

4

3 に答える 3

4

あなたは比較がどのように行われるかを自分で探すことができます:

  • 各反復可能ファイルからリストを生成します
  • collections.Counterを使用してオブジェクトをカウントします-ハッシュ可能な要素に対してのみ機能します
  • 要素がハッシュ可能でない場合は、直接比較します

Intersectionオブジェクトであるため、デフォルトでハッシュ可能ですが、適切なハッシュ関数を提供しない場合(比較メソッドを提供する場合はこれを行う必要があります)、それらは異なると見なされます。

それで、あなたのIntersectionクラスはハッシュコントラクトを満たしますか?

于 2012-05-04T21:10:51.313 に答える
1

順序付けされていないリストを操作するとき、私は通常このパターンを使用します(可能な場合)

TestCaseを拡張するクラスで

self.assertTrue(set(a) == set(b), 'The lists are not equal.')

setこの場合、順序付けされていないグループの比較が可能になるため使用しますが、同じオブジェクトが2つある場合、比較は失敗するはずですが、その場合は両方のリストを並べ替えてから比較する必要があります。

このようなインスタンスに依存しているためis、比較する場合を除いて、近づかないようにしています。None

これが例です

In [2]: a = [0,1,2]

In [3]: b = [0,2,1,0]

In [4]: set(a) == set(b)
Out[4]: True

In [5]: c = [2,0,1]

In [6]: a.sort() == c.sort()
Out[6]: True

より複雑なオブジェクトまたはクラスの場合は、次のようなものを試してみてください。

self.assertTrue(a==b)

または、独自の比較メソッドを作成することもできます

def compare_complex(*args): 
  for attr in ...
    if getattr(args[0],attr) != getattr(args[1],attr): return False
  return True

重要な値を格納するために属性を使用する2つのクラス、またはNumpyインスタンスを分析するときに、過去に同様の何かを使用しました

于 2012-05-04T20:41:26.470 に答える
1

assertCountEqual()collections.Counter要素がハッシュ可能である場合に使用します。Python 3では、クラスが独自のクラスを定義している__eq__場合、デフォルト__hash__は抑制されます。

あなたはあなた自身を持っています__eq__-定義します__hash__(等しい場合__eq__は等しくなければなりません)そしてあなたは大丈夫でなければなりません。

于 2012-05-04T22:03:14.647 に答える