[runn] runnでSalesforceのApexRest APIのテストを書いてみた

2024.03.05

情報システム室 進地 です。

高野さんが書かれた、 yamlでテストシナリオを書いてそのまま実行までできるAPIテストツールの新星 “runn” を試してみた の記事で runn を知り、これは使ってみたいと感じました。

そこで、まずはSalesforceのApexRest APIのコールをrunnで書いてみました。

背景

クラスメソッドでは基幹システムの一部にSalesforceを使っており、Salesforceと他システムとの連携において、Salesforceに任意のカスタムAPIを実装できるApexRest APIを利用しています。Apex内部のユニットテストはSalesforceの自動化テストの仕組みによって品質を担保しているのですが、このAPIを外部から実際にコールした場合のE2Eテストでは都度Postmanを使って手動で行うなど、面倒に感じていましたし、手動のため、リグレッションテストなども十分に行えていないという課題感がありました。

runnは各APIコールの結果をstepで繋ぐことができるため、この課題を解決できると考えて使ってみようと思いました。

やってみた

Salesforceには様々な認証方法が用意されていますが、最もシンプルなパスワード認証の方法でApexRest APIコールをrunnで行うymlファイルが次の通りです。

scenario.yml

desc: Salesforceアクセスチェック
runners:
  req: https://<your-company-id>.my.salesforce.com
steps:
  createToken:
    desc: "アクセストークンを取得する"
    req:
      /services/oauth2/token:
        post:
          body:
            application/x-www-form-urlencoded:
              grant_type: password
              client_id: <your client id>
              client_secret: <your client secret>
              username: <your user name>
              password: <your password>
    test: |
      current.res.status == 200
    bind:
      # 変数にアクセストークンをセット
      access_token: current.res.body.access_token

  callApexRest:
    desc: "ApexREST APIを GET で呼び出す"
    req:
      /services/apexrest/<your apexrest api path>:
        get:
          headers:
            # 変数にセットしたアクセストークンを設定
            authorization: "Bearer {{ access_token }}"
          body:
            application/json: null

createTokenステップを別ファイルに外出しもできるので、アクセストークンの取得部分は再利用できますし、これをベースに様々なApexRest APIのテストを呼び出す形で作成できそうです。

課題

runners:
  req: https://<your-company-id>.my.salesforce.com

でrunnersでセットしたURLを途中で変えたいケースがあるのですが、現状、私が試した範囲では途中変更はできないようでした。というのは、Salesforceはパスワード認証だとアクセストークン取得時にキーinstance_urlで以降のAPIコールをリクエストすべきドメインが与えられるのですが、これに切り替えることができなかったため、runners.reqにはMy Domainを与える形で記述しています。