1. ホーム
  2. python

[解決済み] Pythonの「unittest」を使ってファイルを書いている関数のユニットテストを行う方法

2023-01-07 04:38:38

質問

出力ファイルをディスクに書き出すPython関数があります。

私はPythonの unittest モジュールを使ってユニットテストを書きたいと思います。

ファイルの等価性をどのように主張すればよいでしょうか。ファイルの内容が期待したものと異なる場合はエラーになり、さらに差分のリストが表示されるようにしたいです。Unix の 差分 コマンドの出力のように。

公式または推奨の方法はありますか?

どのように解決するのですか?

一番簡単なのは、出力ファイルを書き出し、その内容を読み、ゴールド(期待)ファイルの内容を読み、単純な文字列の等号で比較することです。 それらが同じである場合、出力ファイルを削除します。 それらが異なる場合、アサーションを発生させます。

この方法で、テストが終了したとき、失敗したテストはすべて出力ファイルで表され、サードパーティのツールを使ってゴールドファイルに対して差分を取ることができます ( 比較の先にあるもの はこのために素晴らしいツールです)。

もし本当にあなた自身のdiff出力を提供したいのであれば、Python stdlibにdifflibモジュールがあることを思い出してください。 Python 3.1 の新しい unittest サポートには assertMultiLineEqual メソッドがあり、それを使ってこのような diff を表示します。

    def assertMultiLineEqual(self, first, second, msg=None):
        """Assert that two multi-line strings are equal.

        If they aren't, show a nice diff.

        """
        self.assertTrue(isinstance(first, str),
                'First argument is not a string')
        self.assertTrue(isinstance(second, str),
                'Second argument is not a string')

        if first != second:
            message = ''.join(difflib.ndiff(first.splitlines(True),
                                                second.splitlines(True)))
            if msg:
                message += " : " + msg
            self.fail("Multi-line strings are unequal:\n" + message)