2017年5月31日水曜日

JavaScriptでメモリーリークを調査する

ちょっとした経緯で、JavaScriptにおけるメモリーリークを調べることとなりました。
C言語だとメモリーリークは分りやすいですが、JavaとかC#になるとガベージ・コレクションになるので、本来的にはメモリー管理から開放されるはずですが、そうでもないようです。
また、JavaとJavaScriptでも少し、ポイントが違いそうです。

ちょっとググってみて、こちらに当りました。
4 Types of Memory Leaks in JavaScript and How to Get Rid Of Them

JavaScriptだと、変数定義しなくても使えてしまいますが、そのあたりで、グローバルスコープになったりするようです。関数定義した場合も、うっかりで発生しがち。
GCなのにメモリーリークが発生する経緯にも触れられており、ポイントも4つに絞っているので、最初に読むには良い感じです。

AngularJSに特化していますが、次の記事も秀逸です。
Fixing Memory Leaks in AngularJS and other JavaScript Applications

jQuery含めた、他のライブラリーとの共用によるメモリーリーク発生のメカニズム等、こちらも分りやすく書かれています。デバッグ手法にも触れられており、参考になります。


こちらもケースが限られていますが、サーバーとの同期に関するメモリーリークがこちら。
Simple Server Polling in AngularJS Done Right

サーバーからのデータロードに失敗した場合のハンドリングを正しくしないと、メモリーリークが発生するという話です。


JavaScriptは手軽にコーディングでき、サードパーティーのライブラリーも充実しているだけに、C言語よりも遥かに問題特定に時間がかかる印象を受けました。
そう言えば、V4あたりのVisual Basicも、結局はSet XX = Nothingとしないとメモリー開放されなかったり、C言語の動きを理解していないといけなかったのを思い出しました。
プログラミングも、楽になったようで、環境が複雑になった分、いろいろと別の課題が出てきているようです。


具体的な デバッグはこれからですが、備忘録がてら、書いておきます。

2017年5月23日火曜日

JavaScriptをテストする

最近は、MEANだか何だかで(ってもうだいぶ経ちますね)、JavaScriptがいろいろと役に立つようです。node.jsだとサーバーサイドもJavaScriptで、JavaとJavaScriptの違いもようやく理解できてきました。

そんな中、JavaScriptってどうやってテストするのかな、JavaだとJUnitだったけど、、、と思い立ち、ちょっと調べてみました。

こちらには、各種言語の単体テスト用フレームワークが揃っていて、勉強になります。
List of unit testing frameworks


COBOLやFORTRAN、C/C++用のものもあって、便利な世の中になったなーと隔世の感があります(といっても、実業務では、過去の資産用に、リグレッションテスト用にテストスクリプトを用意する、なんてことは易々とはいかず、現実にはいろいろと苦労がありますが)。

JavaScriptは最近の言語なので、いくつも用意されていますね。サーバーサイドもJavaScriptの可能性があるので、クライアント/サーバー双方をカバーしているものが対象ですが、どれがよいか、迷ってしまいます。


こちらのサイトでは、そんな中、QUnit、YUI Test、JSTestDriverを取り上げていました。
JavaScript のユニット・テストを実行するためのツール

記事を読むと、QUnitは、jQuery開発チームでも利用されているようです。
node.jsでも使えるようなので、まずは選択候補でしょうか。
QUnit: A JavaScript Unit Testing framework.


YUI Testは、Yahooの提供するAPIのようで、インターネット接続環境が必要そう。

3つ目の、JSTestDriverは、複数ブラウザーでの動作確認が出来ます。ブラウザー対応確認にはちょうどよい感じです。

ググってみると、以下の記事に当りました。どうやら、Eclipse環境でJavaScriptをテストするのに使えるようです。
eclipseでJavaScriptの単体テストをする


あと、ちょっと変った記事としては、

JUnit(Java)でJavaScriptをテストする。


でしょうか。JUnitに慣れている方、JavaとJavaScript両方を同じ方式でテストするには、JUnitという選択肢もあるかもしれません。



個人的には特に縛りはないので、まずはQUnitあたりに手を出してみようかと思ったのですが、こんな記事も見つけてしまいました。
Testing the MEAN stack


Karmaってのが書いてあります。 JasmineやMochaにも言及しつつ、Karmaを薦めているようです。
AngularにはProtractorというEnd to Endのテストツールもあるようです。
Testing AngularJS With Protractor and Karma - Part 2

もう少し読み解いて、何が良いのか見極めたいのですが、とりあえず今日は備忘録がてらここまで。