徐昊·TDD 项目实战 70 讲 21 ~ 34 笔记

TDD 学习笔记 | 极客时间 | 徐昊·TDD 项目实战 70 讲

21|DI Container(9):怎样重构测试代码?

  • 通过 TDD 获得的测试,可以驱动我们的开发,但不代表获得的是一个良好的 Test Case 组合

  • TDD 主要是为我们开发生产代码提供驱动力

  • 天然得出的结果并不能认为是很好的 Test Case

  • 所以需要对 Test Case 进行重构

    • 消除在构造 TDD 过程中留下的不一样的印记(架构选择、设计决策等)
    • 使 Test Case 能真实反应代码的意图
    • 按测试意图将零散的测试方法收集到一起(放入同一个 Nested 中或者单独的测试类中)
    • 同一个上下文中,测试粒度尽量保持一致
    • 清理没有用的测试
  • 按测试意图将零散的测试方法收集到一起(放入同一个 Nested 中)

  • 同一个上下文中,测试粒度最好是一样的

22|DI Container(10):怎样将大粒度的测试重构为等效的小粒度测试代码?

测试变文档

  • 从文档角度优化测试
  • 使用 @Nested 将功能分组
  • 测试天然不是文档,而是你实现过程的记录
  • 对测试进行足够提取和刻意的组织后才能变成真正的文档

23|DI Container(11):如何对ContainerTest进行文档化改造?

  • 经过梳理之后得到可执行的测试文档
  • 通过抽取方法起到注释的作用

24|DI Container(12):如何增补功能?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
static abstract class TypeLiteral<T> {
    public ParameterizedType getType() {
        return (ParameterizedType)((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
    }
}

ParameterizedType type = (ParameterizedType) new TypeLiteral<Provider<Component>>() {}.getType();

assertEquals(Provider.class, type.getRawType());
assertEquals(Component.class, type.getActualTypeArguments()[0]);

27|DI Container(15):如何封装类型判断逻辑?

概念缺失的两种封装方式

  • 行为封装
  • 数据封装

32|DI Container(20):如何对代码和测试进行重构?

建模上的缺陷

  • 模型冗余:相同的计算逻辑同时出现在构造方法、实现方法中
  • 模型不能真正反应需求上要解决的问题
  • 对概念上的封装存在缺失
  • 在工作中很难发现,缓慢的让代码进入到一个滑坡状态、越来越复杂

33|DI Container(21):如何处理Singleton生命周期部分的功能?

声明参数中的泛型继承哪个父类

1
2
public <ScopeType extends Annotation> void scope(Class<ScopeType> scope, Function<ComponentProvider<?>, ComponentProvider<?>> provider) {
}

34|DI Container(22):如何对Bind的逻辑进行重构?

测试覆盖率

追求功能点 100% 覆盖率,而不是每行代码的覆盖率

comments powered by Disqus