【问题标题】:Good way to isolate tests that depend on an initializer隔离依赖于初始化程序的测试的好方法
【发布时间】:2013-10-18 18:10:45
【问题描述】:

我真的试图开始隔离我的单元测试,这样我就可以查明发生错误的位置,而不是在出现问题时让我的整个屏幕因故障而变红。它在所有情况下都有效,除非初始化程序中的某些内容失败。

查看这些测试:

@setup_directory(test_path)
def test_filename(self):
  flexmock(lib.utility.time).should_receive('timestamp_with_random').and_return(1234)

  f = SomeFiles(self.test_path)
  assert f.path == os.path.join(self.test_path, '1234.db')

@setup_directory(test_path)
def test_filename_with_suffix(self):
  flexmock(lib.utility.time).should_receive('timestamp_with_random').and_return(1234)

  f = SomeFiles(self.test_path, suffix='.txt')
  assert f.path == os.path.join(self.test_path, '1234.txt')

我正在模拟依赖方法,以便我正在测试的东西是完全隔离的。您注意到的是,每个测试都需要实例化该类。 如果在初始化程序中引入错误,则每个测试都会失败。

这是调用类的初始化器的有问题的构造函数:

SomeFiles(*args)

有没有办法隔离或模拟初始化程序或对象构造函数?

【问题讨论】:

    标签: python unit-testing testing mocking


    【解决方案1】:

    我不确定您使用的是什么测试包,但一般来说,您通常可以在实际尝试使用之前模拟类上的 __init__() 调用。类似的东西

    def my_init_mock_fn(*args, **kwargs):
        print 'mock_init'
    
    SomeFiles.__init__ = my_init_mock_fn
    SomeFiles()
    

    这可能不是你想要的,因为SomeFiles.__init__ fn 将永远是模拟 fn,但是有像 voidspace mock 这样的实用程序提供了一个补丁函数,允许你修补类只是为了一个特定的范围。

    from mock import patch
    with patch.object(SomeFiles, '__init__', my_init_mock_fn):
        SomeFiles()
        ..other various tests...
    SomeFiles() #__init__ is reset to original __init__ fn
    

    我确信在您使用的任何模拟包中都可能有类似的功能。

    刚刚意识到您正在使用 flexmock,有一个页面为 replace_with here.

    【讨论】:

    • 模拟 __init__。现在想想,这似乎是一个直截了当的答案 :) 我使用 flexmock 来执行此操作 flexmock(SomeFiles).should_receive('__init__')
    【解决方案2】:

    是什么导致初始化函数失败?也许这是您应该研究的错误。

    您可以做的另一件事是简单地模拟其返回值,而不是模拟对象构造函数。即:给定这个输入,我期望这个输出——所以无论它是否正确返回,我都将使用这个预期的输出。

    您也可以在第一次失败时停止测试。 (failfast)

    您可能还想重新考虑如何设置测试。如果您必须为每个测试重新创建两个文件,不妨问问自己为什么。您的测试是否可以结构化为您设置两个文件,然后运行一系列测试,冲洗并重复。这将使只有分配给该路径的一系列测试失败,从而帮助您找出失败的原因。

    【讨论】:

    • 不,我不是在询问构造函数的特定错误。我在问如何在测试套件中隔离 __init__ 方法。这两个示例测试没有测试初始化​​程序,但如果初始化程序中存在错误,它们将失败。我希望能够编写一个基本上模拟初始化程序的测试,以便我可以为它隔离一个测试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-27
    • 1970-01-01
    • 2021-10-09
    • 1970-01-01
    • 2019-08-20
    • 2020-10-23
    相关资源
    最近更新 更多