Unittest Python:如何通过添加注释和装饰器来修改源代码

时间:2016-12-01 13:27:41

标签: python unit-testing python-unittest

在测试阶段,我想修改部分源代码。例如,我不需要绘图,因此负责绘图的代码可以被注释。单元测试模块中是否有适当的工具?

另一个问题是关于装饰者@patch。有没有办法在测试期间将它们放入运行时的源代码中?

2 个答案:

答案 0 :(得分:3)

尝试使用mock,

听起来它嘲笑你的代码,可以通过测试来操纵。

您可以模拟返回val或对象实例等的方法等。

https://www.toptal.com/python/an-introduction-to-mocking-in-python

答案 1 :(得分:2)

正如小伙子已经说过的那样,嘲笑是在你的帮助下。

有几种方法可以模拟一个函数,但一般来说,你会修饰你的测试函数 - 而不是模拟函数!

在您的情况下,代码可能如下所示:

# your_file.py
from ... import ... as plt #depends on the class you use

class MyPlotter(object):

    def draw_calling_method(self):
        ....
        plt.draw()
        ...
        return something


# test.py
import mock
from unittest import TestCase

from your_file import MyPlotter
from ... import ... as plt # same import as in the your_file.py


class TestMyPlotter(TestCase):

    @mock.patch.object(plt, 'draw')
    def test_draw_calling_method_returns_something(self, draw):
        plotter = MyPlotter()
        plotter_return = plotter.draw_calling_method()
        self.assertEqual(plotter_return, something)

这将用MagicMocks替换对plt.draw()的所有调用,并阻碍绘制执行。如果所有测试方法都需要模拟draw-call,那么mock decorator也可以应用于类。您只需要确保所有测试方法都接受模拟作为第二个参数(如test_draw_calling_mehtod_returns_something所做的那样)。此外,您可以通过在test-method中设置draw.return_value = ...来模拟draw()函数可能具有的任何返回值。 注意:这必须在调用mock的函数调用之前发生,否则将不会应用返回值。

有关模拟的更多信息,请参阅文档python-docs。它们非常全面。

最后一件事;正如Jonathon Reinhart已经提到的,如果您觉得编写测试很困难,那么之前重构代码可能会更好。这不仅会使它更易测试,而且更具可读性!