🌟

Rubyテスティングフレームワークminitest、test-unit、rspecにおける、法則性を持たない(ランダムな)テスト順序実現方法

2024/08/03に公開

テスト同士は独立して相互に影響を与えない(Independent である)ことが望ましいが、作成者が意図せず依存関係を持ちこんでしまう場合がある。

テストの順序を入れ替えると独立していないテストが発見しやすくなるため、テスティングライブラリにはテストの順序を入れ替える仕組みを備えたものが多い。また、順序を都度ユーザー側で指定するのは面倒なので、法則性を持たない(ランダムな)順序でテストを実行する機能を備えている場合もある。

加えて、法則性を持たない順序で実行したテスト失敗をきっかけに依存関係を発見した場合、その後に同じ順序でのテスト実行ができると修正が意図通りに行えたか確認が容易になる。一部のライブラリは、ランダムさを得るための初期値(Seed)を実行時に設定することで、法則性を持たないが、同じ順序でのテスト再実施が可能になる仕組みを備えている。

Ruby で利用されることの多い[1]テスティングライブラリ minitesttest-unitrspec-core の最新版で、法則性を持たない順序でのテスト実行、及び同じ順序を再現できる仕組みを備えているか、備えている場合どのように実現しているかを調べた。

調査

まとめ

名前 法則性を持たない順序へとテストを並べ替える部分 ランダムさを得るための初期値(Seed)の渡し方 渡した Seed の取得方法
minitest Minitest::Test.runnable_methods -s--seed というオプションを渡す、あるいは環境変数 SEED を設定する Minitest.seed
test-unit Test::Unit::TestSuiteCreator#sort_test_names_in_random_order - -
rspec RSpec::Core::Ordering::Random#order --order random:123--seed 123 RSpec.configure.seed

minitest

2024-08-03 現在 v5.24.1 が最新版。

テスト順番のランダム化は Minitest::Test.runnable_methods で実施している。

ランダムさを得るための初期値は、-s--seed というオプションを渡す、あるいは環境変数 SEED の設定を通して、外部コマンドから渡せる。オプションからの取得は Minitest.process_args で、環境変数からの取得は Minitest.process_args で行っている。

設定した Seed 値は Minitest.seed 経由で取得できる。

test-unit

2024-08-03 現在 v3.6.2 が最新版。

ランダムさを得るための初期値を渡すインターフェースは存在しない。

テスト順番のランダム化は Test::Unit::TestSuiteCreator#sort_test_names_in_random_order で実施している。

rspec

2024-08-03 現在 v3.13.0 が最新版。

ランダムさを得るための初期値は、--order random:123--seed 123 として外部コマンドから渡せる。
オプションからの取得は RSpec::Core::Parser#parser で行っている。

Seed 値は RSpec::Core::Runner#initialize で設定された configure オブジェクト経由で
RSpec::Core::Configuration#seed から取得、つまり RSpec.configure.seed で得られる。

テスト順番のランダム化は RSpec::Core::Ordering::Random#order で実施している。

脚注
  1. bundler gem コマンドでテンプレート作成時に指定できる ↩︎

GitHubで編集を提案

Discussion