84

現在、 JAX-RS (Java API for RESTful Web Services) ベースの Web サービスの自動テストを作成する方法を探しています。

基本的に、特定の入力を送信して、期待される応答が得られることを確認する方法が必要です。JUnit経由でこれを行うことを好みますが、それをどのように達成できるかわかりません。

Web サービスをテストするためにどのようなアプローチを使用していますか?

更新: entzik が指摘したように、Web サービスをビジネス ロジックから切り離すことで、ビジネス ロジックの単体テストを行うことができます。ただし、正しい HTTP ステータス コードなどもテストしたいと思います。

4

10 に答える 10

34

Jerseyには優れた RESTful クライアント API が付属しており、単体テストを非常に簡単に記述できます。Jersey に同梱されているサンプルの単体テストを参照してください。このアプローチを使用して、Apache Camelでの REST サポートをテストします。興味がある場合は、テスト ケースはこちら

于 2008-09-29T09:56:50.940 に答える
26

REST サービスのテストと Java での応答の検証が非常に簡単になるREST Assuredを試すことができます (JUnit または TestNG を使用)。

于 2010-12-27T08:14:17.987 に答える
18

ジェームズが言ったように。Jerseyには組み込みのテスト フレームワークがあります。簡単な Hello World の例は次のようになります。

Maven 統合用の pom.xml。あなたが実行するときmvn test。フレームワークは grizzly コンテナーを開始します。依存関係を変更することで、jetty または tomcat を使用できます。

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

このサンプルアプリケーションを確認できます。

于 2015-02-25T18:10:57.560 に答える
8

おそらく、ビジネス ロジックを実装する Java コードをいくつか作成し、そのための Web サービス エンドポイントを生成したことでしょう。

重要なことは、ビジネス ロジックを個別にテストすることです。これは純粋な Java コードであるため、通常の JUnit テストで実行できます。

ここで、Web サービス部分は単なるエンドポイントであるため、生成された配管 (スタブなど) が Java コードと同期していることを確認する必要があります。これは、生成された Web サービス Java クライアントを呼び出す JUnit テストを作成することで実行できます。これにより、Web サービスを更新せずに Java 署名を変更したときに通知されます。

ビルドごとにビルド システムによって Web サービス プラミングが自動的に生成される場合は、エンド ポイントをテストする必要はないかもしれません (すべてが適切に生成されていると仮定します)。あなたのパラノイアのレベルによります。

于 2008-09-23T14:46:50.070 に答える
6

質問を投稿した日から遅すぎますが、これは同様の質問を持つ他の人にとって役立つかもしれないと考えました. Jersey には、 Jersey Test Frameworkと呼ばれるテスト フレームワークが付属しており、応答ステータス コードを含む RESTful Web サービスをテストできます。これを使用して、Grizzly、HTTPServer、EmbeddedGlassFish などの軽量コンテナーでテストを実行できます。また、このフレームワークを使用して、GlassFish や Tomcat などの通常の Web コンテナーでテストを実行することもできます。

于 2009-06-10T06:32:50.840 に答える
3

Apache のHTTPClient (http://hc.apache.org/)を使用して Restful サービスを呼び出します。HTTP クライアント ライブラリを使用すると、get、post、またはその他の必要な操作を簡単に実行できます。サービスが xml バインディングに JAXB を使用する場合、JAXBContext を作成して、HTTP 要求からの入力と出力をシリアライズおよびデシリアライズできます。

于 2008-09-23T15:37:34.660 に答える
3

Alchemy rest client generatorを見てください。これにより、バックグラウンドで jersey クライアントを使用して、JAX-RS Web サービス クラスのプロキシ実装を生成できます。単体テストから Web サービス メソッドを単純な Java メソッドとして効果的に呼び出すことができます。http 認証も処理します。

単純にテストを実行する必要がある場合は、コード生成が必要ないので便利です。

免責事項: 私はこのライブラリの作成者です。

于 2015-05-27T11:46:18.023 に答える
2

複雑にしないでおく。Maven Central からインポートできるhttps://github.com/valid4j/http-matchersをご覧ください。

    <dependency>
        <groupId>org.valid4j</groupId>
        <artifactId>http-matchers</artifactId>
        <version>1.0</version>
    </dependency>

使用例:

// Statically import the library entry point:
import static org.valid4j.matchers.http.HttpResponseMatchers.*;

// Invoke your web service using plain JAX-RS. E.g:
Client client = ClientBuilder.newClient();
Response response = client.target("http://example.org/hello").request("text/plain").get();

// Verify the response
assertThat(response, hasStatus(Status.OK));
assertThat(response, hasHeader("Content-Encoding", equalTo("gzip")));
assertThat(response, hasEntity(equalTo("content")));
// etc...
于 2016-01-28T08:33:58.827 に答える
1

重要なことは、ビジネスロジックを個別にテストすることです

JAX-RSコードを記述し、インターフェイスの単体テストを検討している人が、なんらかの奇妙で説明のつかない理由で、プログラムの他の部分を単体テストできるという考えに気づいていないとは思いません。ビジネスロジッククラスを含みます。明白なことを述べることはほとんど役に立ちません、そして、応答もテストされる必要があるということが繰り返し指摘されました。

JerseyとRESTEasyの両方にクライアントアプリケーションがあり、RESTEasyの場合は、同じ注釈を使用できます(注釈付きのインターフェイスを除外して、テストのクライアント側とサーバー側で使用することもできます)。

このサービスがあなたのためにできることではなく、REST。このサービスでできることをRESTします。

于 2009-08-04T20:39:58.443 に答える