can't go to sleep

組み込み開発の多くをRubyで自動化することに興味があります

Unityのテスト自動化を半手動化する方法

Unityの自動テストの欠点

Unityはrakeを使用した自動テストランナー作成機能が非常に便利です。
例えば、testというフォルダを作成し、そのフォルダをテストフォルダとしてrakefile用のymlに登録しておくと、そのフォルダ内にあるテストファイルはすべて自動でテストできる。
しかし、テストケースがどんどん増えてくると、全てのテストケースを毎回テストしていたら時間がかかってしまいます。
全てのテストはJenkinsに任せたり、1日に1回だけ実行すれば十分でしょう。
そこで、Unityのテストを半手動化する方法を説明します。

半手動化とは

今回紹介する、半手動化は、テストターゲットをymlに登録しておく方法です。

  • まず、rakefileと同一フォルダにtestList.ymlを作成します。yml内のコメントアウトは# で行います。
#testList.yml
- TestFuncA.c
#- TestFuncB.c
- TestFuncC.c
  • 次にrakefile.rbを変更します。
desc "Test unity with its own unit tests"
task :unit => [:prepare_for_tests] do
#  run_tests get_unit_test_files
  run_tests get_unit_test_files_from_testList
end
  • 次に、上記に書いた「get_unit_test_files_from_testList」メソッドを、rakefile_helper.rbの中に追加します。
# ここはデフォルトであるコードです
  def get_unit_test_files
    path = $cfg['compiler']['unit_tests_path'] + 'test*' + C_EXTENSION
    path.gsub!(/\\/, '/')
    FileList.new(path)
  end

# 以下、追加したコードです
  def get_unit_test_files_from_testList
    arry2 = Array.new
    f = open('testList.yml',"r")
    arry1 = YAML.load(f)
    f.close
    
    arry1.each{|a|
      arry2 << 'test/' + a
    }
    return arry2    
  end
  • これでrakeを実行すれば、testList.ymlに登録したテストコードに対してのみ、テストを実施できます。
自動テストと共生する

上記方法だと、rakeコマンド時に半手動テストしかできません。不便です。ということで、「rake all」コマンド時にはtestフォルダ内にあるすべてのテストコードのテストを実施するようにします。

  • まず、rakefile.rbのうち、先ほど修正した箇所を修正しなおします。
# こっちはrake all用
desc "Test unity with its own unit tests"
task :unit => [:prepare_for_tests] do
  run_tests get_unit_test_files
end

# こっちはrake 用
desc "Test unity with its own unit tests"
task :selected_unit => [:prepare_for_tests] do
  run_tests get_unit_test_files_from_testList
end
  • 次に、rakefile.rbの下の方を修正します。
desc "Build and test Unity"
task :all => [:clean, :prepare_for_tests, :scripts, :unit, :summary]
task :selected => [:clean, :prepare_for_tests, :scripts, :selected_unit, :summary]
task :default => [:clobber, :selected]
#task :default => [:clobber, :all]

これで出来上がりです。「rake」とコマンドすれば、testList.ymlに登録してあるテストファイルのみテストし、「rake all」とコマンドすればtestフォルダにあるすべてのテストファイルをテストします。