「JMeter」とXML→CSV置換ツール「xalan」

SATOOcsv, cui, excel, JMeter, xalan, xml, xslt, 負荷テスト

こんにちは、SATOOです。

今回は、XMLファイルをCSVファイルに置換してくれる便利ツール「xalan」の紹介です。
「xalan」は、Apacheソフトウェア財団のXalanプロジェクトで開発されている、XML文書のXSLT変換ツールです。
これを使うと、XMLファイルを簡単にCSVファイルに置換することができます。

と。
本題に入る前に、今回のテーマの元になった負荷テストツール「JMeter」に関連するお話をさせてください。
「JMeter」はWEBアプリケーションやデータベースサーバなどのネットワークサービスのパフォーマンス計測と負荷テストを行えるツールです。
Javaで作られているので、Windows・Mac・Linuxのどのプラットフォームでも動作します。
詳しい情報はJakartaプロジェクトのドキュメントをご覧ください。

起動用スクリプトは、WindowsとUnixで異なり、binディレクトリ(フォルダ)の中の以下のファイルになります。
Windows:jmeter.bat
Unix:jmeter

「JMeter」はCUIでも動作します。
CUIで動作させる際の基本的なオプションは以下の通り。

オプション 説明
-n GUI無しで起動
-t テスト計画ファイル テスト計画ファイル名を指定
-l 結果ファイル テスト結果ファイルを指定

結果ファイルは拡張子「.jtl」のXMLファイルとして出力されます。
あとは、この結果ファイルをGUIモードの「JMeter」で読み込めば、結果だけを見ることができるわけです。

例えば、こんな感じのファイルが結果として出力されます(見やすいように整形しています)。

<?xml version="1.0" encoding="UTF-8"?>
<testResults version="1.2">

<httpSample t="377" lt="377" ts="1233104408927" s="true" lb="Access" rc="200" rm="OK" tn="Samples_maxmember 1-1" dt="text" by="1180">
<assertionResult>
<name>アサーション</name>
<failure>false</failure>
<error>false</error>
</assertionResult>
<assertionResult>
<name>アサーションの持続</name>
<failure>false</failure>
<error>false</error>
</assertionResult>
</httpSample>

<httpSample t="310" lt="310" ts="1233104409481" s="true" lb="Access" rc="200" rm="OK" tn="Samples_maxmember 1-2" dt="text" by="1180">
<assertionResult>
<name>アサーション</name>
<failure>false</failure>
<error>false</error>
</assertionResult>
<assertionResult>
<name>アサーションの持続</name>
<failure>false</failure>
<error>false</error>
</assertionResult>
</httpSample>

<httpSample t="373" lt="373" ts="1233104410902" s="true" lb="Access" rc="200" rm="OK" tn="Samples_maxmember 1-3" dt="text" by="1180">
<assertionResult>
<name>アサーション</name>
<failure>false</failure>
<error>false</error>
</assertionResult>
<assertionResult>
<name>アサーションの持続</name>
<failure>false</failure>
<error>false</error>
</assertionResult>
</httpSample>

</testResults>

上記の<httpSample>~</httpSample>が1つのテスト結果になります。
つまり上のファイルだと3つのテスト結果が記録されていることになりますね。

httpSample要素の各属性値には、いろいろな結果情報が含まれています。
以下に属性値の説明をいくつか載せてみます。

属性 説明
t 応答時間(テストにおけるレスポンスタイム)
ts 実行した時間(マイクロタイムスタンプ)
lb テストのサンプラー名

また、<assertionResult>~</assertionResult>には、そのテストにおけるアサーションの結果が含まれています。
テスト計画に複数のアサーションが設定されていれば、その数だけ追加されます。

さて、いよいよここからが本題なのですが、この結果ファイル、Excelなどで加工したいときがあります。
結果をExcelで読み込んで、加工して、グラフ化したい。
こんなとき、使っているExcelのバージョンが2003以降であれば、そのまま読み込むことが可能なようですが・・・。
私のマシンに入っているOfficeはバージョンが「2000」だったりします。
XMLファイルをそのまま読み込むことはできません。
最初からCSVで結果を出力していればいいじゃないか、というご意見もあるでしょうが(「JMeter」では結果をCSVで出力するオプションがあります)、出力してしまった結果をCSVで出力しなおすことはできませんので、再度テストを実行することになります。
テスト実行時間が長い場合、再テストも大変。
さて、どうしよう。

こんなときに役立つソフトが「xalan」です。
ここでは、「xalan」を使ってXML文書をCSVファイルに変換する流れについてメモしてみようと思います。
(なお、ここではWindowsをプラットフォームにして説明します)

まず「xalan」を使えるようにするためにはJavaがインストールされている必要があります。
Java SE Downloadsページより、最新のJDKをインストールします。

Javaのインストールが終わったら、次はxalanのインストールです。
http://www.apache.org/dyn/closer.cgi/xml/xalan-jから、xalan-jの圧縮ファイルをダウンロードします。
記事時点での最新版ファイルは「xalan-j_2_7_1-bin-2jars.zip」になります。

ダウンロードしたファイルを解凍してできたフォルダの中に、以下の「.jar」ファイルがあります。

  • serializer.jar
  • xalan.jar
  • xercesImpl.jar
  • xml-apis.jar
  • xsltc.jar

これらの「.jar」ファイルを、Javaの拡張プラグインとして認識させます。
簡単な方法は、Javaプログラムの中にコピーしてしまうこと。
JDKのインストール先がデフォルトであれば、上記ファイルを「C:\Program Files\Java\jre6\lib\ext」にコピーします。
これでxalanが動きます。

さて、いよいよ「xalan」を使ってXMLファイルからCSVファイルを出力します。
コマンドプロンプト上で、以下のように入力すれば、「xalan」による変換が行われます。

java org.apache.xalan.xslt.Process -in XMLファイル名 -xsl XSLTファイル名 -out 出力ファイル名

上記のように、変換には、XSLTファイル(XMLスタイルシート)が必要になるので、先に作成します。

今回は「JMeter」の結果ファイルをCSV変換するのが目的なので、上でも載せた以下のJTLファイルを例にしてXSLTファイルを作成してみます。

— C:\sample.jtl —

<?xml version="1.0" encoding="UTF-8"?>
<testResults version="1.2">
<httpSample t="377" lt="377" ts="1233104408927" s="true" lb="Access" rc="200" rm="OK" tn="Samples_maxmember 1-1" dt="text" by="1180">
<assertionResult>
<name>アサーション</name>
<failure>false</failure>
<error>false</error>
</assertionResult>
<assertionResult>
<name>アサーションの持続</name>
<failure>false</failure>
<error>false</error>
</assertionResult>
</httpSample>
<httpSample t="310" lt="310" ts="1233104409481" s="true" lb="Access" rc="200" rm="OK" tn="Samples_maxmember 1-2" dt="text" by="1180">
<assertionResult>
<name>アサーション</name>
<failure>false</failure>
<error>false</error>
</assertionResult>
<assertionResult>
<name>アサーションの持続</name>
<failure>false</failure>
<error>false</error>
</assertionResult>
</httpSample>
<httpSample t="373" lt="373" ts="1233104410902" s="true" lb="Access" rc="200" rm="OK" tn="Samples_maxmember 1-3" dt="text" by="1180">
<assertionResult>
<name>アサーション</name>
<failure>false</failure>
<error>false</error>
</assertionResult>
<assertionResult>
<name>アサーションの持続</name>
<failure>false</failure>
<error>false</error>
</assertionResult>
</httpSample>
</testResults>

この結果から欲しい値が、httpSample要素の「t」属性(応答時間)、「ts」属性(実行した時間)、「lb」属性(テストのサンプラー名)だとすると、XSLTファイルは以下のようになります。

— C:\sample.xsl —

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:output method="text" encoding="UTF-8" />

<xsl:template match="/">ResponseTime,Time,SamplerType<xsl:apply-templates select="testResults/httpSample" />
</xsl:template>

<xsl:template match="httpSample">
<xsl:value-of select="@lt" />,<xsl:value-of select="@ts" />,<xsl:value-of select="@lb" /><xsl:text>
</xsl:text>
</xsl:template>

</xsl:stylesheet>

これでXSLTファイルができました。
あとは、コマンドプロンプト上で以下のように入力します。
C:\> java org.apache.xalan.xslt.Process -in sample.jtl -xsl sample.xsl -out out.csv

すると、次のようなファイルが生成されます。
— out.csv —

377,1233104408927,Access
310,1233104409481,Access
373,1233104410902,Access

「xalan」を使ったCSV変換は、「JMeter」の結果加工以外でも使えますので、覚えておいて損はないと思います。
また、「JMeter」の結果が数十万行にもなってしまってExcelで読み込めないときなどにも役に立ちます。

SATOOcsv, cui, excel, JMeter, xalan, xml, xslt, 負荷テスト

Posted by SATOO