SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

JavaScriptでテストを書こう!

JavaScriptでカバレッジを取得する

JavaScriptでテストを書こう! 第6回

他サーバにデプロイされたテストのカバレッジを取得する

 ここまでは、JSCoverをWebサーバとして使用してカバレッジを取得する方法を説明してきました。ただ、この方法だと、カバレッジを計測したいテストが別のWebサーバに置かれていたり、他サーバで動作している動的なページの場合はカバレッジを取得することができません。そこで、JSCoverをプロキシサーバとして使用する方法が用意されています。処理の流れは以下のとおりです。プロキシサーバとして介在することで、JavaScriptを自動的にカバレッジが取得できるコードに変換する処理や、jscoverage.htmlを表示する処理を行います。

図10 JSCoverをプロキシサーバとして使用する
図10 JSCoverをプロキシサーバとして使用する

サーバの起動

 ではサーバを起動します。--proxyオプションを付けるだけでプロキシサーバとして起動します。ここでは、プロキシサーバのポートを3128を指定しています。

リスト3 サーバの起動
cd d:sample
java -jar JSCover-all.jar -ws --proxy --port=3128 --report-dir=target

ブラウザのプロキシ設定

 次に、ブラウザでテストを実行する際、必ずJSCoverのプロキシサーバを介させるため、ブラウザに対してプロキシサーバの設定を行います。Internet Explorerでの設定は以下のとおりです。ここで示す例は、上記サーバの起動オプションでの設定です。読者の皆様の環境設定や起動時のポートの設定によって変わりますので、置き換えてください。

 ブラウザ右上の設定ボタン -> インターネットオプション -> 接続タブ -> LANの設定ボタンを押下

  • LANにプロキシサーバを使用するにチェック
  • アドレス:localhost
  • ポート:3128
図11 プロキシの設定
図11 プロキシの設定

テストの実行

 ではテストの実行を行ってみましょう。今回テストを動かす別サーバはJSCoverに用意されているWebサーバ機能を使ってみます。以下のコマンドを実行してみてください。

リスト4 サーバの起動
cd d:sample
java -cp JSCover-all.jar jscover.server.SimpleWebServer . 8080

 まず、以下のURLにアクセスしてみてください。テストが実行されることが確認できます。

http://localhost:8080/SpecRunner.html

 次に、以下のJavaScriptにアクセスしてみましょう。これはテスト対象のfizzbuzzのコードです。元々10数行の短いコードのはずですが、長いJavaScriptのコードが表示されます。これは、カバレッジが取得できるようなコードにプロキシサーバが変換していることを表しています。このコードをjscoverage.htmlの画面で実行することにより、カバレッジを取得することができるのです。

http://localhost:8080/js/fizzbuzz.js
リスト5 fizzbuzz.jsの元ソース
var fizzbuzz = function(n) {
  if (n % 3 === 0 && n % 5 === 0){
    return "Fizz,Buzz";
  }else if (n % 3 === 0){
    return "Fizz";
  }else if (n % 5 === 0){
    return "Buzz";
  }else{
    return n;
  }
}
リスト6 fizzbuzz.jsをJSCoverプロキシ経由で表示する
if (! window.jscoverage_report) {
  window.jscoverage_report = function jscoverage_report(dir) {
    var createRequest = function () {
      if (window.XMLHttpRequest) {
        return new XMLHttpRequest();

~省略~

  } else {
    _$jscoverage['/js/fizzbuzz.js'].lineData[4]++;
    if (visit374_4_1(n % 3 === 0)) {
      _$jscoverage['/js/fizzbuzz.js'].lineData[5]++;
      return "Fizz";
    } else {
      _$jscoverage['/js/fizzbuzz.js'].lineData[6]++;
      if (visit375_6_1(n % 5 === 0)) {
        _$jscoverage['/js/fizzbuzz.js'].lineData[7]++;
        return "Buzz";
      } else {
        _$jscoverage['/js/fizzbuzz.js'].lineData[9]++;
        return n;
      }
    }
  }
};

 次に、http://localhost:8080/jscoverage.htmlにアクセスしてみてください。指定しているドキュメントルートには、jscoverage.htmlが置いてないはずですが、jscoverage.htmlが表示されます。これは、jscoverage.htmlがアクセスされた場合、JSCoverのプロキシサーバが自動的にページを返しているためです。URL欄にhttp://localhost:8080/SpecRunner.htmlを指定するとテストが実行され、カバレッジが取得されます。

図12 テストの実行
図12 テストの実行

 この場合、テスト結果が前半と同じなので、分かりやすいように少し違う視点でも実行してみましょう。プロキシを行うことにより、別サーバのカバレッジを取得することができるので、CodeZineのページのカバレッジを取得してみます。CodeZineのページはテストがありませんので、ページ表示時に処理が行われたロジック(命令)が何パーセントかを取得する結果になります。http://codezine.jp/jscoverage.htmlにアクセスし、カバレッジ取得対象のURLを入力してみましょう。ここではhttp://codezine.jp/article/detail/7257のカバレッジを取得してみました。

図13 CodeZineページのカバレッジ取得
図13 CodeZineページのカバレッジ取得
図14 CodeZineページのカバレッジ
図14 CodeZineページのカバレッジ

 ここまでの説明で、jscoverage.htmlはテスト対象のページと同じドメインにしていることにお気づきでしょうか。これは、テストを新しいウィンドウかiframeで実行していますが、親ページとテスト実行結果のページのドメインが違うとクロスドメインのため、データのやり取りができず、親ページがカバレッジが収集できません。そこでわざわざプロキシサーバがどんなURLでもjscoverage.htmlを表示できるようにしています。

最後に

 今回は、JSCoverを使ってカバレッジの取得を行いました。次回は、JavaScriptでの継続的インテグレーションの方法を説明します。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
JavaScriptでテストを書こう!連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 安西剛(ヤスニシ ツヨシ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/8022 2014/09/19 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー