2020 Java InfoQ Trends Reportによると、Quarkusの人気は高まっており、アーリーアダプタの領域に急速に移行している。超音速亜原子Javaを自称する、このフレームワークには、ソフトウェアアプリケーションの開発と操作を容易にする機能がさらに追加されている。Quarkus 1.0のリリースから17 か月で、その組み込みの開発モードに状態を保持するホットデプロイ機能と再デプロイ機能が追加され、現在はRubyにインスパイアされた別の機能も追加することをターゲットとしている。Quarkus 2.0では、開発者はクラスが変更されるたびにテストを継続的に実行できる。この機能は、裏でスムーズに実行されることを約束し、新しいコードによってテストが中断されたときに開発者に通知する。
InfoQは、この有望な機能についてより深く理解するために、Red HatのシニアプリンシパルエンジニアであるStuart Douglas氏に話を聞いた。
InfoQ: 継続的テストを実装する動機は何か。それは開発プロセスにどのような利点をもたらすと思うか。
Stuart Douglas氏: 実は、主にRubyで開発しているがJavaを試していた開発者からのメーリングリストでの質問が理由で始まりました。彼は、quarkus:devモードでのQuarkusライブリロードに好感を持っていると言いましたが、それに比べてテストの実行が非常に遅いことにがっかりしました。そして、彼はスクリプト言語開発者は頻繁に継続的テストを使っていると指摘しました。
最初の反応は「Javaの場合はこうだ」というものだったのは認めなければなりません。しかし、その問題を一晩寝かせて考えてみると、Quarkusには独自の継続的テストを行うために必要なすべての構成要素が実際に備わっていることに気づきました。本当に必要だったのは、JUnitテストランナーを作成し、すべてを結び付けることだけでした。
開発者の観点からは、これにより、行った変更についてほぼ即座にフィードバックが得られます。コードを保存するとすぐにテストが実行され、変更が有効かどうかを確認できます。私たちはテストの実行に非常に的を絞ったアプローチを使用しているため、変更が影響する可能性のあるテストのみを実行し、その結果、Javaで経験したことのない非常に迅速なフィードバックサイクルが実現できます。Quarkus自体の作業で使えないのは本当に残念です。
開発者エクスペリエンスは、当初からQuarkusの主な焦点の1つであり、これによって次のレベルに引き上げられている。これはQuarkusのコアに統合されているため、すべてのユーザがすぐに利用できます。また、最終的なアプリケーションにはテストコードが含まれることはないため、この機能によってQuarkusアプリケーションが肥大化することもありません。これは、優れた開発者エクスペリエンスを提供しながら、軽量のクラウド中心のアプリケーションを作成できることを意味します。
InfoQ: この新機能は現在、Quarkusのアルファ版リリースの一部である。Quarkus 2.0はいつ利用できるようになるか。GAリリースの前に変更を予定しているか。
Stuart Douglas氏: 現段階では、6月中旬を目指しています。
現時点では、コミュニティからできるだけ多くのフィードバックを得るように努めています。そして、受け取ったフィードバックに基づいてすでにいくつかの変更を行っています。現在とリリースの間でコア機能が大きく変わるとは思いませんが、フィードバックが多ければ多いほど問題を解決できる可能性が高くなります。コンソールと開発UIの両方で結果をどのように表示するかについては、まだいくつかの作業が残っています。そのため、これは、現在と最終リリースの間で最もユーザが見ることができる変更になるかもしれません。
InfoQ: 継続的テストの既知の制限はあるか。
Stuart Douglas氏: 最大の制限は、コードが変更されたときに実行するテストを知るために、開始時にすべてのテストを実行する必要があることだと思います。したがって、巨大なテストスイートがある場合、これが問題になる可能性があります。起動の間でこの情報をキャッシュするなど、これを軽減するためにできることがあります。そのため、これは将来のリリースで改善される可能性があります。
InfoQ: これまでの結果に満足しているか。何か別の方法で実装しようとしているものはあるか。
Stuart Douglas氏: 最初に実験を始めたときに私が期待していたよりもうまく機能していると思います。時間が経つにつれて改善されることは間違いありませんが、コアアーキテクチャには本当に満足しています。
InfoQ: その実装の詳細について概要を教えていただけるか。特に満足していることはあるか。
Stuart Douglas氏: テストが有効になっているときの最初の課題は、実際にテストアーティファクトを解決し、クラスをロードできるClassLoaderを構築することです。アプリを通常どおり実行している場合、JUnitなどは存在しないため、手動で解決する必要があります。これは比較的複雑で、MavenとGradleの両方に対して実行する必要があります。しかし、幸いなことに、私たちは拡張機能のビルド時間部分を解決するために使用するコードをすでに持っていました。
次に、テストを検出する必要があります。これは、開発モードでは、既存のワークスペースモデルにメタデータを追加するだけで必要な変更に対処できるようにするために、現在のワークスペースがすでに追跡されているためです。このメタデータを使用して、ユーザのテストクラスを検出し、それらを新しいClassLoaderにロードできます。テストとアプリケーションクラスをロードするとき、実際にいくつかのバイトコード変換を実行して、メソッドがいつ呼び出されたかを追跡できるようにします。これが、どのテストが対応するクラスに関係しているかを知る方法です。
次に必要だったのは、テストを実行する方法でした。これは、唯一の全くの新しい要素です。これには、私がこれまで見たことのないJUnitランナーの作成が含まれていました。しかし、APIが非常に優れているため、実装は簡単です。起動時にテストを実行する場合、上記の変換を使って、どのテストがアプリケーションクラスを使用するかを追跡します。
上記の3つの項目は、実際にテストを実行するために必要なすべてですが、コードの変更時にテストを再実行する方法も必要です。開発モードでは、変更されたファイルを検出して自動的にコンパイルする機能が既にサポートされているため、テストを処理するためにここを変更する必要がありました。ソースファイルが変更されると、それらは自動的にコンパイルされ、最初のテスト実行で収集したクラスの使用状況データが表示されます。ここから、変更されたクラスを使用するすべてのテストを把握し、関連のないテストを実行することなく自動的に実行できます。
この中で、完全に新しいパーツはテストランナーだけです。それ以外はすべて、すでに持っていた機能の拡張にすぎません。私が最も誇りに思っていることは、コードの影響を受けるテストを正確に追跡できる方法です。これがないと、変更後に実行するテストを正確に知ることができません。
InfoQ: 開発モードを有効にすると、継続的テストは自動的に有効になるか。
Stuart Douglas氏: 自動的に使用可能になりますが、有効にするにはキーを押す必要があります。これは設定で変更できるため、常に継続的テストを使用するようにQuarkusを設定できます。Quarkusには、継続的なテストを制御するためのいくつかのキーバインドが用意されているため、テストの一時停止/再開、テストの再実行などをすばやく行うことができます。
また、テストのみを実行し、開発モードを起動しないquarkus:testコマンドも提供しています。これはユーザに柔軟性を提供します。たとえば、テスト駆動開発を行っているだけなら、テストの実行だけに関心があるかもしれません。
6月中旬のGAリリースを目標としているQuarkus 2.0は、他の機能の中でも特に、コードの作成中にテストを継続的に実行する機能を提供するものである。Quarkus 1.11で追加された継続的デプロイ機能と同様に、継続的テストは、変更されたコードに対する迅速なフィードバックを開発者に提供し、問題を迅速に検出し、将来的にそれらを修正できるようにする見込みである。Quarkusの開発モードの一部は、すぐに使用でき、設定を介して変更を加えることができる。まだアルファ版であるが、レポートツールのUI側のみが影響を受ける可能性が高く、コア機能は影響を受けない。継続的テストの詳細については、Douglasの YouTubeビデオをご覧ください。開発者は、GAリリースの前にこの新機能を試すことを勧める。