理解行为驱动测试

BDD的核心内容

  1. Mocking 和 Stubbing
    1. Mocking:mock对象的调用次数和入参控制、调用顺序
    2. Stubbing:返回一个已知的、可控的值。
      1. 所以这个名字很有意思,对外部不确定的方法,打桩之后就确定了!
    3. 两者结合一起用
  2. Mock 对象 / Spy 对象
    1. Mock:mock 类的 public 方法或接口的方法。它是通过 cglib 动态生成一个 Proxy,因此在未指定某个方法行为的情况下,会默认返回空值
    2. Spy:
      1. Spies 可以让我们了解被测试代码内部发生了什么,换句话说,Spies 是收集执行信息的 Stubs,因此他们最终可以告诉你调用了什么、何时调用了哪些参数。
      2. 在没有配置 mock 行为的情况下默认是调用被 mock 对象的真实方法。

结论,为什么要用Mock:
Mocking 和 Stubbing 就是对其他领域的隔离,保证自己领域行为的确定性

参考:https://zhuanlan.zhihu.com/p/585595898

整体思路

Spock和Acts的区别,不在于从集成测试到单元测试,不在于是不是把环境拉起,而是研发思维的转变。我们的TDD需要建立在对DDD和Spock的BDD的理解基础上。

转变为TDD的思维方式:

  1. TDD更强调对代码的设计
    1. 先设计测试用例,本质上强调的是通过测试用例引导对业务代码的设计
      1. 测试Case就是业务代码的“用户”
      2. 改变系分的思路
    2. 强调领域设计,而不是流程设计(时序图)
  2. 在TDD基础上的DDD
    1. 分层测试
      1. 领域实体和领域事件的测试用例分开
      2. 领域实体的设计更加重视领域行为的沉淀,而不是为了服务业务流程——职责单一、意图明确
      3. 低耦合,避免精巧的平衡,异常case在各自领域内部收敛
    2. Spock的行为驱动测试(BDD)
      1. 领域事件通过领域实体的行为驱动领域实体的状态发生变化
      2. 所以领域事件的测试强调对领域实体的行为的测试
      3. Mocking 和 Stubbing 就是对其他领域的隔离,保证自己领域行为的确定性
    3. 有效测试
      1. 入参,出参,行为的调用次数