問題タブ [spectron]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
node.js - 不明なエラー: Chrome の起動に失敗しました: mocha で電子スペクトロンをテストしようとすると異常終了しました
私は電子スペクトル検査をテストしようとしています。私のプロジェクトは非常にシンプルです。electron クイック スタート リポジトリのクローンを作成し、 electron-userland/spectronの readme ファイルから記述されたように、spec.js にコードを記述します。
しかし、npm テストを実行すると、次のエラーに直面します。
以前、mocha と spectron を再インストールしようとしましたが、同じ結果が返されました。
私のdevDependencies:
私のOS情報:
私はnodejs v12.18.4を使用しています
ここで私のelectronテストプロジェクトを複製できます:electron-example
memory-leaks - mocha を使用してテストを実行すると、メモリ リークと大きな文字列構造が発生します
アプリケーションでメモリ リークを検出するための環境をセットアップしようとしています。
アプリのセットアップ: Angular + Electron
アプリの使用をシミュレート: Mocha + Spectron + Webdriverio
新しくセットアップしたアプリで実行し、各プロセスのメモリ使用量を定期的に収集するさまざまなユーザー シナリオのテストがあります。
アプリがアイドル状態の場合、メモリ使用量は予想どおりです。しかし、他のテスト ケースで問題が発生しました。mocha を使用してテストを実行すると、予期しない未知の構造がメモリに表示されるようです。その結果、メモリ リークが発生します。
以下にスクリーンショットを添付しました (開発ツールの [メモリ] タブ)。これが私の混乱を最もよく表しています。
- スナップショット 1: アプリのセットアップ後に撮影 ( 81.8 MB )
- スナップショット 2: テストのグループが完了し (通常の使用で ~ 10 分)、アプリが開始状態に戻った後に取得 ( 109 MB )
- スナップショット 3: (「ガベージを収集」ボタンを使用して) GC を強制した後に取得 ( 108 MB )
スナップショット 1 と 2 を比較すると、メモリの大部分 (~19 MB) が文字列内にあることがわかります。
リテイナーを調べると、これらの文字列が (グローバル ハンドラー)>(GC ルート) にリンクされていることがわかります。文字列の 1 つを選択$0
してコンソールで実行すると、すべての文字列に対して同じ出力が得られます: <body>...</body>
. 要素にカーソルを合わせると、アプリの本体にリンクされます (すべての文字列に対して)。
「文字列構造の拡張」は、一部のモジュールが複数回ロードされ、その参照が決して破棄されないことが原因であると感じます (私の推測では、Module()
inを介してロードされinternal/modules/cjs/loader.js:136
ます)。
「割り当てタイムライン」でメモリを調べると、「ヒープ スナップショット > 比較」の下に新しい「大きな文字列オブジェクト」が表示される同じアクションで、解放されていないメモリの下にこの「大きな文字列オブジェクト」が見つかりません。
テスト シナリオを手動でシミュレートするか、コンソールで関数を介してクリックをシミュレートすると、メモリ リークは発生しません。
そのすべてが私に考えさせます、私は何か間違ったことをしている、または使用しています(モカに関して)。
私の質問:
- mocha はこの種の設定には適していません (つまり、アプリが閉じられるまでいくつかの参照を保持します)?
- (グローバル ハンドラー) > (GC ルート) によってのみ構造が保持されている場合、いつ解放されますか? 私はここで、それらはあなたが心配する必要があるものではないことを読みましたが、私の場合、それらは:/
- 複数の文字列 (複数の参照) があり、 を介して呼び出されたときに
$0
、すべてが同じ DOM 要素 (<body>
) を参照するのはなぜですか? - この文字列オブジェクトが「割り当てタイムライン」に表示されないのはなぜですか?
- このタイプのメモリリークの原因は何ですか?