web-dev-qa-db-ja.com

GraphQl APIをテストする方法は?

機能テストスイート(GraphQl APIをテストする)を作成する必要があります。テストスイートは、APIとは別のリポジトリおよびコンテナに配置されます。

私が考えたアプローチの1つは、テストスイート内でBDDフレームワークを使用することです。スイートは、HTTP要求を受信した後、すべてのBDDテストを実行します。

Cucumber.jsをBDDフレームワークとして使用することを検討していました。 npm test。どのようにテストを実行するのかわかりません。この方法で単体テストフレームワークを使用するのは少し厄介です。このアプローチは理にかなっていますか?

このようなことを行うためのツールは何ですか?さまざまな言語とツールを検討できます。

16
Nelson

Karate は、比較的新しいWebサービスのテスト自動化フレームワークであり、2つの特定の機能により、GraphQL応答のテストに適しています

  • テキスト操作:簡単にインラインGraphQLクエリを実行し、(再利用可能な)ファイルから読み取り、 代替プレースホルダー
  • JsonPathアサーション:GraphQLレスポンスはJSONですが、リクエストに応じて動的に変化し(固定スキーマなし)、深くネストされる傾向があります。空手のネイティブJsonPathアサーションにより、必要なチャンクのみに集中でき、予想される結果を非常に読みやすいショートカットJSON形式で表現できます。

これが良い例です: graphql.feature 以下のスニペット付き:

# you can also read this query from a file
Given text query =
"""
{
  pokemon(name: "Pikachu") {
    id
    number
    name
    attacks {
      special {
        name
        type
        damage
      }
    }
  }
}
"""
And request { query: '#(query)' }
When method post
Then status 200

# json-path makes it easy to focus only on the parts you are interested in
# which is especially useful for graph-ql as responses tend to be heavily nested
* match $.data.pokemon.number == '025'

# the '..' wildcard is useful for traversing deeply nested parts of the json
* def attacks = get[0] response..special
* match attacks contains { name: 'Thunderbolt', type: 'Electric', damage: 55 }

非Javaチームの場合、Karateは バイナリ実行可能ファイル を提供します。これはJREのみを必要とし、Visual Studioコードは IDEとして十分です です。 JavaScriptプログラマーは、空手 JavaScriptランタイムを埋め込む であり、「寛容な」JSONをサポートするため、特にくつろいでいます(二重引用符は不要、JSONキーを引用符で囲む必要はありません)。

編集:これは 雷の話の10分のビデオ これを説明するデモ付きです。

免責事項:ここに開発者。

6
Peter Thomas

必要なテストランナーでnpm testを使用できます。私はモカとチャイを使用しています。 Jestは、おそらく最も高度なテストスイートであると考えているため、少し改善されるかもしれません。エンドポイントテストと同様に、テストを作成しました。

      it('should be null when user is not logged in', async () => {
        const query = `
          query {
            user(id: "") {
              username
              email
            }
          }
        `

    const rootValue = {};
    const context = {};

    const result = await graphql(schema, query, rootValue, context);
    const { data } = result;

    expect(data.user).to.equal(null);
  });

それをテストする非常に簡単な方法。また、関連するユーザーをデータベースに挿入するbeforeステートメントを実行します。テストスイートを分離しておくことの問題は、dbに直接アクセスする必要があることです。不要な依存関係を作成するため、テストは他のAPI呼び出しに依存しないでください。そのため、テストが中断した場合、突然根本的な原因を突き止めることは難しくなります。

1
Byrd