🤯

Junie でいい感じにユニットテストを書いてもらうために試した事

に公開

Junie とは

Junie は JetBrains が開発した AI Coding Agent です。LLM を活用して、コードの生成や補完、リファクタリングなどを行ってくれます。

https://www.jetbrains.com/junie/

早い話が、VSCode が諸事情により使えない (Java, Kotlin や Android の開発など) JetBrains IDE ユーザーのための Cursor みたいなものです。

JetBrains IDE ユーザーであれば、ある程度無料で利用することもできます。(非常に少ない Quota なので、すぐに使い切ってしまいますが)

また、JetBrains IDE には Junie 以外にも、主にコード補完や AI チャット、簡単なコード生成ができる JetBrains AI Assistant が搭載されています。

本格的なコーディングエージェントは Junie で、コード補完は AI Assistant のような使い分けがされています。(わかりにくいですね)

https://www.jetbrains.com/ai/

この記事では、コーディングエージェントである Junie を取り扱っていきます。

Junie のテストコード生成のコツ

私は、普段 JetBrains IDE の上で Kotlin を書いてバックエンドの開発を行っています。最近は JetBrains AI のプランを購入して、Junie を使ってユニットテストや実際業務に利用するコードを生成してもらうことに挑戦しています。

Junie は、まああまあいい感じでコード生成や、ユニットテストを生成してくれますが、実際に利用してみた所、現状ではいくつか困りごとがありました。

ここでは、Junie を使ってユニットテストを生成してみた結果、困ったことや、Junie の使い方のコツなどをまとめておきます。

将来的には、Junie が改善されて、これらの困りごとが解決されることを期待していますが、現状では以下のようなことに注意して使うと、Junie をより効果的に活用できるかもしれません。

.junie/guidelines.md の準備と指示

Junie でコードを生成する際には、.junie/guidelines.md ファイルをプロジェクトに配置しておくと、ここに書かれた内容を参考にコードを生成してくれます。

https://www.jetbrains.com/help/junie/customize-guidelines.html

Junie のオンボーディングで、まず最初に Junie を使って .junie/guidelines.md を作成するように進められるので、とりあえずは作成している場合も多いでしょう。

このガイドラインには、以下のような内容を追記して記述すると良いです。できるだけ簡潔に要点をまとめて書くと良いでしょう。

  • プロジェクトのビルド方法
  • テストの実行方法
    • テストケースごとの実行方法
    • テストの実行結果を確認する方法
  • テストの記述方法
    • どんなアサーションライブラリを使うか
    • どんなスタイルでコードを書いて欲しいか (Kotest の Spec など)
    • ユニットテストの簡単なテンプレート
  • その他、プロジェクトで守って欲しいルールやガイドライン

ただし、このガイドラインは、あくまで参考程度にしか参照してくれない感じもしています。よく無視してきます。感覚的に、たくさん書けば書くほど無視してくる気がしています。

どちらかというと、ガイドラインより、既存のコードを参考にしてコードを生成する傾向が強いように感じます。かなり周りの空気を読んでコードを生成してきます。特に同じようなロジックのコードを積極的に参考にして、コードを生成しようとしてきます。つまり、既存のコードがクソだと、生成されるコードもクソになります。

もし、必ず守って欲しいルールがある場合には、プロンプトにガイドラインに従うように指示を出すと良いでしょう。

テストの実行に失敗する

私が普段使っているプロジェクトでは、Gradle を使って Kotlin のバックエンド開発を行っています。

普段は、Gradle を使ってユニットテストも実行しているのですが、Junie が生成したコードを実行しようとすると失敗してしまうことがあります。

The test runner failed to find any tests in the specified class, indicating an issue with the test configuration. Further investigation is needed to resolve the problem and ensure the tests can be executed successfully.

IDE 上では、Gradle を使っても使わなくてもテストの実行に成功するので、なぜ Junie が生成したコードが実行できないのか、原因がわかりません。Kotest を使ってるのが良くないのかもしれません。

しかし、ガイドラインに明示的に Gradle を使ってテストを実行するように指示しておくと、Junie が生成したコードを Gradle で実行しようとするので、テストの実行に失敗することは少なくなります。

例えば以下のようなガイドラインを追加します。

## Testing

### Running Tests

You should run tests using the Gradle wrapper.

The following commands are available:

- Run all tests:
  `./gradlew --console=plain test`

- Run tests for a specific module:
  `./gradlew --console=plain :test-module:test`

- Run a specific test class:
  `./gradlew --console=plain :test-module:test --tests "com.example.test.SimpleExampleTest"`

うまくいけば、Gradle コマンドを使ってテスト実行を行ってくれます。

しかし、ガイドラインにテストの実行方法を書いたとしても、これを無視してくることが多々あり、テストの実行をして正しく成功することを確認せず、そのままタスクが Done になってしまうこともあります。

その場合には、プロンプトに続けて「テストの実行がうまくできなかったみたいなので、ガイドラインに従ってテストを実行してください。」と指示を出すと良いでしょう。

初めから、テストの実行方法はガイドラインに従うように指示しておくと、Junie がテストの実行をしないままタスクを完了してしまうことは少なくなります。

テストの実行結果を確認させる

Junie は他の AI コーディングエージェントと同様に、生成したテストを実際に実行して、テストの結果に応じて失敗したテストを修正します。これを繰り返すことで、生成したテストが正しく動作するように調整していきます。

場合によっては、デバッグプリントなどを勝手に追加して、挙動を自動的に確かめながらテストを修正していくこともあります。この辺りはよくできています。まるで人間のようですね。

ただし、上記のように Gradle を使ってテストを実行した場合、Junie はそのままではコンソールに出力されたテスト実行結果のみを確認するようです。

しかし、Gradle 上のテスト実行結果は、省略された形でコンソール出力されることが多く、テストの実行結果の詳細を確認するには情報が足りていません。

そのため、Junie に「テストの実行結果を確認して、失敗したテストを修正してください。」と指示しても、Junie は十分な情報を得られず、テストの修正ができなかったり、かなり困っているような挙動をすることがあります。

その場合には、ガイドラインにテストの実行結果を確認する方法を書いておくと良いでしょう。具体的には、JUnit や Kotest のテスト実行結果として出力される XML ファイルを確認するように指示します。

### Test Results

Test results will be displayed in the console, and detailed reports can be found in `build/test-results/test/*.xml`.

Gradle の build.gradle.kts には、以下のように設定して XML ファイルを出力するようにしておきます。

tasks.withType<Test> {
    reports {
        junitXml.required.set(true)
    }
}

こうしておくことで、Junie は XML ファイルを確認して、テストの実行結果を確認するようになります。ただし確実ではないので、うまくいってなさそうであれば、プロンプトでサポートしてあげると良いでしょう。

一気に色々教え込まない

ここまでくると、Junie はかなり良い感じでユニットテストを生成してくれるようになります。

あまり複雑でないコードであれば、多少試行錯誤に時間がかかりますが、概ね満足できるようなテストが生成されるようになるはずです。

ただし、複雑なテストケースや、いつもと違うようなテストケースを生成しようとすると、Junie はかなり困ってしまう事もあります。

例えば、特定のエッジケースを考慮したテストケースを生成してもらいたい場合、最初のプロンプトで一気に色々教えても、あまりうまくいかないことが多いです。

そのため、自分ではまずは Junie が思うようにテストを生成させてみて、生成されたテストを確認してから、必要な情報を少しずつ追加していくと良いでしょう。

その他に試したこと

Gradle の deprecation warning が出ている場合、Junie はなぜかそれを気にしている仕草を見せていたので、--warning-mode=none オプションをつけて、deprecation warning を出力しないようにしておきました。

XML を見に行かなくてもテストの失敗と標準出力の内容を確認できるように、showStandardStreams = true を設定しておくと、Junie が標準出力を確認しやすくなります。

tasks.withType<Test> {
    testLogging {
        showStandardStreams = true
    }
}

新規プロジェクトを作成することがあったのですが、その際には最初から全て Junie に任せるのではなく、手である程度いくつかのテストコードを作成しておいて、Junie にそれを参考にテストコードを生成してもらうと、かなり真似をして良い感じのテストコードを生成してくれました。

Junie は、定型プロンプトを登録できないので、毎度色々入力するのが面倒なのですが、概ね以下のようなプロンプトでユニットテストを生成しています。

HogeService のユニットテストを生成してください。
ガイドラインに従ってテストを実行し、失敗した場合には実行結果を解析して、テストを修正してください。

その他、以下のような要求を付け加えます。まあ、あとはお好みで。

PiyoRepository はモックしてください。HogeApiClient は WireMock を使ってください。
テストの入力に使う値は、Kotest の property testing と checkAll() を使ってください。必要であれば、Arbs.kt にある Arb を使ってください。

で、Junie って実際どうなの?

Junie は、現状では完璧ではありませんが、個人的には割と満足しています。
特に、JetBrains IDE ユーザーにとっては、Cursor のような AI コーディングエージェントが JetBrains IDE (IntelliJ IDEA) の上で使えるのは大きなメリットです。

自分はあまり他のコーディングエージェントを使ったことがないのですが、少なくとも現時点では IntelliJ IDEA の上で使える GitHub Copilot の Agent (Preview) モードよりは遥かに優秀だと感じています。

ただし、実行時間は結構かかります。遅いです。特に、テストの実行を繰り返す場合には、かなり時間がかかります。一方で、Junie は複数のタスクを並列に実行することができるので、複数のタスクを同時に実行しておくと、ボーッと待っている時間を減らすことができます。

また、トークンの消費も結構激しいです。Vibe coding のような感じで使っていると、AI Pro プランでは1週間ほどで使い切ってしまう気がしています。ガッツリ使いたいのであれば、AI Ultimate プランを購入することをおすすめします。

https://www.jetbrains.com/ai-ides/buy/?section=personal&billing=monthly

そして何より、まだまだ機能は足りていない、良くいうのであれば伸び代があると思っています。特に、JetBrains IDE との連携をもっと強化して欲しいです。例えば、テストの実行結果の解析や、ライブラリ内部までのコードの理解など、JetBrains IDE の機能をもっと活用して欲しいです。それと、MCP との連携機能もまだ入っていないので、実装して欲しいです。

AI 関連は時の流れが早く、どんどんツールが入れ替わっている印象なのですが、とりあえず現時点では Junie で満足しているので、しばらくは Junie を使っていこうと思っています。使わないよりは全然楽です。

一方で、Claude Code や Gemini CLI など、IDE やエディタに依存しないコーディングエージェントとして使える AI はとても気になっていて、Kotlin のバックエンド開発でも使えるのではないかと将来的には期待しています。(残念ながら、本格的な業務のコードでまだ使えていません)

Money Forward Developers

Discussion