1

vertex_set変数graph(エッジのセットと頂点のセットのタプル) を受け取り、頂点を返す関数があります。関数は呼び出されたモジュールundirected_graph内にあり、クラス内ではなく、通常の関数内にあります。

単体テストを書いていますが、テスト関数は次のようになります。

def test_vertex_test(self, graph)

mockライブラリが組み込まれているPython 3.3.0を使用しています。graphこのテストで変数をモックしてからgraph = MagicMock()、このグラフで実際の関数を呼び出しますか? それとも、グラフを作成してそれを渡し、それassertEqualsが本物を返したことを確認するために呼び出しますか?

ここでモックまたはスタブをどのように使用しますか? それとも、私の例では関係ありませんか?

4

1 に答える 1

1

すでにご存知のように、単体テストは、コードが期待どおりに設計どおりに動作することを確認するために作成されます。これを行うには、期待されるパラメーターを関数に渡し、目的の結果が得られるかどうかをテストします。逆に、予期しないパラメーターを渡す場合は、関数がそれらを処理できるかどうかをテストする必要があります。このため、テストを分離して実行します。各テスト メソッドは、アプリケーションの1 つの機能のみをテストする必要があります。

テストする必要がある関数が、アプリケーションの一部ではないライブラリを使用する場合があります。これにより分離が破られ、コードのロジックのテストが難しくなる可能性があります。たとえば、このメソッドは外部ライブラリを呼び出します (ファイル システムを通過し、ファイルを作成し、他のライブラリを読み取り、最後に成功したかどうかを返します)。この極端な例では、この外部ライブラリの出力を制御できません。これにより、ライブラリが何を返すかがわからないため、コードのテストが難しくなります。モッキングに入ります。このサードパーティ関数の呼び出しをモックして、期待どおりの True と False を返します。このようにして、コードが外部ライブラリの実行によるオーバーヘッドなしで両方の結果を処理できることをテストできます。

さて、あなたの質問の残りの部分について:)

vertex_setサードパーティのライブラリを使用していない場合は、以下が適用されます。

私はvertex_setそれをテストする方法を説明するためにどのように動作するかを作り上げています。

undirected_graph.py

def vertex_set(graph):
   """Set's the vertex based on the graph passed.

      Returns set of vertices.
      Raises ValueError if graph is not a tuple of sets.
    """

これvertex_setは 2 つの異なるもの (頂点のセットと ValueError の発生) を返す可能性があるため、適切な場合にこれらの結果を取得できることをテストで確認する必要があります。

test_undirected_graph.py

import unittest
import undirected_graph

class UndirectedGraphTestCase(unittest.testCase):
    def test_vertex_set(self):

        # Test we can set a vertex
        graph = ({1, 2}, {3, 4})
        result = undirected_graph.vertex_set(graph)
        self.assertEqual(result. {3, 4})

        # Test we can handle a negative vertex
        graph = ({1, 2}, {-3, -4})
        result = undirected_graph.vertex_set(graph)
        self.assertEqual(result, {-3, -4})

        # Test we can handle when we give an invalid graph
        graph = ()
        self.assertRaises(ValueError, undirected_graph.vertex_set, graph)

うまくいけば、モックが必要な場合とそうでない場合が明確になりました。さらに質問がある場合は、お知らせください:)

于 2013-03-01T06:30:33.197 に答える