はじめに
Cucumberによる結合テストで、実装側のブレークポイントが効かず困ったことはありませんか?
私自身、JUnitでは止まるのに、Cucumberから呼ばれる実装処理が止まらず何が起きているかわかりませんでした。
原因は「Payaraをデバックモードで起動していないこと」にありました。
この記事では、その技術的な理由と対処法をわかりやすく整理しました。
背景と疑問におもったこと
Cucumberテストを実行し、実装側にブレークポイントを設定しても、Payaraをデバックモードでデプロイしていないと、ブレークポイントが反応しない理由がわからなかった。
Junitなどの単体テストではIDEと同じJVM内で実行されるためブレークポイントが効くが、Payara経由で動作するCucumberテストの場合、なぜデバックモードでサーバを起動しないと止まらないのか疑問
技術的な補足・考察
想定される原因と背景
Cucumberは通常、アプリケーションを起動したPayara Serverに対してHTTPリクエストを投げてテストを行う構成(外部結合テスト)であることが多い。
1.そのため、テストコード(Cucumber)が呼び出す対象は、「Payara上にデプロイされたアプリケーションのHTTPエンドポイント」になる。
2.実装の処理が実行されるのはPayara上のプロセスであり、IDEの通常のデバックモードでは対象にならない。
Payaraがデバックモードで起動されていないと、JVMのデバッガーポートが開かれておらず、IDEから接続できない。
1.デバッグモードでは、JVMに対して「外部デバッガから接続可能なポート」が開かれ、IDEと通信できるようになる。
2.通常モードだとこの接続が行えず、IDEのブレークポイントも機能しない。
ポイントまとめ
用語 | 意味 |
---|---|
JVM | Javaの実行環境 |
Payara | JVM上で動くアプリサーバ |
デバッガーポート | JVMがデバッグ時に外部と通信するために開くポート |
JPDA | デバッガーとJVM間の通信を可能にするプロトコル。 |
IDE | 開発を支援する統合環境。 |
Payara は JVM 上で動いているアプリケーションサーバ
通常モードとデバッグモードの違い
対処法としては
Payaraを--debug
オプションまたはIDE(例:IntelliJ)の「Debug」ボタン経由で起動する。
JPDAポート(例:9009)をIDE側のRemote Debug設定で接続しておく。
されに、payara-maven-plugin
などを使っている場合は、debug
プロファイルの設定も確認する。
学び
Cucumberを使ってPayara上のREST APIをテストする際、実装側でのブレークポイントを効かせるには、Payara Server自体をJPDAポートを開いてデバッグモードで起動する必要があるとわかった。
単体テスト(JUnit)とは異なり、外部結合テストではサーバプロセスが別JVM上で動いており、IDEからは直接制御できない点に注意。