这是我参与8月更文挑战的第19天,活动详情查看:8月更文挑战
内卷化的时代,单测的框架也开始卷了。这年代,单测也可以并行,并行有什么好处呢?可以节省执行时间。以我的经验,有些项目的单测要执行2分多钟,确实有点耽误时间。按照每天10次左右的执行频率,一天就是20多分钟,不短了。如果现在你告诉我,可以变成2分钟,那肯定很有吸引力。但引入并行的同时,也会引入复杂度,如果处理不好可能会需要更多的时间来写,也得不偿失,那么下面来看一下spock是怎么处理的。
首先spock的并行分为同一线程模式和并发模式,分别是什么意思呢?这个两个模式适用的对象为spock的单测类(Specifications)和单测类里面的方法(Features)。用下面几张图来说明,其中A,B代表单测类:
- 顺序执行
- 完全并行
- 类并行,方法串行
- 类串行,方法并行
以上几种运行方式都可以通过注解@Execution
来灵活控制。但并行带来的问题还是不可避免的,groovy也是jvm上的面向对象的语言,也会有共享状态的并发问题。所以spock又提供了一个锁的功能,通过注解@ResourceLock
实现。该注解有2个参数,分别为value和mode,value表示要锁的对象,mode则表示锁的等级。
ResourceAccessMode.READ_WRITE
会强制独占该资源的读写权限,为mode的默认值ResourceAccessMode.READ
顾名思义,是只读模式
下图为一个典型的单测锁执行示意图:
如果一个类所有的方法都需要加只读锁,那么可以在类上使用@Isolated
,表示该类所有方法全部只读。