4

私は、1 つのコードベース (2.6、2.7、および 3.3+) で、python ライブラリを python 2 から python 2 および 3 にのみ移植しています。残っている主な問題は、多くのテストが次のようなものを使用していることです。

def test(self):
 example = {u'foo': u'bar'}
 self.assertEqual(str(example), "{u'foo': u'bar'}")

これは python 2 で動作しますが、python3 では例外が発生します:

 AssertionError: "{'foo': 'bar'}" != "{u'foo': u'bar'}"

「異なるテスト」以外に、これらの問題を処理する標準的な方法はありますか? オーバーロード__repr__

4

2 に答える 2

8

それらのテストを取り除きます。それらはほとんど役に立たない:

  • の Python 実装が機能しているかどうかをテストしdict.__repr__ます。Python 自体はすでにこれをテストしています。代わりにプロジェクトのコードベースに注目してください。Python が辞書表現を正しくレンダリングできない場合、それを修正するのはプロジェクトの仕事ではありません。

  • Python 辞書には決まった順序がありません。それらの表現が特定の文字列と一致するかどうかのテストは安定しません。

    さらに、Python 3.3 ではハッシュのランダム化が導入されています。これは、特定の辞書の順序が呼び出しごとに変わることを意味します。を参照してくださいPYTHONHASHSEED

プロジェクト API calll の結果をテストする場合は、self.assertEqual()代わりに次を使用して辞書の等価性をテストします。assertDictEqual()2 つの辞書が一致しない場合に意味のあるエラー メッセージを表示するために使用します。

Python 3.3u'foo'は type のリテラルとして解釈するためstr、出力の比較{u'foo': u'bar}は Python 2.6、2.7、3.3 以降で機能します。

于 2013-10-23T23:45:40.900 に答える
3

これはあなたの実際のコードではないと思います。あなたの実際のコードは、もう少しばかげたことをしていません: 辞書が期待される結果と一致することを確認しようとしています。

これを行う方法は、文字列表現を比較するのではなく、辞書を直接比較することです。

self.assertEqual(example, {u'foo': u'bar'})

これは 2.x と 3.x の両方で機能します (3.3+ が必要なためu、不要な場合はプレフィックスが有効であることを意味します)。

于 2013-10-23T23:51:21.367 に答える