Apache.JMeter用のHTMLパーサーの選択

Apache.JMeter htmlパーサーによる埋め込みリソースへのリンクの抽出の完全性の平均品質
パーサーの平均品質(7つのサイト)

私は提案する:


人気のある知恵が言うように:信じるが...


プロジェクトの説明


Apache.JMeter 3.0がリリースされたとき、それはまだ開発中であり、同僚であり、私はそれをテストし、仕事でそれを使用し始めました。 Artyom zetsigemonは、新しいサービスpgu.mos.ruのいずれかの戦闘テストで最初に新しいバージョンを使用しました。Apache.JMeter3.0を使用すると、組み込みリソースの解析の品質が前のバージョンに比べて大幅に向上しました。
そして、疑問が生じました。この品質とは何ですか、異なるサイトでどのように測定するのか、それは何で、何になったのですか?

研究の資料と結果は、現在の記事に反映されています。

テスト対象


HtmlParsersは、 Apache.JMeter 2.13およびApache.JMeter 3.0でテストされています。

パーサーApache.JMeter 2.13


Apache.JMeter 3.0を解析します


パーサーは、さまざまなWebサイトの開始ページを解析します。


テストの基礎


基礎はApache.JMeter 3.0の変更でした。http //jmeter.apache.org/changes.htmlを参照してください。

変更のリストからの抜粋:

コアの改善


依存関係の更新

廃止されたライブラリは、最新のものにドロップまたは置き換えられました:
  • htmllexer、htmlparserが削除されました
  • 削除されたjdom

htmlparserパーサーとより多くの未使用のjdomライブラリを削除しました。

プロトコルと負荷テストの改善


並列ダウンロードが現実的になり、スケールが大幅に改善されました。

  • CSSインポートされたファイル( インポートを介して)または埋め込みリソース(背景、画像など)の解析

CSSファイル用の新しいパーサーが追加され、他のCSSファイルへのリンク( インポートを介して)およびCSSファイルで指定されたリソースへのリンクが抽出されます:背景画像、画像、...

互換性のない変更


  • バージョン3.0以降、htmlparserライブラリ(HtmlParserHTMLParser)に依存していた埋め込みリソースのパーサー(2.10以降はLagartoベースの実装に置き換えられました)は、その依存関係とともに削除されました。
  • 次のjarは削除されました。

htmlparserパーサーと、未使用のhtmllexerおよびjdomライブラリーを 削除ました

改善点


HTTPサンプラーとテストスクリプトレコーダー

  • バグ59036 -FormCharSetFinder:非推奨のHTMLParserの代わりにJSoupを使用
  • バグ59033-並列ダウンロード:異なるMIMEタイプのプラグインパーサーを許可するようにパーサークラスの階層を作り直しました
  • Bug 59140-並行ダウンロード:CSSファイルからリンクを抽出するCSS解析を追加

formタグのaccept-charset属性を検索するために、リモートHTMLParserの代わりにJSoupが使用されるようになりました [バグ59036]。 CSSファイルパーサー[バグ59140]を実装し、デフォルトでこのパーサーが使用されます[バグ59033]。

テストの目的


利用可能なすべてのパーサーの作業を比較します。 特に、バージョン2.13と3.0のパーサーを相互に比較し、組み込みリソースのロードがより現実的で良くなっていることを確認してください。

戦略


ステージ1:

  1. 5つのApache.JMeter 2.13パーサーをすべて使用して、サイトリスト開始ページをダウンロードし 、ログを記録します。
  2. 4つのApache.JMeter 3.0パーサーをすべて使用してサイトリスト開始ページをダウンロードし、ログを書き込みます。
  3. Apache.JMeterログを分析し、互いに比較します。 埋め込みリソースの読み込みが改善されたかどうか、読み込まれた埋め込みリソースのリストが拡張されたかどうかを評価します。

ステージ2:

  1. Google Chromewebpagetest.orgサービスを使用して、人気サイトのリストの開始ページをダウンロードします。
  2. webpagetest.orgからのレポートを分析し、 Apache.JMeterログの分析結果と比較します。 組み込みリソースのロードのリアリズムを評価します。

テストアプローチ


Apache.JMeterからサイトページを開くときに送信されるリクエストの正確な数を判断するためにすべてのリクエストがログに記録されます。


Apache.JMeterのバージョン、パーサー、およびサイトごとにリクエストをグループ化できるように、各リクエストの追加変数がログに記録されます。


結果


バージョン2.13と比較したバージョン3.0のパーサーの改善の評価


htmlページの解析の完全性に根本的な改善はありませんが、劣化があります。

重要な違いは、Apache.JMeter 3.0のパーサーでは、Yandexブラウザーブラウザーのプロモーションページの再帰的な読み込みがあることです。 これはhttps://yandex.ru/をダウンロードするときに現れます

コンテンツの量が少ないサイト-良い結果


jmeter.apache.orgのような単純なサイトでは、すべてのパーサーが同じように機能します。 ブラウザが作成するサブクエリと同じ数を作成します。 jmeter.apache.orgのパーサーの品質は完璧で、100%です。

コンテンツが多いサイトは悪い結果です


しかし、mos.ruのようなサイトでは、パーサーは埋め込みリソースへの平均22リンクを見つけますが、すべてのブラウザー埋め込みリソースが読み込まれたページ全体の読み込みには144のリクエストがあります。 品質が悪い。

同様に、 habrahabr.ru Webサイトでは、 Apache.JMeter 3.0のLagardoパーサーは55個のリンクを見つけ、ブラウザーは117個のサブクエリを作成します。 品質-47.01%。 埋め込みリソースへのリンクを抽出するための十分な品質。

さまざまなパーサーを使用するときのサブクエリの数


Googleドキュメントの表: JMeter.HtmlParser.Compare(上の表)

さまざまなApache.JMeter htmlパーサーの動作とGoogle Chromeの結果を比較した概要表
バージョンおよびhtmlパーサーのコンテキストでのApache.JMeterの動作の統計、およびGoogle Chromeの動作との比較

列の説明:


Document Completeの時点でGoogle Chromeブラウザーと同じ数のサブクエリがあり、 Fully Loadedの時点で素晴らしい場合、パーサーはうまく機能します。 特定のパーサーを使用する場合、 Apache.JMeterのリアリズムの尺度として、Fully Loadedの時点でブラウザーが実行したサブクエリの数に対するサブクエリの数の近さを考慮します。

サイトyandex.ruのテスト結果を除外する場合、ここで:


そして、パーサーの品質の尺度として、 Fully Loadedの時点でサブクエリの数を取得し、パーサーの平均品質のこのようなテーブルを取得します。

パーサーの平均品質


Googleドキュメントの表: JMeter.HtmlParser.Compare(下の表)

パーサーの平均品質
パーサーの平均品質(yandex.ruなしの7つのサイト)

Apache.JMeter 2.13で最も正確なHTMLParserパーサー。 Apache.JMeter 3.0では、 JsoupパーサーJTidyパーサーは同じ品質を示しました。 Lagartoパーサーはリーダーに遅れをとっています。 Apache.JMeter 3.0のLagartoパーサーの解析の完全性は、 Apache.JMeter 2.13と比較して低下しています。

Apache.JMeter 3.0の現在のバージョンでのLagartoパーサーの品質は32.73%で、すべてのサブクエリの3分の1のみが送信され、 静的関数の 3分の2の負荷は送信されませんでした。

habrahabr.ruのApache.JMeter 3.0を使用する場合のスキップされたリンクの詳細な分析


Googleドキュメントの表: デフォルトのパーサーApache.JMeter 3.0にないhabrahabr.ruへのリンクの欠落
不足しているリンクの概要
Apache.JMeter 3.0の解析リンクの欠落habrahabr.ru

多くの販促資料と統計を逃しました。 そしてそれは良いことです。
量的特性のみを評価することはすでに上で述べました。 数字で見ると、埋め込みリソースへのリンクを抽出する品質が低いことがわかります。 詳細な分析により、正確に見逃されたものが示されることがあります。 これは、サードパーティのリソースからの広告とコンテンツであることが判明する場合がありますが、特定のサイトの負荷テストの一部として読み込む必要はありません。

ログとその処理


ソースデータ


すべてのログはhttps://drive.google.com/drive/folders/0B5nKzHDZ1RIiVkN4dDlFWDR1ZGMで入手できます

WebPageTest.orgレポート


シテキーwebpagetest.org生ページデータ(.csv)生オブジェクトデータ(.csv)HTTPアーカイブ(.har)
github.com160819_VF_FM8github.com.summary.csvgithub.com.details.csvgithub.com.har
google.ru160819_C9_FQDgoogle.ru.summary.csvgoogle.ru.details.csvgoogle.ru.har
habrahabr.ru160819_8N_FRBhabrahabr.ru.summary.csvhabrahabr.ru.details.csvhabrahabr.ru.har
jmeter.apache.org160819_CG_FSMjmeter.apache.org.summary.csvjmeter.apache.org.details.csvjmeter.apache.org.har
linkedin.com160819_K2_FY1linkedin.com.summary.csvlinkedin.com.details.csvlinkedin.com.har
mos.ru160819_91_G0Fmos.ru.summary.csvmos.ru.details.csvmos.ru.har
stackoverflow.com160819_S0_G18stackoverflow.com.summary.csvstackoverflow.com.details.csvstackoverflow.com.har
yandex.ru160819_MR_G1Ryandex.ru.summary.csvyandex.ru.details.csvyandex.ru.har

レポート画像








Document CompleteおよびFully Loadedデータが抽出されたWebpagetest.orgレポートの上限

Document Complete列とFully Loaded列の値から、サブクエリの数を取得するために1つのクエリ(ルート)を除外する必要があります。

ログApache.JMeter


処理には、 CsvLogWriterプラグインによって生成されたcsvログが使用されます。


サードパーティのプラグインを使用して、埋め込みリソースのリクエストがcsvログに記録されるようにします。

CsvLogWriter操作の結果、ログが生成され、その列のリストには以下が含まれます。



ログ処理の自動化


Apache.JMeter csvログの集約は、次のPythonコードでパンダを使用して実行されます。

 import pandas as pd import codecs from os import listdir import numpy as np #  -       . dirPath = "D:/project/jmeter.htmlParser.3.0.vs.2.13/logs" read_csv_param = dict( index_col=['timeStamp'], low_memory=False, sep = ";", na_values=[' ','','null']) #   csv-    . files = filter(lambda a: '.csv' in a, listdir(dirPath)) #    csv-  DataFrame dfs. csvfile = dirPath + "/" + files[0] print(files[0]) dfs = pd.read_csv(csvfile,**read_csv_param) for csvfile in files[1:]: print(csvfile) tempDfs = pd.read_csv(dirPath + "/" + csvfile, **read_csv_param) dfs = dfs.append(tempDfs) #dfs.to_excel(dirPath + "/total.xlsx") #     JSR223,      ,   HTTP Request Sampler. #  JSR223 URL ,  HTTP- URL . dfs = dfs[(pd.isnull(dfs.URL) == False)] #     ,   report.subrequests.html -   . #      ,    . #    -   ,   . pd.pivot_table(dfs, index=['siteKey', "jmeterVersion", "htmlParser"], values="URL", columns=["i"], aggfunc=lambda url: url.count()-1).to_html(dirPath + "/report.subrequest.count.html") 

yandex.ruでの再帰的な読み込み


Apache.JMeterは再帰に入ります
yandex.ruのデフォルト設定(Lagarto htmlパーサー)を使用した現在のバージョンのApache.JMeter 3.0の埋め込みリソースの再帰的な読み込み

見られるように:

  1. Apache.JMeterは、 https://yandex.ru/clck/redir/dtype=stred....7004fcb3793e79bb1ac9e&keyno=12 //yandex.ru/clck/redir/dtype=stred....7004fcb3793e79bb1ac9e&keyno=12のリンクを見つけて追跡しhttps://yandex.ru/clck/redir/dtype=stred....7004fcb3793e79bb1ac9e&keyno=12
  2. 次に、新しい一意のリンクhttps://yandex.ru/clck/redir/dtype=stred....cd1c46cad58fbfe2f61&keyno=12を見つけhttps://yandex.ru/clck/redir/dtype=stred....cd1c46cad58fbfe2f61&keyno=12
  3. など、再帰になります。

この場合、これはYandex Browserをダウンロードするためのリンク内の画像です。

Apache.JMeterで再帰ステップが発生する作業中のマークアップのフラグメント
Yandex Browserをダウンロードするための再帰、リンク、および画像の新しいステップを追加するサイトyandex.ru処理のhtmlコードのフラグメント

パーサーは画像を見つけます。 JMeterはそれをダウンロードしようとしますが、それに応答してhtmlページを受信すると、再び写真へのリンクと他のリンクがあります。 そして、すべてが繰り返されます。 Apache.JMeterの動作正しいです。

また、 Apache.JMeter 2.13では、再帰はHtmlParserパーサーでのみ発生し、他では発生しない理由を推測します。



推測しません それは絶望的な状況のようです。 しかし、そのような状況はありません。 常に解決策があります。

たとえば、Yandex BrowserをUser-Agentとして指定してみてください。 サーバーは、おそらく、ブラウザをダウンロードするための画像を表示しないか、画像リクエストに画像で応答し、再帰はありません。 これは予感です、テストしませんでした。

これで、スクリプトはwebpagetest.orgの操作と同期するためにGoogle ChromeのUser-Agentを指定し、サーバーはブラウザではなく、独自のリンクを提供しているようです。

プロジェクト構成



テストは自分で簡単に変更でき、サイトと適切な反復回数を指定します。 すべての設定はtest.batファイルで設定されます。

 CALL jmeter.2.13.bat http://stackoverflow.com/ 5 stackoverflow.com CALL jmeter.2.13.bat https://habrahabr.ru/ 5 habrahabr.ru CALL jmeter.2.13.bat https://yandex.ru/ 5 yandex.ru CALL jmeter.2.13.bat https://www.mos.ru/ 5 mos.ru CALL jmeter.2.13.bat http://jmeter.apache.org/ 5 jmeter.apache.org CALL jmeter.2.13.bat https://www.google.ru/ 5 google.ru CALL jmeter.2.13.bat https://www.linkedin.com/ 5 linkedin.com CALL jmeter.2.13.bat https://github.com/ 5 github.com CALL jmeter.3.0.bat http://stackoverflow.com/ 5 stackoverflow.com CALL jmeter.3.0.bat https://habrahabr.ru/ 5 habrahabr.ru CALL jmeter.3.0.bat https://yandex.ru/ 5 yandex.ru CALL jmeter.3.0.bat https://www.mos.ru/ 5 mos.ru CALL jmeter.3.0.bat http://jmeter.apache.org/ 5 jmeter.apache.org CALL jmeter.3.0.bat https://www.google.ru/ 5 google.ru CALL jmeter.3.0.bat https://www.linkedin.com/ 5 linkedin.com CALL jmeter.3.0.bat https://github.com/ 5 github.com 

さらに、カスタマイズされた数式を使用して、Excelファイルから結果を挿入し、結果の視覚的な表を取得できます。
パーサーをファイナライズして、同様の手法で、埋め込みリソースの解析の品質の向上を監視できます。

結論


この記事には特に実用的な価値はありません。 しかし、いくつかの有用な結論を出すことができます。

Source: https://habr.com/ru/post/J308254/


All Articles