「JMeter」とXML→CSV置換ツール「xalan」
こんにちは、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で読み込めないときなどにも役に立ちます。
ディスカッション
コメント一覧
まだ、コメントがありません