JUnit の単体テストを自動で生成する Randoop を使ったときの諸々をメモとして残します。
自分用メモで粒度粗めです。申し訳ない。
準備
マニュアルを見ながら作業。
https://randoop.github.io/randoop/manual/index.html
Installing Randoop の章に zip ファイルのリンクがあるので、zip をダウンロードして解凍する。
昔は eclipse のプラグインがあったみたいですが今はないみたいです。
使い方
あらかじめ Java のパスは通しておく。
JDK じゃないと動かないらしいので注意。
コマンドプロンプトから以下のコマンドを実行して自動生成を行う。
java --classpath {テスト対象のクラスファイルの保存先パス};{テスト対象クラスの依存するjarファイルの保存先パス};{randoop.jarの保存先パス} randoop.main.Main gentests --classlist={クラスリスト保存先パス} --time-limit=100 --junit-output-dir={生成したテストクラスの出力先パス}
- {テスト対象クラスのクラスファイルの保存先パス} はコンパイル後のクラスファイルのパスなので注意。パッケージの FQDN の一つ上の階層までのパスを書く。
- –classpath を区切る記号「;」は OS で変わる。Windows は「;」。
- {テスト対象クラスの依存するjarファイルの保存先パス}は事前にはわかりにくいので、とりあえずこれなしで実行してエラー文に出てくる依存先のパスを足していくのがいいかも。
Spring 使っているとここがとても多くなる。「;」区切りで全部書いていく。
足りない依存先の出力にはいくつかパターンがあり、「コマンド実行時に明示的に足りないと表示されるパターン」、「コマンド実行時に例外が発生しそのスタックトレースに記載されているパターン」、「自動生成中にランタイムエラーとして出てくるパターン」、「自動生成が終わったあとに警告として出てくるパターン」があるので、コマンドプロンプトに出てくる表示はよく読む。 - {Randoop.jarの保存先パス}は解凍した zip に入っている「randoop-all-x.x.x.jar」の保存先パス。
- {クラスリスト保存先パス} は公式参照。
- –time-limit は公式曰く、1 クラス 100 秒らしい。
多分これで動くはず
注意点
- Randoop は基本的にここに記載された値でテストを行うが、File パスを受け取るメソッドについては実在のパスが使用されます。しかもユーザフォルダ直下、、、
自分は運悪くファイル作成だけでなくファイルの移動や削除のメソッドも実行してしまい、環境を随分壊してしまいました。油断していましたし泣きました。
File を扱うクラスには Randoop は使わないほうがいいです。 - Spring を使っている場合、フィールドインジェクションによる DI を行っているクラスのテストは自動生成できませんでした。コンストラクタインジェクションにしましょう。
自分が試したときは、コンストラクタインジェクションでも @Autowired がついているとうまく生成できませんでした。また、Lombok によるコンストラクタ自動生成でもだめでした(Lombokは環境による?できている人もいるので不明)。
おわりに
まだ触りたてなので今後追記するかもしれません。
web 上に情報が少ないのでちょっとつらさがありますね。時間あったらコード読んでみようと思います。