我最近才发现我的 Minitest 测试用例可以并行运行。我所要做的就是
require "minitest/hell"
所以我做到了。不幸的是,我的测试运行与以前完全一样。一切都过去了,它所花费的时间与往常一样多。我在运行我的测试套件时检查了 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
最佳答案
Minitest 使用线程而不是进程来执行并行测试。
由于 MRI(标准的 Ruby 解释器)有一个全局解释器锁,一次只能执行一个线程。因此,您的测试在使用 MRI 时不会并行运行。
您可以使用支持并发线程的 Ruby 解释器(如 JRuby 或 Rubinius)让测试并行运行。
关于ruby - 为什么我的 Minitest 测试没有并行运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26297653/