86 votes

Tester un service Web JAX-RS ?

Je suis actuellement à la recherche de moyens pour créer des tests automatisés pour un système de gestion de la qualité. JAX-RS (Java API for RESTful Web Services).

J'ai essentiellement besoin d'un moyen de lui envoyer certaines entrées et de vérifier que j'obtiens les réponses attendues. Je préférerais le faire via JUnit, mais je ne suis pas sûr de la façon dont cela peut être réalisé.

Quelle approche utilisez-vous pour tester vos services web ?

Mise à jour : Comme l'a souligné entzik, le fait de découpler le service web de la logique métier me permet de tester unitairement la logique métier. Cependant, je veux également tester les codes d'état HTTP corrects, etc.

6 votes

Bonne question - cependant, je dirais que si vous effectuez des tests via HTTP, il me semble qu'il s'agit de tests d'intégration.

0 votes

Tom. Vous avez tout à fait raison. Nous devrions injecter un émulateur HTTP factice/un conteneur léger pour cela. Dans le monde node.js supertest fait cela. Vous pouvez émuler express.js.

34voto

James Strachan Points 6144

Jersey est doté d'une excellente API client RESTful qui facilite l'écriture de tests unitaires. Voir les tests unitaires dans les exemples fournis avec Jersey. Nous utilisons cette approche pour tester le support REST dans le module Apache Camel Si vous êtes intéressé par le les cas de test sont ici

7 votes

Re : now bad link Vous pouvez trouver les exemples mentionnés dans le jersey /samples qui montrent des tests unitaires, essentiellement en utilisant les consommateurs de jersey pour consommer des ressources web. download.java.net/maven/2/com/sun/jersey/samples/bookstore/

2 votes

Ce projet est sur GitHub, trouvez les tests dans le dossier src/test : github.com/jersey/jersey/tree/master/exemples/bookstore-webapp

3 votes

Je ne doute pas de cette réponse, mais je trouve incroyablement drôle que Jersey se fraye toujours un chemin dans une conversation sur JAX-RS, alors que dans certains cas (WebSphere, malheureusement, pour être exact) il n'est pas disponible et rend caduque 99% de toutes les réponses acceptables sur Stack Overflow.

27voto

Johan Points 1120

Vous pouvez essayer REST Assuré ce qui en fait muy simple pour tester les services REST et valider la réponse en Java (en utilisant JUnit ou TestNG).

1 votes

J'ai voté pour ton post parce que la bibliothèque avait l'air bien, mais ils utilisent beaucoup de pots dépendants...

18voto

Fırat KÜÇÜK Points 526

Comme l'a dit James, il est intégré cadre de test pour Jersey. Un exemple simple de "hello world" peut être comme ceci :

pom.xml pour l'intégration de maven. Lorsque vous exécutez mvn test . Frameworks démarre un conteneur Grizzly. Vous pouvez utiliser jetty ou tomcat en modifiant les dépendances.

...
<dependencies>
  <dependency>
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-servlet</artifactId>
    <version>2.16</version>
  </dependency>

  <dependency>
    <groupId>org.glassfish.jersey.test-framework</groupId>
    <artifactId>jersey-test-framework-core</artifactId>
    <version>2.16</version>
    <scope>test</scope>
  </dependency>

  <dependency>
    <groupId>org.glassfish.jersey.test-framework.providers</groupId>
    <artifactId>jersey-test-framework-provider-grizzly2</artifactId>
    <version>2.16</version>
    <scope>test</scope>
  </dependency>
</dependencies>
...

ExampleApp.java

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

@ApplicationPath("/")
public class ExampleApp extends Application {

}

HelloWorld.java

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("/")
public final class HelloWorld {

    @GET
    @Path("/hello")
    @Produces(MediaType.TEXT_PLAIN)
    public String sayHelloWorld() {

        return "Hello World!";
    }
}

HelloWorldTest.java

import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.test.JerseyTest;
import org.junit.Test;
import javax.ws.rs.core.Application;
import static org.junit.Assert.assertEquals;

public class HelloWorldTest extends JerseyTest {

    @Test
    public void testSayHello() {

        final String hello = target("hello").request().get(String.class);

        assertEquals("Hello World!", hello);
    }

    @Override
    protected Application configure() {

        return new ResourceConfig(HelloWorld.class);
    }
}

Vous pouvez vérifier ce application type.

8voto

entzik Points 509

Vous avez probablement écrit du code Java qui met en œuvre votre logique commerciale, puis vous avez généré le point de terminaison des services Web correspondant.

Une chose importante à faire est de tester de manière indépendante votre logique d'entreprise. Comme il s'agit de code Java pur, vous pouvez le faire avec des tests JUnit ordinaires.

Maintenant, puisque la partie services web n'est qu'un point final, vous voulez vous assurer que la plomberie générée (stubs, etc.) est synchronisée avec votre code java. Vous pouvez le faire en écrivant des tests JUnit qui invoquent les clients java du service web généré. Cela vous permettra de savoir si vous modifiez vos signatures java sans mettre à jour les services web.

Si la plomberie de vos services Web est automatiquement générée par votre système de construction à chaque construction, il n'est peut-être pas nécessaire de tester les points d'extrémité (en supposant que tout est correctement généré). Tout dépend de votre niveau de paranoïa.

2 votes

Vous avez tout à fait raison, mais je dois également tester les réponses HTTP réelles qui sont renvoyées, en particulier les codes d'état HTTP.

6voto

Bien qu'il soit trop tard par rapport à la date de publication de la question, j'ai pensé que cela pourrait être utile à d'autres personnes qui ont une question similaire. Jersey est livré avec un cadre de test appelé Cadre de test Jersey qui vous permet de tester votre service Web RESTful, y compris les codes d'état des réponses. Vous pouvez l'utiliser pour exécuter vos tests sur des conteneurs légers comme Grizzly, HTTPServer et/ou EmbeddedGlassFish. Le framework peut également être utilisé pour exécuter vos tests sur un conteneur web ordinaire comme GlassFish ou Tomcat.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X