Splunk Syntheticsで条件に基づいたAssert
はじめに
Splunk Synthetic Monitoringでは表示された結果を元にAssertすることができます。
つまり「特定の文字列や要素が存在する or 存在しない場合」というAssertです。
大抵の場合はそれですみますが、たまにロジックに基づいて判断したい場合があります。
例えば:
- 条件分岐で判断したい(XXXという文字があった場合に文字YYYが存在すること、など)
- ページ上に表示される「更新日」が本日かどうか判断したい
- 何らかの値に変換処理を加えた結果を元に判断したい
Splunk Syntheticsでは任意のJavaScriptを実行することができるのでそれで対応します。
API Testを使う場合とBrowser Testを使う場合のそれぞれで方法をまとめました。
テストサイト
各国の言語であいさつを返してくれるサイトをお借りします。
lang=ja
でリクエストすると、「こんにちは」がHTMLエンコーディングされた形で返ってきます。
このままではテストが難しいのでJavaScriptを使ってデコードして結果を評価したいと思います。
(このケースではエンコーディングされた値を直接Assertすればいいじゃん、という話もありますが、記事の便宜上デコードさせてください)
API Testの場合
API TestはRESTによるPOST / GETなどを行えるTestです。
Responseに対してJavaScriptを実行した結果を変数に格納し、その変数に対してAssertを行えます。
このようなステップを作成します。
RequestでGETし、そのResponseをValidation内でJavaScriptを使い処理し結果を変数に格納、最後のAssertでテストします。
JavaScript部分を詳しく見てみます。
// response.bodyをJSONオブジェクトに変換
var apiResponse = JSON.parse(response.body);
// 変数でデコード処理を実行
var decodedHello = apiResponse.hello.replace(/&#(\d+);/g, function(match, num) {
return String.fromCharCode(parseInt(num, 10));
});
// 結果を返す
decodedHello;
- 前段のRequestで得られた値は
response.body
で取得できます。
※Body以外にもレスポンスヘッダーはheaders["content-length"]
などで取得できます。 - Bodyに対して処理を実施します。今回はデコードをしています。
- 最後に結果を返しています。
そして、結果(デコードされた「こんにちは」)をcustom.helloに格納し、次のAssertでcustom.hello contains こんにちは
することで、期待する結果が得られたかをチェックします。
ここで「こんにちは」以外だとテストが失敗するのでアラートを上げることができます。
参考:テスト結果
Browser Testの場合
Browserで得られた結果に対して処理したいケースも多いと思います。
単発のページでのチェックはAPI Testで十分ですが、ユーザー動線も含めたチェックを行う場合はBrowser Testが必要です。
Browser Testの場合、JavaScriptの結果を変数に格納することができません。
代わりにJavaScript実行結果を要素としてHTMLに追加し、それに対してAssertを実行します。
ステップはこうなります。
JavaScript部分ですが
// bodyを取得
var body = document.querySelector('body > pre').textContent;
// response.bodyをJSONオブジェクトに変換
var apiResponse = JSON.parse(body);
// 変数でデコード処理を実行
var decodedHello = apiResponse.hello.replace(/&#(\d+);/g, function(match, num) {
return String.fromCharCode(parseInt(num, 10));
});
// 結果を要素としてHTMLに追加
const resultElement = document.createElement('div');
resultElement.innerHTML = `<p>Syntheticsテスト結果</p>
<p>result: ${decodedHello}</p>`;
document.body.insertBefore(resultElement, document.body.firstChild);
-
まずは
var body = document.querySelector('body > pre').textContent;
により、取得対象のテキストを抽出しています。
※今回のHTMLの構造がこうだったので、Selectorは適宜調整してください。
-
その後のデコード処理は同じです。
-
最後にelementを作成し、ページの上部に追加しています。
これをブラウザ上で実行するとこのようになります。
result: こんにちは
が追加されるので、これに対して「こんにちは」という文字が存在するかAssertをすれば良いという訳です。
Test結果を見ると、このようにJavaScriptで処理された結果が表示され、Assertが実行されました。
適切にJavaScriptで処理できているか分かるのでいいですね。
Assert失敗時もきちんと拾えています(「こんばんは」があることをテスト)。
まとめ
今回はデコード処理で試してみましたがJavaScriptでできる処理であればなんでも大丈夫です。
Discussion