为什么我的Minitest测试不能并行运行?

Hub*_*bro 3 ruby parallel-processing minitest

我刚刚发现我的Minitest测试用例可以并行运行.我所要做的就是

require "minitest/hell"
Run Code Online (Sandbox Code Playgroud)

所以我做到了.不幸的是,我的测试运行与以前一样.一切都过去了,它需要的时间与通常一样多.我htop在运行我的测试套件时检查过,只使用了一个核心.

我在随机测试中设置断点以检查测试是否实际设置为并行运行:

(byebug) Minitest::Test.test_order
:parallel

发生什么了?


我的第一个假设是Minitest在决定产生多少进程时会计算CPU内核的数量.我有多个物理处理器(在虚拟机中),但每个处理器只有1个核心.我已经将我的VPS改为拥有两个物理处理器,每个处理器有4个核心,而我的测试仍然没有并行运行.

$ lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                8
On-line CPU(s) list:   0-7
Thread(s) per core:    1
Core(s) per socket:    4
Socket(s):             2
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 62
Stepping:              4
CPU MHz:               2600.000
BogoMIPS:              5200.00
Hypervisor vendor:     VMware
Virtualization type:   full
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              20480K
NUMA node0 CPU(s):     0-7

sev*_*rin 5

Minitest使用线程而不是进程来进行并行测试.

由于MRI(标准Ruby解释器)具有全局解释器锁,因此一次只能执行一个线程.因此,使用MRI时,您的测试不会并行运行.

通过使用支持JRuby或Rubinius等并发线程的Ruby解释器,您可以让测试并行运行.

阅读本文了解更多详情.