マシンラーニングを使えば、メンテナンス作業の削減とプロダクトの品質向上が可能になる。ソフトウェアのテストサイクルのさまざまなステージで使用することができる。チェーンの重要なパートであるバグ管理もその中に含まれる。マシンラーニングアルゴリズムを使って大量のデータを分析することで、バグの分類やトリアージ、優先順位付けをより効率的に行えるようになる。
Rapyuta RoboticsのテストオートメーションエンジニアであるMesut Durukal氏はAginext 2021で、テストでのマシンラーニングの使用について講演した。
Durukal氏はバグの分類とクラスタ化にマシンラーニングを使用している。バグはその重要度、あるいは担当するチームないし個人によって分類することができる。重要度の設定はトリアージ(triage)と呼ばれ、優先度を決定する上で重要である。また、適切なチームあるいは個人に対するバグのアサインは、時間の無駄を防ぐことになる。バグのクラスタ化は、特定の機能に関するバグの発生度数を知る上で有用だ。
バグに関して利用可能なデータをマシンラーニングアルゴリズムを使って調査することによって氏は、製品の状態や使用されているプロセスについて、より深い洞察を得ることができた。
Durukal氏によると、コード修正後のコードレビューの自動化や、破損したテストケースの自動修復にもマシンラーニングが活用できるという。
テスタとしての自身の日常作業において、マシンラーニングをどのように適用しているのか、InfoQはDurukal氏にインタビューした。
InfoQ: テスタが現在直面している課題には、どのようなものがあるのでしょうか?
Mesut Duruklal: 最近は誰もがポケットにスマートフォンを持っています。少し前ならば考えられなかったことですが、今では当たり前になっています。これはつまり、私たちの日常にたくさんのスマートソリューションがある、ということです。モバイルフォンを使えば、音声で部屋の温度をコントロールできますし、自動車のナビゲーションパネルに接続することもできます。
では、この推測がユースケースにどう反映されているのか、チェックしてみましょう。アプリケーションやプラットフォームはさまざまなものと接続されているので、数多くのインテグレーション用インターフェースがあります。同じアプリケーションがさまざまなプラットフォーム — モバイル、PC、IoTなど — にインストールされています。この結果として、数多くのインテグレーションを持つさまざまなプラットフォームを、幅広く検証することが必要になるのです。
スマートソリューションはあらゆる場所で使用されているので、自動車、工場、ロボティクス、ヘルスケアなど、多くのドメインに多数のユースケースが存在しています。従って、テストを行うにはドメインの知識が必要になります — 学ぶべきことは尽きません。
これほどのスマートソリューションが日常生活の中で使われれば、生成されるデータの量も膨大になります。データ管理は難しい問題です。テスタである私たちは、アクティビティを監視して、進捗を完全にトレースできなくてはなりません。
InfoQ: マシンラーニングをテストで、どのように使用したのでしょうか?
Durukal: 次のようなことを試しました。
- バグのトリアージ: 重要度レベルによるバグの分類
- バグの適切なアサイン: 過去の経験に基づいたバグ担当者の推測
- 今後の作業: バグをクラスタ化することにより、特定の機能に集中しているかどうかを確認する — バグとの関連によるケースの優先順位設定
私はこれまで、数多くの監視活動を行ってきましたが、最も貴重なデータソースのひとつがプロダクト内のバグでした。プロダクトやプロセスの状態に関する手がかりが、そこからは得られるのです。注意深く観察することで、私たちがバグを取り逃した理由や、最もバグの多い機能が何であるのかを理解するとともに、バグの見つかる可能性や、見つかった場合の優先順位に関するアイデアを得ることができました。
バグ管理は、時間の無駄という面からも非常に重要です。例えば、もしトリアージが不適切ならば、緊急性の高いバグ修正が優先されずに、後回しになるかも知れません。私はSVMやNaive Bayes、Random Forestなどのおもなアルゴリズムを適用して、それらのバグ分類に関するパフォーマンスを比較してみました。すべてのアルゴリズムの結果は、次のようなものになっています。
この結果テーブルから、大部分が同程度のパフォーマンスを見せている中で、SVMとSGDCの分類処理が最もパフォーマンス的に優れていることが分かります。それと同時に、LinearRegressionのようなレグレッションアルゴリズムが、このような分類問題ではうまく機能しないことも明らかになっています。
AdaBoost以外は、いずれも極めて短い時間で処理を完了しています。
これを分析した結果、パフォーマンスと処理スピードの面から、実行するアルゴリズムとしてSVMを選択しました。
InfoQ: マシンラーニングを、どうやってソフトウェアメンテナンスに使用するのでしょうか?
Durukal: 私たちはコードレビューセッションで非常に多くの時間を使っていますから、そこにマシンラーニング(ML)のテクニックを使えば、メンテナンス作業の軽減が可能になります。最良のコーディングプラクティスをマシンに教えることで、私たちの代わりにマシンがコードレビューをやってくれるのです。deepcode.aiの例のように、マジックナンバの使用がアンチパターンであることをマシンに教えれば、マシンがマジックナンバを検出して、"これはアンチパターンなので、修正してください"と警告するようになります。
特にUIの自動化を扱っている人たちは、自己修復手法が大きな時間的節約になることに同意してくれるでしょう。テストケースはコード修正によって壊れることがあるのですが、これを自動的に検出して、解決策を自動的に提案することが可能になれば、簡単に修正することができます。
InfoQ: マシンラーニングを使ったことで、どのようなメリットがありましたか?
Durukal: 私自身は、すべての作業をMLに置き換えるようなソリューションは採用せず、さまざまなデータを収集してプロセスを改善するようにしています。データマイニングはMLソリューションの重要な部分です。貴重なデータが集まれば、隠れていたパターンが明らかになるかも知れません。現時点において、MLの重要性は非常に明確になったと思っています。私たち人間が膨大なデータを分析する能力には限界がありますから。
例えば、ある調査の中で、実際のプロジェクトを対象としてバグの収集を行いました。調査の目的は、バグの適切なトリアージを行うことでした。バグの優先度の設定に関して、人によってレベルの差異があると分かったからです。私があるバグにP2とタグ付けしても、他の人はP3にする、といった具合です。特に分散型チームでは、意見が異なることが多々あります。しかし、標準を確立するには、これまでオープンされたバグをすべて探さなくてはなりません。新たなバグが発生した時に、これまで発生したすべてのイシューをチェックするようなことはしません。そんなことは人間業ではありませんから :) でもマシンならば、数秒で済ませることができます。ある面においては、マシンで実行した方が一貫的で、プロセスを容易にしてくれる可能性がある、と結論付けられるでしょう。
InfoQ: テストにおけるマシンラーニングの利用は、今後どのようになるのでしょう?
Durukal: 私たちを取り巻くコンピュータ環境は今日でも複雑ですが、今後はもっと高度なものになっていくでしょう。これらのアプリケーションをテストフェーズに統合する作業もまた然りです。例えば、OCR技術による要件資料の解析によって、貴重な洞察が得られるようになるかも知れません。あるいは、他のプラットフォームとの関連をより広いコンテキストから分析できるようになるでしょう。
私たちは日々、パフォーマンスを向上し、時間を低減しなくてはならないのです。近い将来、MLを今以上に活用する必要のあることは明らかです。
InfoQ: これまでに得たものは何ですか?
Durukal: 人間の仕事をロボットが奪う、場合によってはマシンやロボットが人を打ち負かす、という有名な議論があります。ロボットが感情を持たないことには、メリットも、デメリットもあるかも知れません。人の持つ多様性は、状況によって強みにも、弱みにもなり得ます。最終的にコラボレーションを実現し、一緒に働くことができれば、成功だと言えるでしょう。