Posts List
  1. rake parallel:spec
  2. Awesome

研读parallel_tests源码

parallel_tests-2.4.1

rake parallel:spec

  • lib/tasks.rb, 建了rake任务,rake任务:执行bin/parallel_rspec

  • 分组:
    找到所有的测试文件。
    Dir[File.join(folder, pattern)].uniq

    通过File.stat,获取文件大小,然后进行排序

    1
    2
    3
    def largest_first(files)
    files.sort_by{ |_item, size| size }
    end

    每次把测试文件加入到最小的分组里面去

    1
    2
    3
    4
    5
    6
    7
    def group_features_by_size(items, groups_to_fill)
    items.each do |item, size|
    size ||= 1
    smallest = smallest_group(groups_to_fill)
    add_to_group(smallest, item, size)
    end
    end
  • 分组并行执行测试
    使用 parallel 这个gem来帮助完成
    Parallel.map(items, :in_threads => num_processes)
    但这里传的参数是in_threads,以多线程的方式运行,ruby里的多线程是不能达到并行的目的,让人有点费解。
    仔细思考下,这里是用system()来执行rspec命令

    system() – Executes command… in a subshell.

    system 创建一个单独的进程来执行,从而达到并行测试的目的。

Awesome

  • 利用 block 计算方法执行时间

    1
    2
    3
    4
    5
    def delta
    before = now.to_f
    yield
    now.to_f - before
    end
  • Enumerable#partition
    (1..6).partition { |v| v.even? } #=> [[2, 4, 6], [1, 3, 5]]

  • Enumerable#min_by

  • OptionParser 命令行参数解析