2


1

Pythonのユニットテストで揮発性の値を持つ辞書?

辞書を返す関数の単体テストを書く必要があります。 このディクショナリの値の1つは `+ datetime.datetime.now()+`で、もちろんテストの実行ごとに変わります。

私の主張ではそのキーを完全に無視したいのです。 今、私は辞書比較関数を持っていますが、私は本当にこのようにassertEqualを使いたいです。

def my_func(self):
    return {'monkey_head_count': 3, 'monkey_creation': datetime.datetime.now()}

... unit tests

class MonkeyTester(unittest.TestCase):
    def test_myfunc(self):
        self.assertEqual(my_func(), {'monkey_head_count': 3}) # I want to ignore the timestamp!

これを行うためのベストプラクティスやエレガントな解決策はありますか? 私は `+ assertAlmostEqual()+`を知っていますが、それはfloat iircにのみ有用です。

1 Answer


9


比較を行う前に、辞書からタイムスタンプを削除するだけです。

class MonkeyTester(unittest.TestCase):
    def test_myfunc(self):
        without_timestamp = my_func()
        del without_timestamp["monkey_creation"]
        self.assertEqual(without_timestamp, {'monkey_head_count': 3})

`+ datetime.now()+`を含む多くの時間関連のテストを実行していることに気付いた場合は、ユニットテストのdatetimeクラスをモンキーパッチできます。 このことを考慮

import datetime
constant_now = datetime.datetime(2009,8,7,6,5,4)
old_datetime_class = datetime.datetime
class new_datetime(datetime.datetime):
    @staticmethod
    def now():
        return constant_now

datetime.datetime = new_datetime

ユニットテストで `+ datetime.datetime.now()`を呼び出すと、常に ` constant_now `タイムスタンプが返されます。 そして、元の ` datetime.datetime.now()+`に切り替える必要がある場合は、簡単に言うことができます。

datetime.datetime = old_datetime_class

そして物事は正常に戻ります。 この種のことは役に立つかもしれません、あなたが与えた簡単な例では、比較する前に辞書からタイムスタンプを単に削除することをお勧めします。