1

我有一个函数vertex_set,它接受一个变量graph(它是一组边和一组顶点的元组)并返回顶点。该函数在一个被调用的模块undirected_graph中,而不是在一个类中,而是一个常规函数。

我正在编写一个单元测试,我的测试函数如下所示:

def test_vertex_test(self, graph)

我正在使用 Python 3.3.0,其中包含mock内置库。我会在这个测试中模拟graph变量:graph = MagicMock()然后用这个图调用真正的函数吗?还是我只是构建一些图表然后传递它,然后调用assertEquals以检查它是否返回了真实的东西?

我将如何在这里使用模拟或存根?还是在我的示例中无关紧要?

4

1 回答 1

1

正如您似乎已经知道的那样,编写单元测试是为了确保您的代码按预期和设计运行。为此,我们将预期的参数传递给我们的函数并测试我们是否获得了预期的结果。相反,如果我们传递了意想不到的参数,我们想测试我们的函数是否可以处理它们。因此,我们单独运行测试;每个测试方法应该只测试我们应用程序的一个特性。

有时我们需要测试的函数使用不属于我们应用程序的库。这打破了隔离,使测试代码的逻辑变得困难。例如,我们的方法调用了一个外部库(它通过文件系统,创建文件,读取其他文件,最后返回是否成功)。在这个极端的例子中,我们无法控制这个外部库的输出。这使得我们很难测试我们的代码,因为我们不知道库将返回什么。进入模拟。我们会模拟对这个第三方函数的调用以返回我们期望的结果,True 和 False。这样,我们可以测试我们的代码是否可以处理这两个结果,而无需运行外部库的开销。

现在,对于你剩下的问题:)

如果您vertex_set没有使用第三方库,则以下内容将适用。

我正在编造vertex_set工作原理以解释如何测试它。

无向图.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)

希望我能明确何时需要 Mocks,何时不需要。如果您有更多问题,请告诉我:)

于 2013-03-01T06:30:33.197 回答