web-dev-qa-db-ja.com

KarmaとPhantomjsでメモリエラーを回避する方法

karmaおよびphantomjsを使用してテストを実行しています。先週、私たちのテストは-1073741819のエラーでphantomJSを異常にクラッシュさせ始めました。

Chutzpahのこのスレッドに基づく コードはPhantomJSでのネイティブメモリ障害を示しているようです。

さらに調査したところ、750MB前後のメモリのファントムクラッシュが常に発生しています。

Karmaがこの制限に対して実行されないように構成する方法はありますか?または、ファントムをフラッシュするように指示する方法は?

今のところ、テストは約1200しかありません。プロジェクト全体の約1/4なので、5000のUIテストは問題から外れていないようです。

20
taylonr

StackOverflowの現象である質問を投稿して回答をすばやく見つけるというおかげで、gulpタスクを追加することでこれを解決しました。実行する前にkarma startコマンドラインで。これにより、750MBに達するとクラッシュするphantomjsの単一インスタンスがスピンアップしました。

これで、テストのセクションごとにgulpコマンドがあります。 gulp common-testsおよびgulp admin-testsおよびgulp customer-tests

次に、単一のgulp karmaこれらのグループのそれぞれを実行します。これにより、各gulpコマンドは独自のファントムのインスタンスを持つことができるため、そのしきい値を下回ることができます。

9
taylonr

私たちは同様の問題に遭遇しました。あなたのアプローチは興味深く、確かに問題を回避します。ただし、後で再び直面する準備をしてください。

私はいくつかの調査を行い、メモリの増加の原因を発見しました(少なくとも私たちの場合)。あなたが使用するときに判明:

   beforeEach(inject(SomeActualService)){ .... }

someActualServiceが使用するメモリは、describeブロックの最後に解放されません。同じサービス(または他の挿入可能なオブジェクト)を挿入するテストファイルが複数ある場合は、さらに多くのメモリが割り当てられます。

これを回避する方法については、いくつかのアイデアがあります。1。モックオブジェクトを作成し、そのモジュールをテストするテストに参加している場合を除き、インジェクトを使用して実際のオブジェクトを取得しないでください。これには大量の追加コードを書く必要があります。 2.注入可能なオブジェクト用の独自のトラッカー(テストのみ)を作成します。そうすれば、1回だけロードして、テストファイル間で再利用できます。

言及を忘れました:angular 1.3.2、Jasmine 2.0を使用しており、約1000のテストでこの問題にヒットしました。

8
Simon N

PhantomJS 1.9.18 を使用してWindows 10で約1037のテストを行った後も、この問題が発生していました。

プロセスのRAMが約800〜850 MBを超えると、ERROR [launcher]: PhantomJS crashed.として表示されます。

ここに一時的な修正があるようです:

npm install karma-phantomjs2-launcher --save-devからインストールします

ただし、それをkarma.conf.jsで使用する必要があります

config.set({
    browsers: ['PhantomJS2'],
    ...
});

これは、250〜550 MB RAMを使用し、クラッシュすることなく、同じテストセットを実行するようです。

この修正はWindowsとOS Xではそのまま動作しますが、Linuxでは動作しません(PhantomJS2バイナリは起動しません)。これはTravis CIへのプッシュに影響します。

Debian/Ubuntuでこの問題を回避するには:

Sudo apt-get install libicu52 libjpeg8 libfontconfig libwebp5

7
Splaktar

これはPhantomJSの問題です。 別のソース によると、PhantomJSはページが閉じられたときにのみガベージコレクターを実行し、これはテストの実行後にのみ発生します。他のブラウザーは、ガベージコレクターが期待どおりに動作するため、正常に動作します。

この問題に数日費やした後、テストをグループに分割することが最善の解決策であると結論付けました。各ディレクトリのプロファイルを動的に作成し、それらすべてのプロファイルを実行するコマンドを作成しました。すべての意図と目的のために、それはまったく同じように動作します。

5

Linux(ubuntu)でも同様の問題があり、プロセスが管理できるメモリセグメントの量であることが判明しました。

$ cat /proc/sys/vm/max_map_count
65530

次に、これを実行します。

$ Sudo bash -c 'echo 6553000 > /proc/sys/vm/max_map_count'

数が100倍されたことに注意してください。これにより、セッション設定が変更されます。それで問題が解決した場合は、今後のすべてのセッションで設定できます。

$ Sudo bash -c 'echo vm.max_map_count = 6553000 > /etc/sysctl.d/60-max_map_count.conf'
2
Elad Tabak

古い質問に答えるが、うまくいけばこれは...

コマンドラインのみのLinuxボックスでCIジョブを実行するビルドプロセスがあります。したがって、PhantomJSが私の唯一の選択肢のようです。 Macでこのメモリの問題がローカルで発生しましたが、Linuxボックスではどういうわけか発生しません。私の解決策は、package.jsonに別のテストコマンドを追加して、Chromeを使用してカルマを実行し、それをローカルで実行してテストを実行することでした。 Jenkinsはプッシュアップされると、通常のテストコマンドを開始し、PhantomJSを実行します。

このプラグインをインストールします: https://github.com/karma-runner/karma-chrome-launcher

これをpackage.jsonに追加

"test": "karma start", "test:chrome": "karma start --browsers Chrome"

0
cgsd