🤼

karateでrequestを作るのはJSONが良い

2022/02/11に公開

karateとは何ですか?

webAPIのテスト自動化フレームワークです。
https://github.com/karatelabs/karate

postmanで、WebAPIの自動テストを構築していました。
しかし、辛みがあり、karateに移行をした経緯があります。

そのあたりの経緯は別で書きます。

karateには、便利なメソットが多くあり、良く考えて作ってるな~と感じて、
少しずつアウトプットしてきます。

requestをJSONで書く方法

APIのrequestはJSONであることが多いので、JSONで書けると可読性が良くレビューもしやすいです。
逆に、requestを構造体の階層を作って1個ずつparameterをセットしていく…は面倒です。

そのような時には、triple-quotes""")を使うと、勝手にやってくれます。

# ここでrequestを構築している。
Given def cat = 
  """
  {
    name: 'Billie',
    kittens: [
      { id: 23, name: 'Bob' },
      { id: 42, name: 'Wild' }
    ]
  }
  """
 
 Given url baseUrl
 # ここでrequestをする。
 And request = cat
 When method post
 Then status 200

https://github.com/karatelabs/karate#multi-line-expressions

JSONに変数を埋め込む

前のresponseを使用して、次のrequestに使用したい時があります。
例えば、POSTで作成したidを使って、PUTでidを指定して更新するなどです。

そのような時には、embedded-expressions#())を使うと、埋め込むことも可能です。

Given def cat = 
 """
 {
   name: 'Billie',
   kittens: [
     # ここで前のresponseのidを埋め込んでいる。
     { id: #(response.id), name: 'Bob' },
     { id: 42, name: 'Wild' }
   ]
 }
 """

https://github.com/karatelabs/karate#embedded-expressions

JSONを格納している変数は構造体して扱える

requestしたparameterがresponseと一致しているか?を確認したい時があります。
そのような時には、requestがJSONで格納している変数を構造体として、使うことができます。

Given def cat = 
  """
  {
    name: 'Billie',
    kittens: [
      { id: 23, name: 'Bob' },
      { id: 42, name: 'Wild' }
    ]
  }
  """
 # JSONが格納しているcatを構造体として扱って、responseと一致しているか確認している。
 And match response.kittens[*].id contains cat.kittens[0].id
 
 # catの構造体の値を変更することも可能である。
 * set cat.kittens[0].id = 99

Discussion