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フォルダにあるすべてのテストファイルをテストします。