我不确定静态和动态模拟是否是用来描述这种比较的术语,但我从静态和动态模拟的类型和手工制作的模型很容易获得了这个术语。总之,动态模拟是动态生成的代理,而静态模拟是预先实现的。对于给定此抽象Repository的Python示例,Value域对象和示例DatabaseRepository实现:
class Value:
...
class Repository(ABC):
@abstractmethod
def read_value(value_id: str) -> Value:
pass
class DatabaseRepository(Repository):
def __init__(self):
self.database_client = ...
def read_value(value_id: str) -> Value:
# Use `self.database_client` and `value_id` to fetch a parsable `Value`.
...静态模拟看起来像:
from abc import ABC, abstractmethod
class MockRepository(Repository):
def read_value(_: str) -> Value:
return Value(...) # Ignores `value_id` and returns predefined `Value` for mocking purpose.
static_mock = MockRepository()动态模拟如下所示:
from unittest.mock import Mock
dynamic_mock = Mock(spec=Repository)
dynamic_mock.read_value.return_value = Value(...)在我使用过的代码库中,我很少看到静态模拟。然而,静态模拟似乎带来了许多好处,其中一个主要的优点是在编译时安全地用静态类型语言(或者用Python )构建模拟对象(或者用mypy这样的类型检查器执行安全性)。
动态模拟的唯一好处似乎是简洁(这两个链接也提到了),虽然这是一个有效的好处,但是与静态模拟相比,动态模拟所能做的事情是否是我所缺少的呢?一种特定语言的设计(例如静态类型和动态类型)是否会使这个比较尺度倾斜?
发布于 2020-09-02 08:04:18
你这里有个存根。存根用于将值注入其他对象。这些值可用于在所测试的函数中执行不同的逻辑路径。返回true,返回false,抛出异常。
动态创建存根(被认为是可配置的存根)只会保持代码库的整洁,并减少了管理大量助手类的需要。硬编码存根是为一个测试定制的,所以您可以想象一下,在一个包含1000个测试的代码库中,它会是如何运行的。一旦测试套件变得更大,硬编码存根的管理就会出现问题。
模仿是不一样的。他们记得如何使用它们,并且可以作为测试的一部分进行验证;也就是说,SaveToDatabase()方法被调用了三次。
有一本很棒的书叫做xUnit测试模式,它包含了你需要知道的关于这个主题的所有东西。它真的很好,应该不难找到。
https://softwareengineering.stackexchange.com/questions/415428
复制相似问题