gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 11:10:07 25 4
gpt4 key购买 nike

我对 Python 世界非常陌生,正在学习其中的方法。我有 Java 和 C# 背景,并且 Java/C# 单元测试方法非常清晰。我们有一个正在测试的类,并且我们注入(inject)所有模拟的依赖项以期望测试代码。

喜欢:

具有服务燃料水平的汽车类别测试用例:汽车显示低燃油指示,我们可以编写一个测试。

    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 文件。

另一点是我们在这里只测试被测类(不是依赖服务类),被测类将对依赖服务的返回值使用react。我们可以同时进行阴性和阳性测试来覆盖被测类别。

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

最佳答案

如果创建真实对象不方便/麻烦,则只需使用模拟(请参阅 here )。

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

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

关于java - Python 模拟和单元测试最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46114540/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com