设置RSpec测试的顺序

时间:2015-09-23 00:40:43

标签: ruby rspec

我正在构建一个测试套件来教授OOP。我希望spec/lib文件夹中的文件按特定顺序执行。

我想定义一个类名数组,它们的测试套件将按顺序执行。

spec_order = %w(
  FirstClass
  SecondClass
  ThirdClass
)

我怎么能做到这一点?

解决方案

Shell脚本(由moeabdol建议)

lib/

中的代码 <{1}}

中的

规格 spec/lib文件夹

中的

spec_helper.rb

项目根目录中的shell脚本

spec

规范文件的命名

以数字方式命名#!/bin/zsh Files=( 'first' 'second' 'third' ); for file in "${Files[@]}"; do rspec spec/lib/"$file"_spec.rb || exit 1 done 个文件:

_spec.rb

创建01_first_spec.rb 02_second_spec.rb ... 文件

.rspec

现在,当运行# .rspec --order defined 时,文件应按排序顺序执行。

3 个答案:

答案 0 :(得分:4)

以数字方式命名if (!is_object($user)) { $this->createNotFoundException('The user does not exist'); } 个文件:

_spec.rb

创建01_first_spec.rb 02_second_spec.rb ... 文件

.rspec

现在,当运行# .rspec --order defined 时,文件应按排序顺序执行。

答案 1 :(得分:1)

几乎所有测试框架都不建议订购测试。这是确保测试是独立的,并且在订单更改时不会产生意外行为的一部分。

但是,如果要按特定顺序运行测试文件,则可以通过编写脚本来实现:

1。 Shell脚本

考虑以下脚本(ordered_test_script.sh):

for f in file1_spec.rb file2_spec.rb file3_spec.rb
do
  rspec $f
done

确保脚本可执行:

chmod +x ordered_test_script.sh

然后你可以运行脚本:

./ordered_test_script.sh

2。 Ruby脚本

首先,您可能希望扩展String类以包含下划线方法:

class String
  def underscore
    self.gsub(/::/, '/').
    gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
    gsub(/([a-z\d])([A-Z])/,'\1_\2').
    tr("-", "_").
    downcase
  end
end

这会将camelcase类名称变为下划线名称。例如(MyClass =&gt; my_class)

classes = %w(MyClass1 MyClass2 MyClass3)

classes.each do |c|
  system("rspec #{c.to_s.underscore}_spec.rb")
end

希望这有帮助。

答案 2 :(得分:0)

当然,默认情况下进行随机化是一种很好的做法,但在某些情况下,例如在尝试跟踪规范中与订单相关的问题或生成文档时,指定临时订单可能会很好。 / p>

您可以为部分(或全部)规范文件指定“全局”排序,如下所示:

config.register_ordering(:global) do |items|
  files = <<END.split("\n")
./spec/some_spec.rb
./spec/another_spec.rb
END
  # Original RSpec random order
  randomized = RSpec::Core::Ordering::Random.new(config).order(items)

  # Now do a stable sort by filename index
  randomized.sort_by.with_index do |example_group, index|
    files.index(example_group.file_path) || files.size + index
  end
end

register_ordering的文档可用on Relish