GUIアプリケーションにランダムなクリック・操作を送り続けて、長時間稼働させたときに不具合(クラッシュ・フリーズ・メモリリーク等)が出ないかを確認するための耐久テストツールです。
EnduranceTestGUIは、テスト対象のGUIアプリケーションに対して、あらかじめ決めた「操作領域」の中でクリック・ドラッグ・キー入力・スクロール・ショートカット・ウィンドウ操作などをランダムに送り続ける耐久テストツールです。人手では時間がかかる「何百回、何千回とボタンを押し続けたらどこかで壊れないか」という確認を自動化できます。
特に力を入れているのは、不具合が起きたときに「何が原因だったか」を後から追いかけられることです。対象アプリがクラッシュした場合は、
を自動的に保存します。詳しくは クラッシュ検知と再テスト を参照してください。
システム設定の「プライバシーとセキュリティ」→「アクセシビリティ」で EnduranceTestGUI を許可してください。未許可のまま開始しようとすると、許可を促すダイアログが表示されます。
同じく「プライバシーとセキュリティ」→「画面収録」でも EnduranceTestGUI を許可してください。この権限が無いと、操作領域を選択する画面(半透明オーバーレイ)の背景に使う画面キャプチャが取得できず、画面全体が黒く塗りつぶされて他のアプリが見えなくなったように見えます(実際には他のアプリは変化していません)。①対象選択パネルにこの権限の状態も表示され、未許可の場合はボタンから直接設定画面を開けます。
EnduranceTestGUI.app をFinderから直接ダブルクリックして起動するのが確実です。
入力送信そのものに特別な権限は不要です(Xサーバーにアクセスできれば動作します)。右クリックメニューの項目選択機能を使う場合のみ、対象アプリ側がAT-SPIアクセシビリティに対応している必要があります。Waylandには対応していません(X11、またはXWayland経由のみ)。
ウィンドウは縦に3段構成になっています。
「対象 (Target)」のプルダウンから、テストしたいアプリのウィンドウを選びます。一覧に出てこない場合は「更新」ボタンで再取得してください。選択すると、そのアプリを操作するための権限があるかどうかが緑(許可済み)または赤(未許可)で表示されます。未許可の場合は「権限設定を開く」からOSの設定画面を開けます。その下にはmacOSの画面収録権限の状態も同じ形式で表示されます(Linuxでは常に許可済み扱い)。この権限が無いと、操作領域を選択する画面の背景が真っ黒になり他のアプリが見えなくなったように見えるため、赤い表示が出ている場合は「画面収録の権限設定を開く」から許可してください。
「対象アプリの自動起動コマンド(任意)」欄に実行ファイルのパスを設定しておくと、「今すぐ起動」ボタンでいつでも手動で試し起動でき、また後述の連続実行機能(「⑧ テストの開始・停止」参照)で使われます。「開始時にこのコマンドで対象ツールを起動してから開始する」にチェックを入れると、「▶ 開始」を押した際にまずこのコマンドで対象アプリを起動し、起動を確認してから起動時セットアップ→ステップ構成の実行を始めるようになります(チェックを入れる場合、自動起動コマンドの設定が必須です)。「対象ツールの起動検知後、さらに待つ時間」で0より大きい秒数を指定すると、対象ツールのウィンドウを検知してから実際にテストを開始するまでその秒数だけ追加で待ちます。起動直後はまだ操作を受け付けられないツールに対して、待たずに始めると安全確認に失敗してしまう場合に使います(連続実行・自動再起動待ち・上のオプションのいずれにも適用されます)。
「現在のウィンドウサイズを保存」を押すと、今選択している対象ウィンドウの大きさを1件だけ記録できます(プリセットJSONにも保存され、アプリを再起動しても失われません)。「保存したサイズに変更」を押すと、選択中の対象ウィンドウをその保存済みサイズへ変更します。対象アプリ自身のレイアウト上の最小サイズを下回る値を指定した場合、実際のサイズはそれより大きい値に丸められることがあります。同様に「現在のウィンドウ位置を保存」「保存した位置に変更」で、対象ウィンドウの画面上の位置も1件だけ保存・復元できます。「連続実行時に保存済みのウィンドウ位置・サイズへ変更する」にチェックを入れておくと、対象アプリが(再)起動して検知されるたびに、保存済みのサイズ・位置があればそれぞれ自動的に適用してから実行を始めます(「⟳ 連続実行」のキル→再起動サイクル、「連続実行回数」による自動/手動再起動待ち、「起動してから開始する」オプションのいずれにも適用されます)。
「操作領域を確認」ボタンを押すと、現在登録されているすべての操作領域が、それぞれの名前ラベル付きで画面上に同時にハイライト表示されます(個別に選んで確認する必要はありません)。もう一度押す(ボタンの表示は「非表示にする」に変わります)か、登録済みの操作領域が1件もない状態で押すと案内メッセージが表示されます。このハイライトは一覧の「追加...」「編集...」「削除」を行うと自動的に非表示に戻り、表示したまま一定時間(約12秒)が経過した場合も自動的に非表示に戻ります(ウィンドウマネージャによっては常時最前面のハイライト表示中、本体ウィンドウの操作を受け付けにくくなることがあるための保険です)。
操作領域の登録方法には、矩形を描画する代わりに「画面上の部品を指定」を選ぶモードもあります。対象アプリがQt等のツールキットで作られていてアクセシビリティAPI(macOS Accessibility API / Linux AT-SPI)に対応している場合、ボタンやメニュー項目などの「部品」そのものを名前で指定でき、対象アプリのレイアウトが多少変わっても追従できます(詳しくは次の囲みを参照)。
「画面上の部品を指定」を選んで「オブジェクトを指定...」を押すと画面表示が切り替わります。対象アプリ上でボタンやメニュー項目などにマウスを合わせると緑の枠と部品の役割・名前がその場に表示されるので、使いたい部品が緑の枠で囲まれた状態でクリックしてください。同じ役割・名前の部品が画面上に複数ある場合は、実際にクリックした位置から「何番目の一致か」が自動的に判定され、「指定中: push button「保存」(2番目の一致)」のように表示されます。
登録したオブジェクト指定の操作領域は、矩形指定の操作領域と全く同じようにステップから参照でき、クリック・ドラッグ・キー入力・スクロールなど既存の操作がそのまま使えます。固定座標ではなく部品そのものを追いかけるため、ウィンドウのサイズやレイアウトが多少変わっても、同じ部品を指し続けます。「クリック操作では、座標の代わりにこの部品の既定アクションを直接実行する」にチェックを入れると、画面上の座標をクリックする代わりに、その部品の既定の動作(ボタンなら押す、チェックボックスなら切り替える等)をアクセシビリティAPI経由で直接実行するようになります。「再解決の間隔」では、同じ操作領域を使い続けている間にどれくらいの頻度で部品の位置を探し直すかを選べます(既定は「ステップが変わるたびのみ」=1回だけ探して以降は使い回すため、高速な連続操作でも性能への影響はほとんどありません)。
テスト対象のアプリ自体にアクセシビリティAPIへの対応がない、または意図的に使いたくない場合は、⑦タイミング・制限パネルの「アクセシビリティAPI(右クリックメニュー選択・ダイアログのボタン押下・名前付きオブジェクト)による操作を無効にする(高速化)」にチェックを入れてください。有効にすると、名前付きオブジェクトを参照するステップだけでなく右クリックメニュー選択・ダイアログのボタン押下も含めて、アクセシビリティAPIの呼び出し自体を一切行わなくなります。
矩形を描画/画面上の部品を指定に加えて、「点列(スイープ)で指定」という3つ目の登録方法もあります。これは後述(「⑤ ② ステップを作成する」)するステップ単位の「点列(スイープ)」と同じ仕組み(指定した間隔で並んだ点を順番に操作し、最後まで行くと先頭に戻って繰り返す)を、ステップではなく操作領域そのものとして名前付きで登録しておけるようにしたものです。一度登録しておけば、複数のステップから同じスイープ点列を名前で参照して使い回せます(ステップごとに指定し直す必要がありません)。登録方法は「点を追加...」を1回押すと、あとは画面上を左クリックするたびに「始点」「中点(いくつでも追加可)」「終点」の順に点が追加されていき、右クリックすると追加が終了します(Escで追加自体を取り消せます。「選択を削除」で一覧から追加後の任意の点を削除できます)。最低2点(始点・終点)が必要で、中点は0個以上何個でも挟めます。始点・中点・終点を順番に結んだ経路に沿って「間隔 (px)」で指定した間隔の点が生成され、巡回操作されます。「ランダム幅 (px)」の扱いは他の点列(スイープ)と同じです。このスイープ領域をステップから参照すると、そのステップの「操作位置の選び方」設定に関わらず、常にこの領域自身のスイープ点列が使われます。
対象アプリによっては、起動直後にログインや初期設定など決まった操作を済ませてからでないと、ランダム操作による耐久テストを始められない場合があります。①パネルの「起動時セットアップ」欄に一連の操作を登録しておくと、対象アプリが起動しているのを確認した直後・②のランダム操作が始まる前に、登録した順番で一度だけ自動実行されます。
1「追加...」を押すと、1件分の操作を設定するダイアログが開きます。「種類」からクリック・ダブルクリック・右クリック・ドラッグ・文字入力・キー入力・待機・ホイールスクロール・メニュー項目を選択のいずれかを選びます。「ホイールスクロール」は位置・方向(上/下/左/右)・量を指定します。「メニュー項目を選択」は右クリックで開くメニューから常に選ぶ1項目を、項目名または上から何番目かのどちらかで指定します(対象アプリのメニュー内容が実行ごとに変わる場合、指定した項目が見つからなくてもセットアップ全体は失敗させず、メニューを閉じるだけに留めます)。既存の「右クリック」はメニューが開いても常に閉じるだけで、項目は選択しません。
2クリック系・ドラッグの操作は「位置を選択...」ボタンを押すと画面全体が半透明になるので、対象アプリ上でクリックしたい位置をそのままクリックしてください(座標を手入力する必要はありません)。座標は対象ウィンドウの左上を基準にした相対位置として保存されるため、次回以降ウィンドウの位置が変わっていても正しい位置を操作できます。位置を選択すると、このダイアログが開いている間だけ、選んだ位置に小さなマーカー(ドラッグの場合は開始位置と終了位置の両方を線で結んで)が画面上に表示され続けるので、意図した場所を選べたか一目で確認できます。
3「説明(任意)」欄に「ユーザー名欄」のようなメモを付けておくと、①の一覧で内容を見分けやすくなります。
4「OK」で一覧に追加されます。「↑ 上へ」「↓ 下へ」で実行順を入れ替えたり、「編集...」で内容を変更したり、「削除」で取り除いたりできます。「全消去」を押すと(確認なしで)一覧をすべて空にします。
「連続自動実行(①バッチ)では初回のみ実行する」にチェックを入れると、①下部の「連続実行回数」を2以上にして連続自動実行した際、2回目以降の自動再起動では起動時セットアップをスキップします。初回だけ表示されるライセンス同意ダイアログのように、毎回は不要な操作がある場合に使います。
「● 記録...」ボタンを使うと、1件ずつ「追加...」する代わりに、実際に自分で操作して一連の起動時セットアップをまとめて作成できます。押すと画面右上に記録中パネルが表示され、その状態でマウスのクリック・ドラッグ・キーボード入力を行うと、そのままEscキーを押すまでの操作がこの一覧に追加されていきます。対象アプリ自体だけでなく、対象アプリが開くダイアログ(右クリックメニューの選択後に出てくる確認ダイアログなど)を操作した場合もそのまま記録されます。押したキーがそのまま文字として続く場合はひとまとめの「文字入力」として、Tab・Enter・矢印キー等は個別の「キー入力」として記録されます(記録されたクリックは常に単発の「クリック」として記録されるので、意図的なダブルクリックにしたい場合は記録後に「編集...」で種類を変更してください)。連続したホイール操作もまとめて1件の「ホイールスクロール」として記録されます。右クリックした直後に続けて左クリックすると、その左クリックが開いたメニューの項目を選んでいると判断できた場合は右クリックと合わせて1件の「メニュー項目を選択」として記録され、判断できなかった場合は通常どおり「右クリック」と「クリック」が別々に記録されます。記録した操作と操作の間に実際に空いていた時間(1件目を除く)も自動的に「待機」として一覧に挿入されるため、「▶ 起動時セットアップを試す」等で再生すると、記録時とほぼ同じテンポで操作が再現されます(挿入された待機も他のセットアップ操作と同様に「編集...」で時間を調整したり削除したりできます)。Escキーを押す、または記録中パネルの「■ 記録終了」を押すと記録が終わります。
「▶ 起動時セットアップを試す」ボタンを押すと、①で選択中の対象ウィンドウに対して、この一覧に登録済みのセットアップだけを実行して確認できます。②のステップ構成は一切実行されないため、②が未設定のままでも押せます。実行が完了すると自動的に停止し、ステータス欄に「起動時セットアップの実行確認が完了しました」と表示されます。セットアップが1件も無い状態で押すとエラーダイアログが表示されます。
テストは1つ以上の「ステップ」を順番に繰り返し実行する形で構成します。
1「追加...」ボタンを押すと、そのステップの設定ダイアログが開きます。まず「対象GUIの全領域(自動追従)」か、①で登録した名前付き操作領域のどちらかを操作範囲として選びます。
2「OK」を押すとステップが一覧に追加され、自動的に選択された状態になります。設定内容を後から変更したい場合は、一覧の該当行をダブルクリックするか、選択して「編集...」を押すと同じダイアログが再度開きます。新しく作るステップ共通の初期値(デフォルト)は、②の見出し行にある「デフォルト」ボタンから、ステップを1つも選択していない状態でもいつでも編集できます。
ステップは一覧内で「↑ 上へ」「↓ 下へ」で順番を入れ替えたり、複数選択して「グループ化」でまとめて1つのグループとして扱うこともできます(グループ内ではメンバーが重みに応じてランダムに選ばれます)。「タスクを追加...」を押すと、まとめた各ステップを登録順で必ず1回ずつ実行し、そのひとまとまり全体で「実行回数」1回分としてカウントする「タスク」を、空の状態から作成できます(前後をランダムに入れ替えたくない一連の操作フローをまとめたい場合に使います。グループ化と異なり既存のステップを選択しておく必要はなく、開いたダイアログの「追加...」でタスクの中身を1つずつ組み立てます)。グループ・タスクとも、選択して「グループ解除」「タスク解除」を押すと元の個別のステップに戻せます。「待機を追加...」で、指定ミリ秒だけ何もしない「待機ステップ」を挟むこともできます。
ステップの設定ダイアログの「操作位置の選び方」では、既定の「ランダム」(操作範囲内の毎回ランダムな1点)に代えて「点列(スイープ)」を選べます。「開始位置を選択...」「終了位置を選択...」で指定した2点の間を「間隔 (px)」で指定した間隔で均等に分割した点列を、実行のたびに順番に1点ずつ巡回します(最後の点まで行くと開始位置に戻って繰り返します)。「操作領域の下から上へ、一定間隔でクリックしていきたいが、そのための矩形領域をいくつも用意するのは大変」という場合に、名前付き領域を使わずこの1ステップだけで組めます。「ランダム幅 (px)」を0より大きくすると、各点を実際に操作する瞬間に上下左右にその範囲内でランダムにずらすため、毎回まったく同じピクセルを叩き続けるのではなく、ある程度のばらつきを持たせることもできます。
タスクの各操作を追加・編集する際の操作領域選択ダイアログには、「新しく出現したウィンドウ(ダイアログ等)を対象にする(自動検出)」という選択肢もあります。これを選んだ操作は、対象アプリのメインウィンドウとは別に新しく出現したウィンドウ(例えば、直前の操作が右クリックメニューから項目を選んだ結果開いた確認ダイアログなど)をそのまま操作領域にします。実行時にそのようなウィンドウがまだ見つからない場合は現れるまで自動的に待機します。この「新しく出現したウィンドウを対象にする」タスクメンバーでは、操作の詳細設定で「ダイアログのボタンを押す」という操作種別も選べます。あらかじめ候補となるボタン名(「OK」「はい」等)を複数登録しておき、実行時にその中から実際にそのダイアログ上に存在するものを探して押します(右クリックメニューの項目選択と同じ仕組みです)。候補が1つも見つからない場合はその回をスキップし、次の機会に改めて試します。
操作種別の「ファズ文字列入力」は、その瞬間にキーボードフォーカスを持っている1つの入力欄だけに、あらかじめ用意された境界値・不正値文字列(いわゆるファズ文字列)をランダムに1つ選んで入力します。「領域内の全入力項目にファズ入力」は対象を広げたもので、選択した操作領域内に存在する入力可能な項目(テキスト欄・複数行テキスト欄・スピンボックスの入力欄など)をアクセシビリティAPI経由ですべて検出し、その1回の操作でそれぞれにランダムなファズ文字列を入力します(キーボードフォーカスの有無は問いません)。どちらも操作の詳細設定で「このステップ専用の設定を使う」を選ぶと、ファズ文字列関連の詳しいオプションが現れます。
「ファズ文字列の送信方法」では、キーボードで1文字ずつ入力する「キー入力」、クリップボード経由で一括貼り付けする「貼り付け」、どちらかを操作のたびにランダムに選ぶ「ランダム」の3通りから選べます。「キー入力」は文字種によっては正しく送れない場合がある(使用するキー入力バックエンドがUnicode全体ではなくLatin-1相当までしか確実に送出できないため)一方、「貼り付け」は文字列の内容によらず確実に反映できますが、操作の間だけクリップボードの内容を一時的に書き換え、操作が終わると(他のアプリ等が横取りしていない限り)元の内容を自動的に復元します。候補の一覧には、デフォルトで制御文字・絵文字・長大な文字列・SQLインジェクションやパストラバーサルの定型文などが多数登録済みですが、「すべてのファズ文字列を使う」ではなく「選択した文字列のみを使う」を選ぶと、一覧でチェックした文字列だけに絞り込んで使用できます。一覧の内容自体は、メニューバーの「表示」→「ファズ文字列リストを編集...」から自由に追加・編集・削除・デフォルトへの復元ができます。
「領域内の全入力項目にファズ入力」は、対象アプリのアクセシビリティAPI(「④ ① 対象アプリを選択する」参照)に依存する機能です。対象アプリ側やツールキットの実装によっては、一部の入力欄の種類(例えばスピンボックスに埋め込まれた入力欄など)がアクセシビリティツリー上で「編集可能」として正しく公開されず、検出・入力の対象から漏れることがあります。これはこのツール側の不具合ではなく、対象アプリ側のアクセシビリティ対応状況に起因する既知の制限です。
操作種別の「長押しドラッグ(カメラ操作等)」は、VTKなどの3Dビューワーが採用している「ボタンを押したまま動かし続ける」カメラ操作(回転・パン・スピン・ズーム)を想定した機能です。通常の「ドラッグ」が瞬間的な押下→移動→解放の1回きりの動作なのに対し、こちらはボタン(左・中・右)と修飾キー(Shift/Ctrl/Alt)の組み合わせを押したまま、円・ジグザグ・ランダムウォークのいずれかの経路で指定した時間だけ動かし続けます。ボタン・修飾キーの組み合わせは「操作の詳細設定」で複数登録でき、実行のたびに重みに応じてランダムに1つが選ばれます(例: 左=回転、Shift+左または中=パン、Ctrl+左=スピン、右=ズーム、というVTK標準の割り当てをそのまま複数登録しておくと、実行ごとに様々なカメラ操作が混ざって実行されます)。
長押しドラッグ中は、さらに次の操作を重ねて実行できます(いずれも任意で有効化)。
3Dビューワーのように右ボタンのドラッグがズーム等に割り当てられていてコンテキストメニューを持たないアプリを対象にする場合は、「右ボタン操作ではメニューを開かない(3Dビューワー向け)」にチェックを入れてください。これを有効にしないと、右ボタンを使うクリック・ドラッグ・長押しドラッグのたびに、本来は存在しないメニューを探そうとした末にEscapeキーが送られてしまい、対象アプリが実行中だった処理を意図せず取り消してしまうことがあります。通常の右クリックメニューを持つアプリでは、このチェックは外したままにしてください。
①パネルの「タイミング・制限」欄では、操作の間隔(ms、または回数/秒)、最大実行回数・最大実行時間・シーケンスの繰り返し回数(いずれも必須。無制限は選べません)、乱数シードなどを設定します。下にスクロールすると、以下の項目も設定できます。
| 項目 | 説明 |
|---|---|
| 対象アプリを常に最前面に保つ | デフォルトON。実行開始時や各操作の直前に対象ウィンドウを最前面へ上げ、クリック・キー入力等が確実に対象へ届くようにする。本体のメインウィンドウが対象ウィンドウの下に隠れてしまうことがあるが、その場合でも画面右上のフローティングパネル(「⑧ テストの開始・停止」参照)から一時停止・再開・停止を行える |
| 乱数シード | 「ランダム」のままなら毎回自動生成。値を指定すると同じ操作列を再現できる(クラッシュ再現用) |
| 操作領域スクリーンショットの撮影タイミング | 実行前に一度だけ / ステップが変わるたび / 一定間隔ごと、から選択。撮影された画像は後から「操作領域画像を保存...」で保存可能 |
| 異常停止時に直近の画面を録画として保存する | デフォルトOFF。有効にすると0.5秒間隔で直近約10秒分の画面をリングバッファに保持し、クラッシュ時に連番PNGとして自動保存 |
| 異常停止時にOSのクラッシュダンプ・診断ログを収集する | デフォルトON。対象アプリのクラッシュレポート/コアダンプをベストエフォートで探し、見つかればパスをログに記録 |
| 対象アプリの応答が遅い時は操作間隔を自動的に延ばす | デフォルトOFF(Linuxのみ)。ハング検知と同じ応答確認(8秒間隔)が1回だけ失敗すると、ハングと確定するまでの間、操作間隔を一時的に5倍へ延ばして対象アプリの負荷を減らす。応答が戻れば自動的に元の間隔に戻る。2回連続で失敗した場合の「ハング」としての停止判定自体はこのオプションの有無に関わらず変わらない |
| デバッグモード(対象アプリをデバッガ上で動かしながらテストする) | デフォルトOFF(Linuxのみ)。対象アプリをgdb/lldb等のデバッガにアタッチした状態で耐久テストしたい場合に有効にする。ハング確定に必要な連続応答失敗回数を2回から15回(約2分間)へ引き上げ、ブレークポイントでの一時停止を本物のハングと誤認しにくくする(本当にハングした場合は従来どおりいずれ検知する)。詳細は下記参照 |
| アクセシビリティAPI(右クリックメニュー選択・ダイアログのボタン押下・名前付きオブジェクト)による操作を無効にする(高速化) | デフォルトOFF。有効にすると、名前付きオブジェクト(「④ ① 対象アプリを選択する」参照)を参照するステップだけでなく、右クリックメニュー選択・ダイアログのボタン押下も含めて、アクセシビリティAPIの呼び出し(初期化すら)を一切行わなくなる。対象アプリがアクセシビリティAPIに対応していない場合や、純粋な座標ベースの操作だけで高速に耐久テストしたい場合に使う |
/proc/<pid>/statusのTracerPid、macOSはPROC_FLAG_TRACED)。「デバッグモード」をONにし忘れたままデバッガがアタッチされた状態で「▶ 開始」を押すと、開始前に「デバッガのアタッチを検知しました」という確認ダイアログが出ます(連続実行・CLIヘッドレス実行では、確認する相手がいないためログに警告を出すだけで続行します)。気づかずそのまま実行を続けた場合も、実行中に一度だけ同じ内容の警告をログに出します。
同じマシン上で動く他のソフトウェアのCPU負荷が、対象アプリの複数スレッドのタイミングに影響し、負荷依存で発生するクラッシュ(いわゆるハイゼンバグ)の一因になっていることがあります。「負荷注入(別プロセス、診断用)」グループは、そうした状況を意図的に再現するための診断機能です。「テスト実行中に負荷注入を有効にする」にチェックを入れ、プロセス数とプロセスあたりのメモリ使用量を指定すると、CPU+メモリ負荷をかけ続ける専用の別プロセス(loadstress_helper)が指定した数だけ起動されます。これはEnduranceTestGUI自身のスレッドとしてではなく、独立したOSプロセスとして動作するため、負荷生成がEnduranceTestGUI自身の操作ディスパッチ速度に悪影響を与えません(Linuxでは、負荷プロセスがEnduranceTestGUI自身の使うCPUコアを使わないよう、自動的にコアの住み分けも行います)。「テスト実行の開始・停止と連動させる」(デフォルトON)にチェックが入っていると、「▶ 開始」でテストが始まると同時に負荷注入も自動的に開始され、テストの終了・停止(正常終了・異常停止・手動停止のいずれでも)と同時に自動的に停止します。チェックを外した場合は、「負荷注入を今すぐ開始/停止」ボタンで、テストの実行状態とは無関係にいつでも手動で開始・停止できます(実行中でもこのボタンは操作可能です)。
メニューバーの「表示」→「負荷モニター...」を選ぶと、メインウィンドウとは別の独立したウィンドウが開きます。対象アプリ自身のCPU使用率・メモリ使用量と、システム全体のCPU使用率(Linuxのみ)をリアルタイムに折れ線グラフで表示する診断機能です。CPU使用率とメモリ使用量は、スケールが大きく異なるため1枚に重ねず、上段「CPU使用率」(0〜100%軸)・下段「メモリ使用量」(0MBから自動スケールする軸)の2段のグラフとして別々に表示します。「負荷モニターを有効にする」にチェックを入れると、「サンプリング間隔」(デフォルト500ms、お好みの値に変更可能)ごとに①で選択中の対象アプリの負荷をグラフに描画します。テストを開始していなくても、①で対象アプリさえ選択されていればチェックを入れた瞬間に監視が始まります(対象未選択の場合はログで知らせます)。テスト実行中にチェックを入れた場合も同様にすぐ始まり、実行が終わってもチェックが入ったままなら監視は止まらず継続します(止めたい場合はチェックを外してください)。グラフ上で薄い赤色の帯になっている区間は、負荷注入モードが稼働していた期間を示します。「負荷モニターのグラフを保存...」ボタンで、現在の推移をCSVファイルとグラフ画像として手動保存することもできます。このウィンドウはメインウィンドウの操作と並行して開いたままにしておけるため、テスト実行中もメイン画面側でステップ構成等を確認しながら負荷の推移を見続けられます。一度も開かなくても、有効化・サンプリング・クラッシュ時の自動保存自体はいずれも変わらず動作します。
この機能の本来の目的は、クラッシュ直前にどの程度の負荷がかかっていたかを後から確認できるようにすることです。異常停止(クラッシュ)を検知すると、直前までのCPU/メモリ推移を自動的にCSVファイルとグラフ画像として保存します(操作領域画像やテスト設定の自動保存と同じ保存先)。サンプリング間隔を短くするほど細かい時間分解能で記録できますが、①の操作間隔(最短ms指定)に近づきすぎると、サンプリング自体が高速操作の妨げになる可能性があるため、操作間隔より十分大きい値を設定してください。チェックを外したまま(デフォルト)にしておけば、サンプリング用のタイマー自体が一度も動かないため、耐久テスト本体の動作には一切影響しません。
「メモリリークの疑いを自動検知する」にチェックを入れると、既存の5秒間隔リソース監視(常に動作しています)が記録しているメモリ使用量の推移を監視し、増加傾向(MB/分)が指定したしきい値を一定時間(数分程度)超え続けた場合に「メモリリークの疑いあり」としてログに警告を出し、実行結果サマリーにも記録します。クラッシュせずにじわじわメモリが増え続けるタイプの不具合は、従来は画面のグラフを目視で確認しない限り気づけませんでしたが、この機能を使うとログ・サマリーを見るだけで気づけるようになります。クラッシュとして扱ったりテストを自動停止したりはしません(検知・記録のみ)。チェックを外したまま(デフォルト)にしておけば、この機能は一切動作せず、既存の動作に影響しません。
①対象選択パネルの「対象アプリのログファイル(任意、クラッシュ時に末尾を自動保存)」に、対象アプリ自身が書き出すログファイルのパスを指定しておくと、異常停止(クラッシュ等)を検知した際に、そのファイルの末尾(最大512KB・200行)がスクリーンショットやクラッシュダンプと同じ場所に自動保存されます。対象アプリが独自のログを残すタイプのソフトウェアであれば、スクリーンショットだけでは分からないクラッシュの原因究明の手がかりが大幅に増えます。空欄のまま(デフォルト)にしておけば、この機能は一切動作せず、既存の動作に影響しません。
設定が済んだら「▶ 開始」ボタンでテストを開始します。実行中は画面右上に常時最前面のフローティングパネル(実行回数、「‖ 一時停止」、「■ 停止 (STOP)」ボタン)が表示されるので、「対象アプリを常に最前面に保つ」(⑦タイミング・制限、デフォルトON)により対象アプリのウィンドウが本体のメインウィンドウを覆い隠している間でも、このフローティングパネルから一時停止・再開・停止のいずれもすぐに行えます。
「連続実行回数」を2以上にして「▶ 開始」を押すと、1回終わるたびに(対象アプリの再起動を待って)自動的に次を開始し、指定回数繰り返します。対象アプリが実行終了時点でまだ生きていればそのまま次を開始し、落ちていれば①の自動起動コマンドでの自動再起動、または手動での再起動を検知して次を開始します。これとは別に「⟳ 連続実行」ボタンは、対象アプリが起動中かどうかに関わらず、押すたびに必ず一度終了させてから新しいインスタンスを起動し直し、起動時セットアップ→ステップ構成の実行を行います。これを「連続実行回数」の指定回数だけ繰り返す、より厳密に「毎回クリーンな状態から」テストしたい場合向けの機能です(①の自動起動コマンドの設定が必須です)。どちらも「■ 停止」でいつでも中断できます。
ログには操作ごとに、座標・対象ウィンドウ相対座標・(取得できれば)クリックしたUI部品名が記録されます。実行中のログは全行が ~/Documents/EnduranceTestGUI_Logs/ 以下のファイルへも逐次保存されるため、画面表示(直近5000行まで)から流れて消えても後から全履歴を確認できます。
次の場合、テストは自動的に停止します。
GUIを開かずターミナルから実行する(CLI/ヘッドレス実行モード): 「テスト設定を保存...」で保存したプリセットJSONがあれば、EnduranceTestGUI --run <preset.json> [--repeat N] をターミナルで実行することで、ウィンドウを一切表示せずに同じテストを実行できます。動作は「⟳ 連続実行」ボタンと全く同じで、対象アプリを一度終了させてから起動コマンド(プリセットに保存されている必要があります)で新規起動し、--repeatで指定した回数(省略時は1回)繰り返します。進捗・操作ログ・実行結果サマリーはすべて標準出力に流れ、全回終了時(またはエラーで続行不能になった時)に自動的にプロセスが終了します。終了コードは、いずれかの実行で異常(クラッシュ等)が発生していれば1、なければ0になるため、シェルスクリプトやCIから成否を判定できます。
実行制御の行にある「● 録画」ボタンは、「▶ 開始」「■ 停止」とは独立したボタンです。テストを実行しているかどうかに関わらず、押した瞬間から対象ウィンドウを0.5秒間隔の連番PNG画像として記録し続け、もう一度押す(「■ 録画停止」)まで止まりません。手動で対象アプリを操作しているときの記録にも、耐久テストの実行中の記録にも、その両方を跨いだ記録にも使えます。
録画を開始すると、対象ウィンドウがまず一度だけ最前面に表示されます。録画中に対象ウィンドウの位置やサイズが変わっても、そのまま追い続けます。録画ファイルは既定で ~/Pictures/EnduranceTestGUI_Screenshots/recording_<日時>/ 以下に frame_00001.png のような連番で保存されます。録画中に対象アプリが終了・クラッシュしてウィンドウが見つからなくなった場合は、安全に録画を停止します(アプリ自体がクラッシュすることはありません)。
~/Pictures/EnduranceTestGUI_Screenshots/ に戻せます(変更前に録画・保存済みの既存ファイルは移動されません)。保存先のディスクが一杯で録画やクラッシュ記録の保存に失敗する場合は、この機能で書き込み可能な別の場所に変更してください。
録画を停止すると、「この録画をアニメーションに変換しますか?」と確認が出ます。「はい」を選ぶか、あるいはログ欄の「録画をアニメーションに変換...」ボタンから過去の録画フォルダ(今回のセッション以外のものも含む)をいつでも選んで、変換用のダイアログを開けます。
変換ダイアログでは、出力形式とフレーム間隔(既定500ms)を選んでから「書き出す...」を押すと、保存先を選ぶダイアログに続いて進捗バー付きで変換が始まります(「キャンセル」でいつでも中断可能)。出力形式のGIFは常に選べます(外部ツール不要の自前実装)。MP4/WebMは、実行環境にffmpegがインストールされている場合のみ選択肢として有効になります(無い場合は選択肢がグレーアウトし、ヒント文言が表示されます)。録画中に対象ウィンドウのサイズが変わり、フレームごとに画像サイズが異なる場合でも、自動的に最大サイズへ余白を足してから変換するため、内容が欠けることはありません。
耐久テスト実行中のクリック・ドラッグ&ドロップは、録画フレーム上に自動的に印として描き込まれます。クリック/ダブルクリックは赤(右クリックは青)の波紋が広がりながら消えていく輪、ドラッグは開始点から終了点へのオレンジ色の矢印として、実際に操作した瞬間の前後しばらく表示されます。ランダムな自動操作がどこをどう操作したのか、後から書き出したアニメーションを見るだけで追えるようにするための機能です。
対象アプリのプロセスが消えたことを検知すると、テストは即座に停止し、次のようなダイアログが表示されます。
ダイアログとログには、どのステップの実行中に検知したか・それまでの実行回数・乱数シードが表示されます。同時に、その乱数シード付きのテスト設定(JSON)・操作領域のスクリーンショット・(有効なら)直近の画面録画・(見つかれば)OSのクラッシュダンプの場所が、自動的に既定で ~/Pictures/EnduranceTestGUI_Screenshots/ 以下へ保存されます(9章の「ファイル」メニューから保存先を変更している場合はそちらに保存されます)。
「ファイル」メニューの「テスト設定を保存...」で、①②で組んだ操作領域・ステップ構成・タイミング設定をまとめてJSONファイルに保存できます。「テスト設定を読み込む...」で読み込むと、保存時に対象にしていたアプリが現在も起動していれば自動的に選択されます(起動していない場合は手動での選び直しを促すメッセージが表示されます)。同じ構成を毎回作り直さずに、別の機会やビルドに対して使い回せます。
メニューバーの「言語 / Language」から「日本語」「English」を選べます。選択内容は保存され、次回起動時から反映されます(実行中の画面がその場で切り替わるわけではありません)。
対象ウィンドウが他のウィンドウに覆われていないか、最小化されていないか確認してください。それでも解決しない場合、環境(特にLinuxの一部のタイル型ウィンドウマネージャ)によっては、対象アプリを安全に操作できるかどうかを確認する仕組み自体が動作しないことがあります。
①の「更新」ボタンを押して一覧を再取得してください。通常のトップレベルウィンドウのみが一覧に表示されます。
これらの機能は実験的なもので、macOS/Linuxのアクセシビリティ機能に依存しています。Linuxでは対象アプリのツールキットがAT-SPIブリッジを有効にしている必要があります(GTK/Qtアプリは通常デフォルトで有効)。また、Linuxのデスクトップ環境自体がAT-SPIのD-Busセッションバスを提供していない場合(一部の最小構成環境など)も動作しません。
EnduranceTestGUI自体のソースコードは、GitHubリポジトリにて MIT License で公開されています(リポジトリ直下の LICENSE)。本アプリはQt(Widgetsモジュール)を使用しており、Qtのフリーソフトウェア版はGNU LGPL バージョン3(一部モジュールはGPL)の下で配布されています。使用しているQtが実際にどのライセンスで配布されているかは、アプリ内の「ヘルプ」→「Qtについて...」からいつでも確認できます。動的リンクしているその他のライブラリも含めた詳細は、リポジトリ直下の THIRD_PARTY_NOTICES.md を参照してください。
このセクションは、ソースコードから自分でビルドしたい開発者向けです。通常の利用者は読み飛ばして構いません。
Qt6 を先に探し、見つからなければ Qt5 にフォールバックします。以下は本体(EnduranceTestGUI)が対象アプリを操作するために使う低レベルなX11ライブラリで、開発用ヘッダ(-dev/-develパッケージ)が見つからないとCMakeの設定自体が失敗します。
Debian/Ubuntu系なら、例えば次のようなパッケージで揃います(パッケージ名は配布によって多少異なる場合があります)。
sudo apt install build-essential cmake qt6-base-dev libx11-dev libxtst-dev libxi-dev libxext-dev libglib2.0-dev
加えて、右クリックメニュー項目の自動選択やダイアログのボタン操作などの実験的機能は AT-SPI(atspi-2)ライブラリを使用します。これは必須ではなく、見つからない場合はビルド時に警告が出るだけでその機能が無効になった状態でビルドが続行されます。有効にしたい場合は、Debian/Ubuntuでは libatspi2.0-dev、Fedoraでは at-spi2-core-devel をインストールしてください。
ApplicationServices、Cocoa、Carbon の各フレームワークを使用しますが、いずれもOS標準で提供されているため別途インストールは不要です。Qtについては、Homebrew版(Intel/x86_64向けのみ)でもビルドできますが、Apple Silicon環境では Qt公式オンラインインストーラ(~/Qt 以下にインストールされるもの)で導入したQtの使用を推奨します。こちらはx86_64とarm64の両方を含むユニバーサルバイナリであり、Accessibility(アクセシビリティ)権限の認識がより安定するためです。ビルドされたEnduranceTestGUI.appは、ビルド後に自動的にアドホック署名(ad-hoc codesign)されます。これはAccessibility権限の管理を安定させるための措置で、Apple Developer Programへの登録や配布用証明書は不要です。
リポジトリ直下で次のように実行します。
cmake -B build -DCMAKE_BUILD_TYPE=Releasecmake --build build -j
同じ呼び出しで、検証用のテスト対象アプリ TestTarget(testtarget/以下、add_subdirectoryで組み込み)と、負荷生成用の補助プロセス loadstress_helper も自動的にビルドされます。別途ビルド手順を実行する必要はありません。ビルドが成功すると、buildディレクトリ(macOSではbuild内の.appバンドル)に各実行ファイルが生成されます。