Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
UnitTestPython:如何通过添加注释和装饰符来修改源代码_Python_Unit Testing_Python Unittest - Fatal编程技术网

UnitTestPython:如何通过添加注释和装饰符来修改源代码

UnitTestPython:如何通过添加注释和装饰符来修改源代码,python,unit-testing,python-unittest,Python,Unit Testing,Python Unittest,在测试阶段,我想修改源代码的一部分。例如,我不需要绘图,因此负责绘图的代码可以被注释。unittest模块中是否有合适的工具来执行此操作 另一个问题是关于decorator@patch。有没有一种方法可以在测试期间在运行时将它们放入源代码中?尝试使用mock 听起来它模仿了你的代码,并且可以通过测试进行操作 您可以模拟返回val的方法或对象实例等 尝试使用mock 听起来它模仿了你的代码,并且可以通过测试进行操作 您可以模拟返回val的方法或对象实例等 正如奥哈德小伙子已经说过的那样,mocks

在测试阶段,我想修改源代码的一部分。例如,我不需要绘图,因此负责绘图的代码可以被注释。unittest模块中是否有合适的工具来执行此操作

另一个问题是关于decorator@patch。有没有一种方法可以在测试期间在运行时将它们放入源代码中?

尝试使用mock

听起来它模仿了你的代码,并且可以通过测试进行操作

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

尝试使用mock

听起来它模仿了你的代码,并且可以通过测试进行操作

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


正如奥哈德小伙子已经说过的那样,mocks会帮助你的

有几种方法可以模拟函数,但一般来说,您将装饰您的测试函数,而不是模拟的函数

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

# 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调用,那么也可以将模拟装饰器应用于类。您只需确保所有的测试方法都接受mock作为第二个参数(正如
test\u draw\u calling\u method\u返回的东西一样)。此外,通过在测试方法中设置
draw.return\u value=…
,可以模拟draw()函数可能具有的任何返回值注意:这必须发生在调用模拟的函数调用之前,否则返回值将不会应用

有关模拟的更多信息,请参阅文档。它们相当全面


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

正如奥哈德这个小伙子已经说过的,mocks在你的帮助下

有几种方法可以模拟函数,但一般来说,您将装饰您的测试函数,而不是模拟的函数

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

# 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调用,那么也可以将模拟装饰器应用于类。您只需确保所有的测试方法都接受mock作为第二个参数(正如
test\u draw\u calling\u method\u返回的东西一样)。此外,通过在测试方法中设置
draw.return\u value=…
,可以模拟draw()函数可能具有的任何返回值注意:这必须发生在调用模拟的函数调用之前,否则返回值将不会应用

有关模拟的更多信息,请参阅文档。它们相当全面


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

呃,不,这不是单元测试的工作方式。补丁属于测试代码,而不是测试中的代码。听起来你需要重构代码并将其分解成更小的部分。所以我所有的绘图都必须是一个单独的函数?所以我必须复制/复制我的源代码以添加@patch?呃,不,这不是单元测试的工作方式。而补丁属于测试代码,而不是测试代码。听起来你需要重构代码并将其分解成更小的部分。所以我的所有绘图都必须是一个单独的函数?所以我必须复制/复制我的源代码才能添加@patch?如何模拟plt.draw()使其消失?如何模拟plt.draw()让它消失?很高兴我能帮忙:-)我花了相当多的时间来弄清楚嘲弄自己,所以我很高兴与大家分享。很高兴我能帮忙:-)我花了相当多的时间弄清楚嘲弄自己,所以我很高兴与大家分享。