2017-03-16 1 views
7

J'ai besoin d'écrire une suite de tests fonctionnelle (qui testera une API GraphQl). La suite de tests sera dans un rapport séparé et un conteneur de l'API.Comment tester une API GraphQl?

Une approche que je pensais serait d'utiliser un framework BDD dans la suite de tests. La suite exécutera tous les tests BDD après avoir reçu une requête HTTP. Je pensais utiliser Cucumber.js comme framework BDD. Je sais qu'il y a npm test. Je ne suis pas sûr de la façon dont j'exécuterai les tests. C'est un peu gênant d'utiliser un cadre de test unitaire de cette manière. Cette approche a-t-elle un sens?

Quel outil existe pour faire quelque chose comme ça? Je suis ouvert à considérer plusieurs langues et outils.

+0

Je ne suis pas expérimenté pour donner une réponse assez bonne mais ce poste m'a aidé https://medium.com/entria/testing-a-graphql-server-using-jest-4e00d0e4980e#.qohdw3wuz J'ai essayé pour mettre en œuvre le concombre avec ma mise en œuvre ici est un exemple https://github.com/RedLeap/swapi-graphql-module/blob/5da487bf28897aa228d937712dabfd6580cb301d/features/planets.feature - Je répète que je ne suis pas un testeur expérimenté juste pensé que je ' d donner mes deux cents plutôt que de laisser cela sans réponse. Si vous avez des questions s'il vous plaît faites le moi savoir :) –

Répondre

1

Vous pouvez simplement utiliser le test npm avec n'importe quel coureur de test que vous voulez. J'utilise Mocha et Chai. Jest pourrait être un peu mieux car je crois que c'est probablement la suite de tests la plus avancée. Vous avez simplement créé des tests comme vous le feriez pour n'importe quel point de terminaison.

 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); 
    }); 

assez simple pour le tester. Vous exécutez également une instruction before insérant l'utilisateur concerné dans votre base de données. Le problème de séparer une suite de tests est que vous devrez accéder directement à la base de données. Vos tests ne doivent pas dépendre d'autres appels d'API car cela crée des dépendances inutiles. Donc, si un test se brise alors tout à coup, la cause profonde est plus difficile à comprendre.

0

Karate est un cadre relativement nouveau test d'automatisation de services Web qui se trouve à être bien adapté pour les réponses des tests de GraphQL en raison de 2 capacités spécifiques

    manipulation de texte
  • : il est facile de requêtes GraphQL en ligne, les lisent à partir de fichiers (réutilisables) et substitute placeholders
  • JsonPath assertions: bien que les réponses GraphQL soient JSON, elles changent dynamiquement en fonction de la requête (pas de schéma fixe) et ont tendance à être profondément imbriquées. assertions JsonPath natives de karaté vous permettent de vous concentrer uniquement sur les morceaux dont vous avez besoin, et vous pouvez exprimer les résultats attendus sous forme JSON coupe courte, ce qui est très lisible

Voici un bon exemple: graphql.feature avec un extrait ci-dessous:

# 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 } 

Même si Karaté nécessite un moteur d'exécution Java, la syntaxe est Cucumber/Gherkin qui est indépendant du langage, et vous pouvez facilement ajouter des tests de karaté et reports à votre installation existante continue l'intégration. Les programmeurs de JavaScript se sentiront particulièrement à la maison à cause de la façon dont le karaté embeds a JavaScript runtime prend en charge le JSON "indulgent" (pas besoin de guillemets doubles, pas besoin de placer des clés JSON entre guillemets).

Désistement: dev ici.