2016/08/24更新

[フロントエンド] 表示速度の計測ができるWebPagetestを使って、毎日自動計測を行う

このエントリーをはてなブックマークに追加            

こんにちは、サイトパフォーマンスに取り組み中の@yoheiMuneです。
今日はWebPageTestというフロントエンドの表示計測ツールの紹介と、そのAPIを用いた自動計測についてブログを書きたいと思います。

画像

目次




WebPagetestとは

WebPagetestとはフロントエンドの初期表示の時間などを計測できるツールの1つで、以下のサイトから利用できます。

https://www.webpagetest.org/

個人的にはこのツールの以下の点が気に入っています。

  • 回線速度や端末エミュレートをしてくれる
  • 数値を細かく表示してくれる
  • 初期表示に必要なリクエスト一覧とその詳細が表示される
  • VisualCompletedという独自の1stViewの表示速度の指標がある
特にVisualCompletedという独自指標が、ユーザー視点に合っていていいなーと感じています(また、計測開始〜VisualCompletedまでのビデオキャプチャも見ることができます)。

使い方は簡単で、上記リンク先を開いて必要そうなところを入力して「START TEST」ボタンを押せば計測が開始します。以下はこのブログのトップページを計測した結果の例を貼り付けてみました。
ということで、詳細に結果を見ることができますので、ぜひ一度試してみてください〜。いろいろと学ぶことがあって楽しいですよ。



WebPagetestを自動的に実行する

さてここからが本題で、WebPagetestはRESTfulなAPIを提供していて、それを使うことで定期的に計測を行うことができます(仕事でパフォーマンスについて扱うときに調べていたら見つけた次第です)。

WebPagetestのドキュメントは以下にあり、 https://sites.google.com/a/webpagetest.org/docs/

RESTfulなAPIの説明は以下にあります。
https://sites.google.com/a/webpagetest.org/docs/advanced-features/webpagetest-restful-apis

ここでは備忘録も込めて、使い方をブログに残したいと思います。


APIキーを入手する

APIを利用するためにはAPIキーを入手する必要があり、その鍵をAPIのパラメータに設定する必要があります。以下より入手することができます。
https://www.webpagetest.org/getkey.php

入手の結果、以下のようなキーを入手できればOKです。
A.579e59b223742b70437111ecXXXXXXXX


APIを利用する(概要)

WebPagetestをAPI経由で利用する場合に、大きく分けて以下3つのAPIを利用します。
#01 Submitting test requests(テスト開始)
http://www.webpagetest.org/runtest.php

#02 Check test status(テストの終了をチェック)
http://www.webpagetest.org/testStatus.php

#03 Getting test results (テスト結果を取得)
https://www.webpagetest.org/jsonResult.php
それぞれについて詳細を書きたいと思います。実装についてはPythonを用いますが、それ以外の言語の方はそれように読み替えていただけたらと思います。


APIを利用する(テスト開始)

まずはテストを開始するためにAPIを実行します(ここでAPIキーを使います)。APIの説明(Submitting test requests)に合わせて、以下のように実装します。様々なパラメータが指定可能ですので詳細はAPIの説明をご覧ください。
import urllib.request
import urllib.parse
import json

# APIキー
API_KEY = "A.579e59b223742b70437111ecXXXXXXXX"

# 計測開始
url = "http://www.webpagetest.org/runtest.php"
params = {
    "url": target_url,
    "k": API_KEY,
    # レスポンスタイプをJSONに指定
    "f": "json",
    # Chromeを利用、3G回線をエミュレート
    "location": "Dulles:Chrome.3G",
    # モバイル表示を使用
    "mobile": 1,
    # モバイルデバイスはNexus5を使用
    "mobileDevice": "Nexus5",
    # 結果でビデオキャプチャを見れるように指定
    "video": 1
}
# リクエスト開始
url += "?" + urllib.parse.urlencode(params)
response_json = json.loads(urllib.request.urlopen(url).read().decode("utf-8"))

# 今後のAPIで利用するテストIDを取得
test_id = response_json["data"]["testId"]

# 結果を表示するURLを取得
result_url = response_json["data"]["jsonUrl"]
これでテストを開始することができました。次にこのテストが終了するまでをチェックします。


APIを利用する(テストの終了をチェック)

次にテストが終了状態になることを定期的にチェックします(WebPagetestの負荷によっては数分かかります)。APIの説明(Check test status)を詳細は参照ください。
import json
import time

# 計測終了をウォッチ
while True:
    # ちょっと待つ
    time.sleep(5)
    # テストの状態を取得する(ここでテストIDを使用する)
    url = "http://www.webpagetest.org/testStatus.php?f=json&test=" + test_id
    response_json = json.loads(urllib.request.urlopen(url).read().decode("utf-8"))
    status_code = int(response_json["statusCode"])
    # ステータスコードが200だと終了
    # ステータスコードが100番台の場合は、テスト中のステータス
    if status_code == 200:
        break
    # 400系はエラー
    elif status_code >= 400:
        raise Exception("ERROR!!! url=" + target_url)
こんな感じで処理が終わるのを待ちます。


APIを利用する(テスト結果を取得)

テストが終了したら結果を取得します。ここではテスト開始の時に取得したresult_urlを使います。
# テスト結果を取得する
url = result_url
response_json = json.loads(urllib.request.urlopen(url).read().decode("utf-8"))

# ここではVisualCompleteを取得しています
visual_complete_time = response_json["data"]["runs"]["1"]["firstView"]["visualComplete"]
print("visual_complete_time:", visual_complete_time)
レスポンスとしては非常に大きなJSONが帰ってきますので、その中から必要そうなものを取得します。



最後に

webPagetestを大規模に利用する場合はプライベートインスタンスも用意されていますが、今回のようにサクッと使う場合にはパブリックなものを使うといいですね。フロントエンド系の速度計測ツールは色々とありますが、自動実行できるあたりがWebPagetestは素敵です。もう少し触る予定なので、またノウハウをかけたらと思います。

最後になりますが本ブログでは、フロントエンド・開発関連・Swift・Linux・Python・Java・機械学習など雑多に情報発信をしていきます。自分の第2の脳にすべく、情報をブログに貯めています。気になった方は、本ブログのRSSTwitterをフォローして頂けると幸いです ^ ^。

最後までご覧頂きましてありがとうございました!





こんな記事もいかがですか?

[取り組み] フロントエンドでコーディングスピードをアップさせる6つの方法!と思って書いてたら30個も書いちゃった。
[フロントエンド] フロントエンドの入社試験99問!難しいですよ〜w。
[フロントエンド] Webページを表示するテストの際に、通信速度を3Gに制限して表示してみよう
[フロントエンド] スマホ実機でのデバッグ手段を増やす!Macのプロキシを利用して、通信内容を確認する。
[フロントエンド] Chrome 35 Beta の変更点。Touch制御、新しいJavaScript機能、プレフィックスなしのShadowDOM
[フロントエンド]複数アカウントでのテストには、Chromeのユーザー管理を使って、Cookieを切り替えると便利
[フロントエンド] Chrome36βが出た。変更点など。element.animate、HTML Imports、Object.observe、他。
RSS画像

もしご興味をお持ち頂けましたら、ぜひRSSへの登録をお願い致します。