SHOEISHA iD

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

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

トップエスイーからのアウトカム ~ ソフトウェア工学の現場から

ソフトウェアのテスト品質を効果的に測定するミューテーション解析

トップエスイーからのアウトカム ~ ソフトウェア工学の現場から 第3回

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

クライアントサイドWebアプリケーションに特化したミューテーション解析ツール - AjaxMutator

 近年のWebアプリケーションは、クライアント(ブラウザ)側にAjax技術が利用されています。例えば、GoogleやFacebookなどもWebアプリケーションのクライアント側にAjax技術を採用しています。Ajax技術は下記3つの特徴を持ち、Webアプリケーションの応答性を向上させるために役立ちます。

  • ユーザイベント:ユーザからの入力をイベント駆動的に処理
  • 非同期通信:サーバと非同期的にデータを送受信
  • 動的なページ要素の操作:ページ遷移を伴わず表示情報を更新

 我々はこれら3つの特徴を分析し、WebアプリケーションにおけるAjaxプログラムに特化したミューテーション操作を定義しました(表2)。これらの操作を実装したAjaxMutatorのソースコード は、GitHubで公開しています。

表2 AjaxMutatorに実装されているミューテーション操作
表2 AjaxMutatorに実装されているミューテーション操作

 AjaxMutatorの仕組みを簡単に説明します(図5)。ミューテーション解析では、ソースコードの一部を改変することで欠陥を埋め込みますが、Webアプリケーションのソースコードはサーバ側に配備されており直接改変することはできません。そこでAjaxMutatorは、自前のProxyサーバを介すようテストケースを実行することで、テスト対象のソースコードをローカルファイルシステムにいったん保存します(Recordモード)。次に、保存したソースコードに表2のミューテーション操作を適用することで、欠陥を含むAjaxプログラムを生成します(Rewriteモード)。このようにして、AjaxMutatorはWebアプリケーションに対するミューテーション解析を実現しています。

図5 AjaxMutatorの仕組み
図5 AjaxMutatorの仕組み

 では、AjaxMutatorを使ってみましょう。本稿ではテスト対象アプリケーションとして、OSSのクイズライブラリであるQuizzy(図6)を利用します。

図6 Quizzyの動作例
図6 Quizzyの動作例

 なお、記事中のソースコードはGitHub上で公開しています。併せて参照してください。

AjaxMutatorの導入

 AjaxMutatorの実行バイナリはMavenレポジトリから取得可能です。まずはEclipseなどを用いてMavenプロジェクトを作成しましょう 。Mavenプロジェクトでは、利用するライブラリなどはPOM(Project Object Model)ファイルに記述します。AjaxMutatorの実行バイナリが配備されているレポジトリを登録し、依存関係にAjaxMutatorに追加します。また、AjaxMutatorはJDK 1.7以降をサポートしているためコンパイラ情報も明記します(図7)。

図7 AjaxMutatorの導入
図7 AjaxMutatorの導入

設定ファイルの作成

 AjaxMutatorを利用するためには下記の2つのファイル「localenv.properties」と「quizzy.properties」を作成し、クラスパスの通ったディレクトリに配備してください。

localenv.propertiesの作成

 このファイルには、テスト対象アプリケーションに依存しない設定情報を記述します。

  1. テストの実行環境であるWebブラウザのバイナリへのパス
    AjaxMutatorはFirefoxとPhantomJSに対応しており、それぞれfirefox-binまたはphantomjs-binを用いて設定できます。
  2. ProxyサーバがListenするポート番号

図8 テスト実行環境の設定

図8 テスト実行環境の設定

quizzy.propertiesの作成

 このファイルには、テスト対象アプリケーションに依存する設定情報を記述します。

  1. Recordモード時にソースコードを保存するディレクトリへのパス。Rewriteモード時にも同じディレクトリを参照しミューテーション操作を適用します。
  2. テスト対象Webアプリケーションが配備されているURL。
  3. ミューテーション操作を適用するJavaScriptファイルへのURLからの相対パス。
  4. Proxyサーバのモード。RecordとRewriteモードを切り替える際に、それぞれram recordとram rewriteに編集する必要があります。また、単純にテストケースを実行する(ソースコードの保存や書き換えをしない)場合は、ramを設定します。
図9 テスト対象Webアプリケーションの設定
図9 テスト対象Webアプリケーションの設定

テストケースの実装

 テスト実行時に都度Proxyサーバを起動・停止することは手間がかかります。そこでAjaxMutatorは、その作業を自動化する便利機能を提供しています。この便利機能を利用するために、テストケースを実装するJavaクラスにWebAppTestBaseを継承しましょう。図10にこのクラスの利用例を示します。ここでは主に下記3つの機能が動作します。

  1. @BeforeClass:このテストスイートに含まれるテストケースが実行される前に、設定ファイルを読み込んだり、Proxyサーバを立ち上げたりします。
  2. @Before:各テストケースが実行される前に、Webブラウザ上でURLを開き、ページの表示が完了するまで待機します。
  3. @AfterClass:このテストスイートに含まれるテストケースの実行が完了した後に、WebブラウザやProxyサーバを停止します。

 これらの機能は、汎用的に動作するよう設計してあります。テンプレートとして利用してみてください。

図10 AjaxMutatorの便利機能の利用
図10 AjaxMutatorの便利機能の利用

 簡単なテストケースを1つ実装してみましょう。図11では、showQuizDescriptionメソッドにおいて、Quizzyで「クイズを選択し、その説明文が期待通りか」確認するテストケースを実装しています。Proxyサーバの設定をRecordモードに変更しテスト実行することで、Quizzyのソースコードファイルがローカルファイルシステムへ保存されます(図12)。

図11 ミューテーション対象ソースコードの保存
図11 ミューテーション対象ソースコードの保存
図12 保存されたソースコードのファイル
図12 保存されたソースコードのファイル

次のページ
ミューテーション解析のためのプログラム作成

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

  • X ポスト
  • このエントリーをはてなブックマークに追加
トップエスイーからのアウトカム ~ ソフトウェア工学の現場から連載記事一覧

もっと読む

この記事の著者

前澤 悠太(国立情報学研究所)(マエザワ ユウタ)

国立情報学研究所GRACEセンター特任助教。博士(情報理工学)(東京大学)。ソフトウェアテストを中心にソフトウェア工学分野の研究開発に従事。最近は、最先端の学術研究成果を、産業界で実用化することを目指している。

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

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

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/10066 2017/03/30 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング