コンテンツへスキップ

Pitaliumで画面遷移してからスクリーンショットを撮影する

Pitaliumで画面遷移してからスクリーンショットを撮影する

PitaliumはSeleniumをベースにしていますので、クリックイベントを使って画面遷移をしたり、フォームにデータをポストすることができます。

通常の画面遷移であれば次のように処理を書きます。

import org.junit.Test;
import org.openqa.selenium.WebElement;
 
import com.htmlhifive.pitalium.core.PtlTestBase;
 
public class SampleTest extends PtlTestBase {
 
    @Test
    public void testClickAndCapture() throws Exception {
        // 1. hifiveサイトのトップページを開きます
        driver.get(“https://www.htmlhifive.com/“);
 
        // 2. hifiveサイトのトップページのスクリーンショットを撮影します。
        assertionView.assertView(“OpenhifiveTopPage”);
 
        // 3. “過去のお知らせ一覧” ボタン要素を取得してクリックします。
        WebElement infoHistoryButton = driver.findElementByCssSelector(“#news a.btn”);
        infoHistoryButton.click();
 
        // 4. ページ遷移後のスクリーンショットを撮影します。
        assertionView.assertView(“OpenNewsListPage”);
    }
 
}

クリックされるDOM(#news a.btn)を取得し、そのクリックイベントを実行します。

フォームへのポストの場合、次のように記述します。

import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
 
import com.htmlhifive.pitalium.core.PtlTestBase;
 
public class SampleTest extends PtlTestBase {
 
    @Test
    public void testInputAndSubmitAndCapture() throws Exception {
        // 1. hifiveサイトのトップページを開きます
        driver.get(“https://www.htmlhifive.com/“);
 
        // 2. hifiveサイトのトップページのスクリーンショットを撮影します。
        assertionView.assertView(“OpenTopPage”);
 
        // 3. 画面右上の検索ボックスに入力して、サイト検索を実行します。
        WebElement form = driver.findElementByCssSelector(“#globallinks form”);
        WebElement searchBox = form.findElement(By.id(“headerglobalsearchinput”));
        searchBox.sendKeys(“test search”);
        form.submit();
 
        // 4. ページ遷移後のスクリーンショットを撮影します。
        assertionView.assertView(“OpenSearchResultPage”);
    }
 
}

これはAjaxでも同じように行うことができます。

import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
 
import com.htmlhifive.pitalium.core.PtlTestBase;
import com.htmlhifive.pitalium.core.selenium.PtlWebDriverWait;
 
public class PtlSampleTest extends PtlTestBase {
 
    @Test
    public void testExclude() throws Exception {
        // 1. hifiveサイトのトップページを開きます
        driver.get(“http://www.htmlhifive.com/ja/tutorial/todo/“);
        PtlWebDriverWait wait = new PtlWebDriverWait(driver, 30);
        // ロードするまで待つ 
        wait.untilLoad();
 
        // 2. hifiveサイトのトップページのスクリーンショットを撮影します。
        assertionView.assertView(“OpenTopPage”);
 
        // 3. 画面上のテキストボックスにタスクを入力します
        WebElement form = driver.findElementByCssSelector(“#todoRegForm”);
        WebElement searchBox = form.findElement(By.id(“txtTodo”));
        searchBox.sendKeys(“テスト”);
        form.submit();
        wait.untilLoad();
 
        // 4. タスク登録後の画面をスクリーンショットに残します。
        assertionView.assertView(“AddTaskDonePage”);
    }
 
}

Seleniumの知識があれば、テストは自由に何度も繰り返しできるようになります。ぜひやり方を覚えてPitaliumと合わせて使ってみてください。

Pitalium(hifiveリグレッションテストライブラリ) – hifive

Pitaliumで特定のDOMを指定/除外してテストを実行する

画面のテスト(リグレッションテスト)を行う上で、画面上の特定の部分についてテストを行いたかったり、逆にテストから省きたいと思うことがあるでしょう。そんな時のためのテクニックを紹介します。

特定のDOMだけターゲットにする

特定のDOMをターゲットとする場合はCompareTargetを使います。下記はその一例で、 #about をターゲットとした場合のコードです。

import java.util.ArrayList;
import java.util.List;
 
import org.junit.Test;
 
import com.htmlhifive.pitalium.core.PtlTestBase;
import com.htmlhifive.pitalium.core.model.CompareTarget;
import com.htmlhifive.pitalium.core.model.ScreenArea;
import com.htmlhifive.pitalium.core.model.SelectorType;
 
public class SampleTest extends PtlTestBase {
 
    @Test
public void testCompareTarget_ID() throws Exception {
// 1. hifiveサイトのトップページを開きます。
driver.get(“https://www.htmlhifive.com/”);// 2. ID: aboutの比較対象をScreenshotArgumentBuilderで作成します。
ScreenshotArgument arg = ScreenshotArgument.builder(“TopPageAbout”)
.addNewTarget(SelectorType.ID, “about”)
.build();

// 3. 検証を実行します。
assertionView.assertView(arg);
}

 
}

SelectorType.IDとなっていますが、これはSelenium APIのByと同じ指定ができます。そのためCLASS_NAMEやCSS_SELECTOR、TAG_NAME、XPATHなども利用できます。

このテストを実行すると、下のような画像が生成され、Webページの一部のDOMだけをターゲットとした比較ができます。

特定のDOMを除外してテストする

逆にDOMを除外する場合としては、タイミングによって違う文字を出すものであったり(カウンターなど)、スクロール時に表示されるBack to Topなどが考えられます。

コードは次のようになります。excludesとしてDOMの場所を指定し、それをCompareTargetで指定しています。

import java.util.Arrays;
import java.util.List;
 
import org.junit.Test;
 
import com.htmlhifive.pitalium.core.PtlTestBase;
import com.htmlhifive.pitalium.core.model.CompareTarget;
import com.htmlhifive.pitalium.core.model.ScreenArea;
import com.htmlhifive.pitalium.core.model.SelectorType;
 
public class SampleTest extends PtlTestBase {
 
    @Test
    public void testExclude() throws Exception {
        // 1. hifiveサイトのトップページを開きます。
        driver.get(“https://www.htmlhifive.com/“);
 
        // 2. 画面全体のスクリーンショットを撮影する設定を作成します。
        //    ただし、画面上部の「Facebook いいね」ウィジェットを除外します。
        ScreenshotArgument arg = ScreenshotArgument.builder(“TopPageExcludeFBLike”)
.addNewTarget()
.addExclude(SelectorType.ID, “fb_share”)
.build();
 
        // 3. スクリーンショットを撮影します(比較を実行します)
        assertionView.assertView(arg);
    }
 
}

画面周りの動きは複雑で、カルーセルのような動きやAjaxによる操作など多数存在します。Pitaliumを使って柔軟なテストケースを作成してください。

Bootstrapの画面を手軽に作れるツールまとめ

業務システムの画面やWebサービスの管理画面にBootstrapを採用するケースが増えていますが、それでもBootstrapならではの書き方を覚えないといけません。バージョンが上がるごとに書き方が変わるので習得が面倒と感じる人も多いでしょう。

そこで使ってみたいのがBootstrap用のUIビルダーです。ドラッグ&ドロップで画面が設計できれば作成も簡単ですよね。

lollytin beta 1.4 – A yummy HTML5 blockouterer!

Bootstrapのデザインをドラッグ&ドロップで作っていくのですが、見た目はデフォルメされています。その分、細かいところにこだわりすぎずにさくさくと作っていくことができます。

Pingendo – web authoring with comfort

PingendoはBootstrap専用のオーサリングソフトウェアです。Mac OSX/Windows/Linux用が用意されています。細かいプロパティ含めてカスタマイズできます。

Jetstrap – The Bootstrap Interface Builder

部品をドラッグ&ドロップしつつ、テキストなども編集できます。プロパティを変更してIDやクラスを追加したり、サイズを変更することもできます。

BootTheme : Web Designer and Theme Generator for Twitter Bootstrap

細かなプロパティは編集できませんが、プレビュー画面でスマートフォン、タブレット、デスクトップのそれぞれの表示状態を確認できます。部品はすべてドラッグ&ドロップで変更できます。

LayoutIt! – Interface Builder for Bootstrap

色などが変えられる訳ではありませんが、メニューバーをウィンドウ上部に張り付かせるような設定も簡単にできます。BootstrapのTipsが手軽に実現できるツールになっています。

Bootstrap Editor and Playground for JavaScript, CSS, HTML5 and jQuery.

機能が多い分、若干画面がごちゃっとした印象を受けそうです。テンプレートがあらかじめ数多く用意されており、そこから選択した後はHTMLやCSSを直に修正しながらリアルタイムに反映された内容を確認します。

Bootstrap Builder – Brix.io – Premium Interface Builder.

右側に表示されているコンポーネントをドラッグ&ドロップで配置して画面を作っていきます。画像の差し替えもできるので、より本格的な画面を作成できます。

Pinegrow Web Editor | Website Builder for Professionals

Mac OSX/Windows/Linux用のソフトウェアで、Bootstrapをサポートしたオーサリングツールと言った感があります。他にもFoundation、AngularJS、WordPressに対応しています。


基本的にUIはドラッグ&ドロップでできますが、細かなプロパティを編集できるかどうかや、そのままサイトとして使えるレベルまで仕上がるかはサービスによって異なるようです。また、ローカルアプリケーションならば一度ダウンロードしてしまえば今後のサービス運営に不安はないでしょう(この手のサービスは突然閉鎖してしまうことも多いようです)。

Bootstrapを活用していくためにもこの手のサービスはぜひ知っておきたいですね。

Pitaliumで複数ブラウザのテストを行う

Pitaliumを使えば複数のブラウザで一気にスクリーンショットを使ったテストが実行できます。

例えばMac OSXのChrome/Safari/Firefoxでテストを行いたい場合、次のように src/main/resources/capabilities.json に定義します。

[
    {
        "platform": "MAC",
        "os": "OS X",
        "browserName": "safari"
    },
    {
        "platform": "MAC",
        "os": "OS X",
        "browserName": "firefox"
    },
    {
        "platform": "MAC",
        "os": "OS X",
        "browserName": "chrome"
    }
]

なお、Chromeの操作を行う場合はchromedriver、Safariの場合はSafari用のWebDriverが必要になります。Firefoxは必要ありません。

このように定義すれば、後はテストを実行するだけで3つのブラウザでそれぞれテストを実行してくれます。なお、後からブラウザを追加する場合、RUN_TESTでは正とする画像がないために処理が失敗することがあります。その場合は一旦テストを SET_EXPECTED にて実行し、正とする画像を取得してください。

PitaliumではSelenium Gridを使っていますので、Hubになるサーバにクライアントが接続しています。そのためIEやAndroid、iOSなども接続してテストが可能です。

チュートリアル(Pitalium:hifiveリグレッションテストライブラリ) – hifive

最近のフロント系ビルドツールまとめ

フロントエンドのタスクランナーが脚光を浴びています。 おもなツールの特徴と、簡単に使い方をまとめてみました。

ファイル監視 ファイル監視 プロジェクト
テンプレート
local server
Grunt ×
Gulp ×
Mimosa
Brunch
Angus
Lineman.js
Middleman

JavaScriptタスクランナーを広めた Grunt

grulnt
grulnt

GruntはRuby製のGuardに影響を受けて、後のタスクランナーに影響を与えました。

grantの設定ファイルは、初期化部分と実行タスクに別れ、それが故にコードが大きくなると可読性&メンテナンス性が悪くなると言う弊害があります。しかし、タスクの責任範囲が明確になっているので、大きなプロジェクトでは各担当の管理部分がわかりやすいというメリットがあります。

1. グローバルにgruntのCLIパッケージをインストールします。

$ npm install -g grunt-cli

2. プロジェクトのディレクトリに移動し、npmコマンドでpackage.jsonを生成します。

$ npm init

2. gruntのパッケージをインストールします。

$ npm install grunt-contrib -save-dev

3. gruntの設定ファイルを「Gruntfile.js」として作成します。

module.exports = function(grunt) {
  //Gruntの設定
  grunt.initConfig({
    pkg: grunt.file.readJSON('package.json')
  });
  // A very basic default task.
  grunt.registerTask('default', 'Log some stuff.', function() {
    grunt.log.write('Logging some stuff...').ok();
  });
};

4. gruntを実行します。

$ grunt

もはやデファクト Gulp.js

gulp
gulp

gulp.jsは、並列タスク処理が可能(もちろん、順次タスク処理も可能)でパワフルなタスクランナーです。 学習コストも低いとありますが、多くのプロジェクトでは、並列タスクと順次タスクを組み合わせることが殆どだと思いますので、その際のタスクファイルを作成するには多少の学習コストがかかると思います。とはいえ、プラグインや設定ファイルのテンプレート開発も活発であり、その組み合わせは多彩でポテンシャルの高さを感じさせる素晴らしいタスクランナーです。

1. グローバルにgulpをインストールします。

$ npm install --global gulp

2. プロジェクトディレクトリに移動して、gulpをインストールします。

$ npm install --save-dev gulp

3. gulpのスクリプトを「gulpfile.js」として作成します。

var gulp = require('gulp');

gulp.task('default', function() {
  // デフォルトタスクを配置
});

4. gulpを実行します

$ gulp

設定より規約主義の Mimosa

mimosa
mimosa

Mimosaはディレクトリ名などを明示的な規約として、基本的な設定ファイルを記述することなく、タスクを実行する事に主眼を置いたタスクランナーです。 これにより、複雑になりがちな設定ファイルを作成すること無く、開発に集中することが出来るメリットがあります。 また、MimosaはCLIのプロンプトによる選択操作で、簡単にスタートアップビルドを生成することが可能です。

まずは、その生成コードを確認することで、概ねの構造も確認出来ると思います。ほとんど学習コストが必要がありませんが、拡張機能なども用意されており、ドキュメントもしっかり構成されていますので大変期待の持てるタスクランナーではないかと思います。

mimosa インストール&セットアップ

1. グローバルにmimosaをインストールします。

$ npm install -g mimosa

2. 新規アプリケーションを作成します。

$ mimosa new nameOfApplicationHere

ここでは、割愛しますが、このあと、JavaScript、CSSなどの確認を行うコマンドプロンプトの選択が始まります。

3. buildします

$ mimosa build

4. サーバを開始します。

$ mimosa watch --server

同時に、コード監視もスタートします。

Brunch

Brunch
Brunch

BrunchはGruntとほぼ同時期に開発がスタートした、パイプライン型のタスクランナーです。 差分による再構築のため、速度的に優れているのが最大の特徴でしょう。 また、規約型のタスクランナーでもあるので、初期導入コストは非常に低いと思います。

もう一点、特徴的なのは、スタートアップ時のSkeltonが用意されている事でしょう。 こちらのSkeltonサイトを見ると、主要な技術はカバーしているようです。

1.グローバルにbrunchをインストールします。

$ npm install -g brunch

2.Skeltonから、新規アプリケーションを作成します。

ここでは、Skeltonから、brunch-with-brunchを選択しました。

$ brunch new gh:monokrome/brunch-with-brunch brunch-test

3.サーバを開始します。

$ cd brunch-test
$ brunch watch --server

これで、サーバが立ち上がります。以下がデフォルトのアクセスURLです。

http://localhost:3333

Brunchもライブリロード機能が存在しますので、編集が行われるとサイトに即時反映されます。

Angus

Angus
Angus

Angusは規約に沿って設定ファイルを作成することで、開発の負担を減らすのと同時に設定ファイルの複雑さを押さえることで、メンテナンス性が良くなっています。 解説のスライドもあります。

スライド

1.グローバルにangusをインストールします。

$ npm install -g angus

2.新規アプリケーションを作成します。

$ angus create my-app

3.サーバを開始します。

$ angus dev

これで、サーバが立ち上がります。以下がデフォルトのアクセスURLです。

http://localhost:9000

ライブリロード機能もありますので、編集が掛かるとサイトが即時反映されます。また、angus prodのコマンドで、Minifyやファイル関連の本番化が行えます。

Gruntなどタスクランナーをラップした Lineman.js

Lineman.js
Lineman.js

LinemanはGrunt、ExpressやTestemなどを薄くラップしたツールとなっています。 デフォルトでプロジェクトのひな形を構築してから、サーバ起動やテストまでを行えます。 タスクランナーとしてGruntを軸に規約ベースで連携しますので、Gruntを利用していた方は非常に使い勝手がよいのではないでしょうか。

1. グローバルにlinemanをインストールします。

$ npm install -g lineman

2. 新規アプリケーションを作成します。

$ lineman new your-project

これで、各ディレクトリや最低限必要なファイルが作成されます。

3. buildします

$ lineman build

4. サーバを開始します。

$ lineman run

これで、サーバが立ち上がります。以下がアクセスURLです。

http://localhost:8000

静的サイトジェネレータ Middleman

Middleman
Middleman

Ruby製のタスクランナーです。利用には、ruby gemが必要になります。
こちらも初期開発からテスト、デプロイまでをカバーしています。
Rubyによる拡張も可能で、Rubyプロジェクトには相性が良さそうです。

1. middlemanをインストールします。

$ gem install middleman

2. 新規アプリケーションを作成します。

$ middleman init my_new_project

Web開発向けのスケルトンが作成されます。

3. buildします

$ lineman build

4. サーバを開始します。

$ bundle exec middleman server

これで、サーバが立ち上がります。以下がアクセスURLです。

http://localhost:4567/

5. ライブリロード機能

config.rb を開いて次の行を追加すると、ライブリロード機能が利用出来ます。

activate :livereload

これにより、サーバが自動的にリロードされます。

まとめ

如何でしたでしょうか?今後も、WEBフロントエンド開発においては、さらに効率を求めたタスクランナーが出現するかもしれません。

ただ、一過性の流行廃りで選択するのではなく、開発現場において最適なツールを見極めてください。そんなツール選定で参考にしてみてください。

Pitaliumのテストが失敗してからのフローについて

画面のデザインが修正されたり、文言が変更されるとPitaliumのテストが失敗します。

この後のフローですが、まずPitalium Explorerを使って差分をチェックします。

この差分をチェックして、問題があればシステムを修正します。問題がなければ、新しい画面を正しい表示として確定する作業が必要です。

src/main/resources/environmentConfig.json を開いて、execModeをSET_EXPECTEDに変更します。

そしてエラーが発生したテストだけを再実行します。

これでテスト時における期待値のデータが更新され、次回以降テストが成功するようになります。


デザインは度々修正されるのでシステム上の問題はなくともPitaliumのテストが失敗するのは多々あるかと思います。そんな時にはこの手順を踏んでスクリーンショットを更新してください。

Pitaliumのテスト結果を閲覧するPitalium Explorerの紹介

Pitaliumはスクリーンショットを画像として保存しています。それをエクスプローラーやFinder上で確認するのですが、実際テストでどこが引っかかったなどはよく見ないと分かりづらいケースもあったでしょう。

そこで今回作成したPitalium Explorerを紹介します。Pitalium Explorerを使えばWebブラウザ上でテスト結果の確認、比較が簡単にできるようになります。

09.Pitalium Explorerを使用してテスト結果を確認する – hifive

Pitalium ExplorerはPitaliumに同梱されており、pitalium-explorer.warというファイルになります。これをTomcatのwebappsフォルダの中に入れます。そして、解凍されたら WEB-INF/classes/persisterConfig.json を編集します。

$ cat /usr/local/Cellar/tomcat/8.0.26/libexec/webapps/pitalium-explorer/WEB-INF/classes/persisterConfig.json
{
    "file": {
        "resultDirectory": "/path_to_/pitalium-sample/results"
    }
}

この resultDirectory の値をPitaliumのテスト結果が入っているresultsフォルダのパスに設定します。Tomcatは一度再起動します。

これで準備は完了です。

Pitalium Explorerにアクセスする

ローカルに立てた場合、 http:localhost:8080/pitalium-explorer/list.html にアクセスします。

そしてテスト結果を選んでクリックします。そうするとテストクラスとテストメソッドが一覧表示されます。

詳細を確認します。左側のツリーでテストを切り替えられます。

別なテストを選んで差分の確認もできます。

ずれている場合、こんな感じで差分が確認できます。他にも比較のモードが幾つか用意されています。

異なるDOMが赤枠で表示されています。


Pitalium Explorerの詳しい使い方はこちらをご覧ください。差分がビジュアル的に確認できるようになったことで、テストがより進めやすくなったかと思います。ぜひお使いください!

HTML5上でIoTをする時にはMQTT over WebSocketを使おう

IoT機器とHTML5を融合させればWebブラウザの画面上からIoTデバイスを操作したり、IoTからあがってくる数値をリアルタイムにレンダリングしたりすることができます。HTML5の新しい可能性が見えてくる気がしないでしょうか。

IoT機器が使うプロトコルとして注目されているのがMQTTです。最小ヘッダサイズが2byteという小ささでネットワーク帯域を浪費しないこと、相互通信が可能な仕組みがあることからIoT分野において知っておきたいプロトコルです。

そんなMQTTなのですが、PubSub型であることやTCP上に流れるとあって、WebSocketに似たような仕組みとなっています。そこで作られているのがMQTT over WebSocketで、MQTTとWebSocketを相互通信できる仕組みになります。

今回はMQTT over WebSocketに対応したMowsを使って手軽にMQTTとWebSocketを体験してみたいと思います。

Mowsのインストール

まず前提条件としてnode.jsを使うこととします。適当なフォルダを作成して、そこをプロジェクトフォルダとします。

$ mkdir mows-test
$ cd mows-test
$ npm init

初期化が終わったらMowsをインストールします。

$ npm install mows --save

サーバの立ち上げ

インストールしたら、mowsのフォルダにいきます。

$ cd node_modules/mosca/examples/ws/

そしてWebサーバを立ち上げます。

$ ./start.sh
$ ./start.sh 
       +++.+++:   ,+++    +++;   '+++    +++. 
      ++.+++.++   ++.++  ++,'+  `+',++  ++,++ 
      +`  +,  +: .+  .+  +;  +; '+  '+  +`  +` 
      +`  +.  +: ,+  `+  ++  +; '+  ;+  +   +. 
      +`  +.  +: ,+  `+   +'    '+      +   +. 
      +`  +.  +: ,+  `+   :+.   '+      +++++. 
      +`  +.  +: ,+  `+    ++   '+      +++++. 
      +`  +.  +: ,+  `+     ++  '+      +   +. 
      +`  +.  +: ,+  `+  +:  +: '+  ;+  +   +. 
      +`  +.  +: .+  .+  +;  +; '+  '+  +   +. 
      +`  +.  +:  ++;++  ++'++   ++'+'  +   +. 
      +`  +.  +:   +++    +++.   ,++'   +   +. 
[2015-09-25T08:32:51.703Z]  INFO: mosca/17687 on MacBook-Pro.local: server started (mqtt=1883, http=3000)

これで準備は完了です。ログを見て分かる通り、HTTPサーバが3000番、MQTTサーバが1883番で立ち上がっています。

Webブラウザで開いてみる

まず一つ目のブラウザで http://localhost:3000/ を開いてみます。この時点でWebSocketを通してMQTTサーバに接続しています。表示するとアラートが出るはずです。

コード(index.html)を見てみると次のようになっています。

var client = mqtt.connect();

client.subscribe("mqtt/demo");

client.on("message", function(topic, payload) {
  alert([topic, payload].join(": "));
});

client.publish("mqtt/demo", "hello world!");

var client = mqtt.connect(); はMQTTサーバへの接続処理になります。次の client.subscribe("mqtt/demo"); で購読するトピック"mqtt/demo"を指定してます。これ以外のトピックでメッセージがきても処理は行われません。

そして指定したトピックでメッセージが来た時の処理が次の行になります。

client.on("message", function(topic, payload) {
  alert([topic, payload].join(": "));
});

逆にメッセージの送信は client.publish("mqtt/demo", "hello world!"); にて行います。

複数のタブでブラウザを開くと、すべてのタブ宛にメッセージが届くはずです。

コンソールからメッセージを送ってみる

ここまでではWebSocketと同じですので、次はCLIからメッセージを送ってみます。その際にはmqttをインストールします。

$ npm install mqtt -g

そしてmqttコマンドを使ってメッセージを送信します。

$ mqtt pub -t 'mqtt/demo' -h 'localhost' -m 'from MQTT.js'

これもブラウザに受信されます。

逆に購読側になった場合、ブラウザからメッセージを送ればコンソールにメッセージが流れます。

$ mqtt sub -t 'mqtt/demo' -h 'localhost'
hello world!

まとめ

MQTT over WebSocketを使うことでWebブラウザでもMQTTを使って双方向性のあるデータのやりとりが可能になります。後はMQTTが使えるプログラミング言語を使って開発を行えば二つのシステムを連携するのも簡単です。

HTML5でIoTをぜひ試してみてください。

画面の表示に時間がかかる場合の調査方法

Webサイトの表示に時間がかかる場合は幾つかの原因が考えられます。最も大きなところとしては

  1. ネットワーク
  2. HTMLレンダリング

でしょう。各ブラウザでは次のようにチェックします。

Google Chromeの場合

NetworkとTimelineタブを使ってチェックできます。各リソースごとにネットワークにかかった時間が確認できます。TimelineではJavaScriptの処理時間などが計測可能です。

Firefox Developer Editionの場合

ネットワークおよびパフォーマンスタブを使って測定できます。ネットワークタブではリソースごとの待ち時間、転送時間が分かります。

パフォーマンスタブではDOMイベント、CSSの計算、レンダリングなどを細かく計測できます。

Safariの場合

ネットワークタブとタイムラインタブを使ってチェックできます。JavaScriptの実行されている箇所や、レイアウト/レンダリングのタイミングを確認することでデバッグ可能です。

タイムラインはズームイン/アウトができます。

IEの場合

ネットワーク、UIの応答タブを使って確認できます。ネットワークタブではリソースごとの読み込み、実行時間が確認できます。URLごとに表示されるのでファイル名が長く、若干区別が難しいです。

UIの応答では読み込み時間、レンダリング、イメージのデコードなど細かく判別できます。CPU使用率が基準なので、重たいJavaScript処理の発見も可能でしょう。これだけ細かく測定できればどこに時間がかかっているのが一目で分かります。


各ブラウザとも高速なWebアプリケーション開発に必須の機能が揃っています。Firefox Developer EditionはFPSに重点が置かれていたり、IEはCPUなど各ブラウザの目的が異なるのが興味深いです。

JavaScript/CSSのLint系ライブラリまとめ

システム開発プロジェクトが進むと、だんだんとコードの方向性などを見失いがちになり、そのままでは潜在的なバグや問題を引き起こしかねません。そのようなエラーと潜在的な問題を事前に検出するためにはLint系ライブラリが役に立ちます。

JavaScriptとCSSのLintライブラリについて、簡単にセットアップと実行方法も合わせて紹介していきます。

まずはJavaScriptのLintから

JSHint

JSHintは、後述のJSLintからフォークされました。JSLintが厳しい設定となっているのに比べ、JSHintはルールが非常に緩くなっています。

JSHint
JSHint

JSHintはそのままでは殆どチェックを行いません。よって、利用する時はルールの設定ファイルが必要です。設定ファイルはプロジェクトルートに .jshintrc ファイルを設置して行います。

{
  "indent": 4,
  "strict":true
}

各ルールオプションはJSHint Options Referenceを参考にして下さい。

コマンドラインからの実行

npmでのインストールで、コマンドラインからの実行が可能です。

$ npm install -g jshint
$ jshint test.js

タスクランナーからの実行

JSHintのタスクランナーはGulp:gulp-jshintとGrunt:gruntjs/grunt-contrib-jshint · GitHubを参考にして下さい。

JSLint

JSLintはダグラス・クロックフォード氏によって作られました。かなり制約が厳しいことで評判になっていますが、そのチェックを乗り越えるという、いわば修行とも取れるこのツールの特徴が今現在まで利用され続け、各Lintアプリケーションへ影響を与えているのではないでしょうか。

JSLint
JSLint

Webサイトではソースコードを貼り付けることですぐに利用が可能です。

コマンドラインからの実行

npmでのインストールで、コマンドラインからの実行が可能です。

$ npm install -g jslint
$ eslint test.js test2.js

タスクランナーからの実行

JSLintのタスクランナーはgulp-jslintgrunt-jslintを参考にして下さい。

ESLint

ESLintはJSHintやJSLintと違い、独自ルールをプラグインで追加できるという特徴を持っています。独自ルールは設定ファイルである .eslintrc をJSONかYAMLを編集して追加します。また、直接コメントに記述することでルールを設定できますので、グローバルに設定ファイルを利用し各コメントにてローカル設定を記述すると柔軟に各プロジェクトに対応できるでしょう。

ESLint
ESLint

コマンドラインからの実行

npmでのインストールで、コマンドラインからの実行が可能です。

$ npm install -g eslint

質問形式で設定ファイルの .eslintrc を生成します。

$ eslint --init

プロジェクトルートから対象のディレクトリやファイルを指定して実行します。

$ eslint test.js test2.js

タスクランナーからの実行

ESLintのタスクランナーはgulp-eslintgrunt-eslintを参考にして下さい。

CSSのLint系ライブラリ

CSS Lint

CSS LintはCSSを書くためのベストプラクティス集の意味合いが強いツールです。CSS自体はある程度無理をしても動いてしまいますが、その結果として人によってコードが左右されてしまうことが多くなってしまいます。その辺りの指針としてCSS Lintを利用することで、プロジェクト全体でコーディングの統一化が図れるでしょう。

CSS Lint
CSS Lint

Webサイトでは、コードを貼り付けることで利用が可能です。

コマンドラインからの実行

npmでのインストールで、コマンドラインからの実行が可能です。

$ npm install -g eslint
$ csslint target.css

設定ファイル

プロジェクトルートに.csslintc として設定を記述します。以下は.csslintcの記述例です。


{
  "bulletproof-font-face": false,
  "compatible-vendor-prefixes": false,
}

タスクランナーからの実行

Gulpの場合:lazd/gulp-csslint

インストール

$ npm install --save-dev gulp-csslint

gulpfile.js

var csslint = require('gulp-csslint');

gulp.task('css', function() {
  gulp.src('client/css/*.css')
    .pipe(csslint())
    .pipe(csslint.reporter());
});
Gruntの場合:gruntjs/grunt-contrib-csslint

インストール

$ npm install grunt-contrib-csslint --save-dev

Gruntfile.js

csslint: {
  strict: {
    options: {
      import: 2
    },
    src: ['path/to/**/*.css']
  },
  lax: {
    options: {
      import: false
    },
    src: ['path/to/**/*.css']
  }
}

CSSLint/csslint · GitHub


タスクランナーからのCSSチェックツール

ここからはタスクランナーでの利用においてCSSをチェックするツールを紹介します。CSS Lintでも同様の対応が可能なものもありますが、特定の実用性の高いライブラリを紹介していきます。

CSSプロパティ重複チェック

peterkeating/grunt-csscss · GitHub

CSSのプロパティの重複チェックを行うツールです。このプラグインを起動するには事前にRubyの csscss をセットアップします。

$ gem install csscss
$ npm install grunt-csscss --save-dev

Gruntfile.jsの記述例です。

grunt.initConfig({
  csscss: {
    dist: {
      src: ['css/style.css']
    }
  }
});

grunt.loadNpmTasks('grunt-csscss');

grunt.registerTask('default', ['csscss']);

CSSで利用中のクラスとIDをチェックする

利用中のCSSに対して、指定したURLやHTMLファイル内で、利用されているクラスやIDだけを抽出して、新たにCSSを作成するプラグインです。複数のHTMLファイルに対応していますので、CSSをまとめるのにも便利そうです。

Gulpの場合:ben-eb/gulp-uncss · GitHub

インストール

$ npm install gulp-uncss --save-dev

gulpfile.jsの利用例です。

var gulp = require('gulp');
var uncss = require('gulp-uncss');

gulp.task('default', function () {
    return gulp.src('site.css')
        .pipe(uncss({
            html: ['index.html', 'posts/**/*.html', 'http://example.com']
        }))
        .pipe(gulp.dest('./out'));
});

Gruntの場合:addyosmani/grunt-uncss · GitHub

インストール

npm install grunt-uncss --save-dev

Gulpfile.js の利用例です。

module.exports = function(grunt) {
  grunt.initConfig({
    uncss: {
      dist: {
        files: {
          'dist/css/tidy.css': ['app/index.html', 'app/about.html']
        }
      }
    }
  });

  grunt.loadNpmTasks('grunt-uncss');

  grunt.registerTask('default', ['uncss']);
}

最後に

いかがでしょうか。おそらくCLIから利用するのは限定的だと思います。殆どのライブラリではタスクランナーから利用できますので定期的な実行を行うでしょう。さらにタスクランナーではwatchをすることで都度確認ができますので、コーディング中に迷うことなくプロジェクトを進められるでしょう。また、IDEやSublimeText、AtomなどのエディタではLint系のプラグインとしても設定可能なものがあります。ぜひ紹介したライブラリを活用してみて下さい。