Postman使ってStripe Billingシナリオをワンクリックでテストする
Test Clockがあってもシナリオテストがやっぱり大変
Stripe Billing を利用してサブスクリプション決済を構築する際に課金期間のシミュレーションは結構手間掛かります。
StripeはTest Clockというテストツールを提供していますが、StripeとのIntegrationをまだ進んでない初期段階では一々API Callしないといけないのでやっぱり不便です。
もっとPostmanを使ってワンクリックでサブスクリプションをシミュレーションできないかということで本文を書いてみました。以下まず最終的なイメージです。
事前作業:環境変数にTest API Keyを設定する
PostmanからStripe APIをCallするにはTest API Keyを取得するする必要があります。Key自体はこのページで取得できます。設定自体はStripeが公開しているPostman Collectionを参考してください。
設定が終わったら環境変数を指定し、Bearer Tokenで該当するSecret Keyを指定します。
課題1:Stripe Object IDの引き渡し
サブスクリプションシナリオは通常以下のようなStripe Objectから構成されます。
- Test Clock
- Customer
- Product / Pricing
- Subscription
仮に一つのシナリオを順番に実行して行く場合、Postmanの各APIが前のAPI CallのResponseにあるIDを取得する必要があります。
Postman Test Scriptで変数を設定する。
ここに登場するのはPostman Test Scriptです。もともとAPIのResponseを検証するためにスクリプトですが、Collectionの変数を設定する場所としても利用できます。
例えば、Price APIでPrice IDを生成後、後続のAPIが利用できるようにTest スクリプトでPrice IDを保存できます。
pm.collectionVariables.set("price_id", pm.response.json().id);
そうすると後続のシナリオでは{{pricing_id}}でパラメータとして設定できます。
課題2:Test Clockの結果は非同期
Test Clock を進む をCallしたら分かりますが、即時下記Responseが返ってきます。advancingというステータスの状態では後続のオブジェクトに関連する処理を実行しようとするとエラーが返ってきます。
{
"id": "clock_1LZ7oZCuHGjyTEV47wpjulz1",
"object": "test_helpers.test_clock",
"created": 1661063959,
"deletes_after": 1663655959,
"frozen_time": 1661007600,
"livemode": false,
"name": null,
"status": "advancing"
}
実際シミュレーションが’完了したらtest_helpers.test_clock.readyでEventで通知されますので、このイベントを拾って後続の処理を実施する必要があります。
Pre-request Scriptを利用してTest Clockのステータスを確認する
先述の通り、後続のAPIを実行する前にTest Clockのステータスを確認する必要がありますので、今度はPostmanのPre-request scriptを利用して実現します。
APIを実行する前にPostmanからRetrieve Test Clock でステータスを確認し、Readyじゃないなら5秒を待って再度試すというロジックとなります。
pm.collectionVariables.set("clock_status", "not_ready");
const sendRequest = () => {
pm.sendRequest({
url: "https://api.stripe.com/v1/test_helpers/test_clocks/" + pm.variables.get("clock_id"),
method: "get",
header: {
'Authorization': 'Bearer' + ' ' + pm.environment.get("secret_key"),
},
}, function (err, response) {
console.log(response.json())
if (response.json().status !== 'ready') {
checkClock();
} else {
pm.collectionVariables.set('clock_status', response.json().status)
}
})
}
const checkClock = async () => {
if (pm.variables.get('clock_status') === 'ready') {
return null
}
else {
setTimeout(
sendRequest, 5000)
}
}
checkClock();
これでワンクリックで複雑なサブスクリプションサイクルを好きなタイミングまでシミュレーションできるようになります。実行する前に後でObject IDを確認できるようにSave responsesを保存するように注意しましょう。
もっと軽いやり方ないの?
上記スクリプトを一々APIに入れるのがだるいと思う方もいると思います。
非公式のシミュレーションツールでテンプレートを生成してみてください。
設定したスケジュールと課金モデルに基づいて初回課金までのスクリプトを生成してくれます。スクリプトをRaw TextとしてPostmanにインポートするだけ。
Discussion