理解行为驱动测试
BDD的核心内容
- Mocking 和 Stubbing
- Mocking:mock对象的调用次数和入参控制、调用顺序
- Stubbing:返回一个已知的、可控的值。
- 所以这个名字很有意思,对外部不确定的方法,打桩之后就确定了!
- 两者结合一起用
- Mock 对象 / Spy 对象
- Mock:mock 类的 public 方法或接口的方法。它是通过 cglib 动态生成一个 Proxy,因此在未指定某个方法行为的情况下,会默认返回空值
- Spy:
- Spies 可以让我们了解被测试代码内部发生了什么,换句话说,Spies 是收集执行信息的 Stubs,因此他们最终可以告诉你调用了什么、何时调用了哪些参数。
- 在没有配置 mock 行为的情况下默认是调用被 mock 对象的真实方法。
结论,为什么要用Mock:
Mocking 和 Stubbing 就是对其他领域的隔离,保证自己领域行为的确定性
参考:https://zhuanlan.zhihu.com/p/585595898
整体思路
Spock和Acts的区别,不在于从集成测试到单元测试,不在于是不是把环境拉起,而是研发思维的转变。我们的TDD需要建立在对DDD和Spock的BDD的理解基础上。
转变为TDD的思维方式:
- TDD更强调对代码的设计
- 先设计测试用例,本质上强调的是通过测试用例引导对业务代码的设计
- 测试Case就是业务代码的“用户”
- 改变系分的思路
- 强调领域设计,而不是流程设计(时序图)
- 先设计测试用例,本质上强调的是通过测试用例引导对业务代码的设计
- 在TDD基础上的DDD
- 分层测试
- 领域实体和领域事件的测试用例分开
- 领域实体的设计更加重视领域行为的沉淀,而不是为了服务业务流程——职责单一、意图明确
- 低耦合,避免精巧的平衡,异常case在各自领域内部收敛
- Spock的行为驱动测试(BDD)
- 领域事件通过领域实体的行为驱动领域实体的状态发生变化
- 所以领域事件的测试强调对领域实体的行为的测试
- Mocking 和 Stubbing 就是对其他领域的隔离,保证自己领域行为的确定性
- 有效测试
- 入参,出参,行为的调用次数
- 分层测试