Python模拟和单元测试最佳实践

时间:2017-09-08 10:36:28

标签: java python python-2.7 unit-testing mocking

我对Python世界很陌生并且在其中学习。我有Java和C#后台和Java / C#单元测试方法非常清楚。我们有一个正在测试的类,我们将所有模拟的依赖项与测试代码的期望一起注入。

像:

带有服务fuelLevel的汽车类 测试案例:汽车显示低燃料指示,我们可以写一个测试。

    FuelLevelService fsMock = mock(FuelLevelService .class);
    when(fsMock.getLevel()).thenReturn(LOW);
    Car car = Car(fsMock)
    car.start()
    assertTrue(car.warningIndicator());
    assertTrue(car.warning().contains("Fuel level low Warning"));

在python中,我已阅读过,我们可以使用猴子修补来设置依赖对象,我们可以测试。

    @mock.patch('models.fuel_service.getLevel')
    def test_main(self, fuel_service):
        fuel_service.return_value = 'LOW'
        Car car = Car(fuel_service)
        car.start()
        self.assertEqual(car.warningIndicator(), True)

我打算用这种方法。但我的同事们拒绝了这个想法,并提议实例化实际对象(FuellevelService)并设置其值。我发现它非常繁琐而且不需要,因为我们也可以按照我们的期望来做同样的事情。

我目前正在努力了解我是错了还是在python中我的同事方法被视为更好的模式。

*上面我给出了一个简单的例子。在我们的项目中创建一个实例对象并设置它的值是10-25行代码[不要问我为什么,但它是这样的:)]创建这个对象并设置一个值,使它返回相同的价值对我来说是额外的维护。对于这种创建依赖对象的方法,我们将在模块中有许多py文件。

另一点是我们这里只测试被测试的类(不是依赖服务类),测试中的类会对依赖服务的返回值做出反应。我们可以同时进行负面和正面测试,以涵盖被测试的课程。

对于依赖服务类,它应该有自己的测试来验证它的所有场景可分离性。所以它将在那里进行测试。通过这样做,我们将有明确的分离,并且在存在错误的情况下测试将失败。

1 个答案:

答案 0 :(得分:0)

如果创建真实对象不方便/笨重,您只需要使用模拟(参见here)。

如果你在问题中提到,你可以便宜地创建真实实例,并轻松设置其价值,那么就没有真正需要模拟的东西。

此外,您不能保证模拟的行为与真实实现类似,因此您的测试可能会测试某些内容,但不一定是您的代码在生产中的真实行为。最好使用生产类。