문제

나는 현재 자동 테스트를 만들 수있는 방법을 찾고 있습니다. Jax-Rs (편안한 웹 서비스를위한 Java API) 기반 웹 서비스.

기본적으로 특정 입력을 보내고 예상 응답을 받는지 확인하는 방법이 필요합니다. 나는 Junit을 통해 이것을 선호하지만 그것이 어떻게 달성 될 수 있는지 잘 모르겠습니다.

웹 서비스를 테스트하기 위해 어떤 접근법을 사용합니까?

업데이트: Entzik이 지적했듯이 비즈니스 로직에서 웹 서비스를 분리하면 비즈니스 로직을 테스트 할 수 있습니다. 그러나 올바른 HTTP 상태 코드 등을 테스트하고 싶습니다.

도움이 되었습니까?

해결책

저지 유닛 테스트 작성을 정말 쉽게 만드는 훌륭한 RESTFUL CLIENT API가 제공됩니다. 저지와 함께 배송되는 예제에서 단위 테스트를 참조하십시오. 우리는이 접근법을 사용하여 나머지 지원을 테스트합니다. 아파치 낙타, 당신이 관심이 있다면 테스트 케이스가 여기에 있습니다

다른 팁

당신은 시험해 볼 수 있습니다 안심하십시오 그것은 그것을 만듭니다 매우 휴식 서비스를 간단하게 테스트하고 Java의 응답 검증 (Junit 또는 TestNG 사용).

제임스가 말했듯이; 내장되어 있습니다 테스트 프레임 워크 저지를 위해. 간단한 Hello World 예제는 다음과 같습니다.

Maven 통합을위한 pom.xml. 당신이 달릴 때 mvn test. 프레임 워크는 그리즐리 용기를 시작합니다. 변경 의존성을 통해 부두 또는 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);
    }
}

당신은 확인할 수 있습니다 이것 샘플 응용 프로그램.

질문을 게시 한 날로부터 너무 늦었지만 비슷한 질문이있는 다른 사람들에게 유용 할 수 있다고 생각했습니다. 저지는 The라는 테스트 프레임 워크와 함께 제공됩니다 저지 테스트 프레임 워크 응답 상태 코드를 포함하여 편안한 웹 서비스를 테스트 할 수 있습니다. 그리즐리, httpserver 및/또는 Embeddedglassfish와 같은 경량 컨테이너에서 테스트를 실행하는 데 사용할 수 있습니다. 또한 프레임 워크를 사용하여 Glassfish 또는 Tomcat과 같은 일반 웹 컨테이너에서 테스트를 실행할 수 있습니다.

당신은 아마도 비즈니스 로직을 구현하는 Java 코드를 작성한 다음 웹 서비스 엔드 포인트를 생성했을 것입니다.

중요한 일은 비즈니스 논리를 독립적으로 테스트하는 것입니다. 순수한 Java 코드이므로 정기적 인 Junit 테스트로 수행 할 수 있습니다.

이제 웹 서비스 부품이 단지 엔드 포인트이므로 생성 된 배관 (스터브 등)이 Java 코드와 동기화되어 있는지 확인하십시오. 생성 된 웹 서비스 Java 클라이언트를 호출하는 Junit 테스트를 작성하여 그렇게 할 수 있습니다. 웹 서비스 내용을 업데이트하지 않고 Java 서명을 변경할 때 알려줍니다.

웹 서비스 배관이 모든 빌드에서 빌드 시스템에 의해 자동으로 생성되는 경우 엔드 포인트를 테스트 할 필요가 없을 수 있습니다 (모두 올바르게 생성되었다고 가정). 편집증 수준에 따라 다릅니다.

나는 아파치를 사용합니다 httpclient (http://hc.apache.org/) 편안한 서비스를 호출하려면. HTTP 클라이언트 라이브러리를 사용하면 Get, Post 또는 필요한 다른 작업을 쉽게 수행 할 수 있습니다. 서비스가 XML 바인딩에 JAXB를 사용하는 경우 HTTP 요청에서 입력 및 출력을 직렬화하고 직렬화하기 위해 JAXBContext를 생성 할 수 있습니다.

보세요 연금술 휴식 클라이언트 생성기. 이렇게하면 현장 뒤에 저지 클라이언트를 사용하여 JAX-RS WebService 클래스에 대한 프록시 구현이 생성 될 수 있습니다. 효과적으로 귀하는 귀하를 단위 테스트에서 간단한 Java 메소드로 웹 서비스 메소드라고 부릅니다. HTTP 인증도 처리합니다.

단순히 테스트를 실행 해야하는 경우 코드 생성이 필요하지 않으므로 편리합니다.

불쾌감 : 저는이 도서관의 저자입니다.

중요한 일은 비즈니스 논리를 독립적으로 테스트하는 것입니다.

나는 JAX-RS 코드를 작성하고 인터페이스를 단위 테스트하려는 사람이 어떻게 든 기괴하고 설명 할 수없는 이유에 대해 프로그램의 다른 부분을 테스트 할 수 있다는 개념에 대해 잊어 버린다고 생각하지 않을 것입니다. 비즈니스 로직 클래스 포함. 명백한 것을 진술하는 것은 거의 도움이되지 않으며 요점은 반복적으로 응답을 테스트해야한다는 것을 반복적으로 만들었습니다.

Jersey와 Resteasy에는 클라이언트 응용 프로그램이 있으며 Resteasy의 경우 동일한 주석을 사용할 수 있습니다 (주석이 달린 인터페이스를 고려하고 테스트의 클라이언트 및 서버 측면에서 사용).

이 서비스가 당신을 위해 할 수있는 일이 아닙니다. 이 서비스를 위해 할 수있는 일을 쉬십시오.

간단하게 유지하십시오. 살펴보십시오 https://github.com/valid4j/http-matchers Maven Central에서 가져올 수 있습니다.

    <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...

이 문제의 자동차의 주요 목적은 Jax RS 계층을 비즈니스 1에서 분리하는 것입니다. 단위 테스트 첫 번째 테스트. 여기서 두 가지 기본 문제를 해결해야합니다.

  1. 일부 웹/애플리케이션 서버를 테스트하고 JAX RS 구성 요소를 넣습니다. 그리고 그들 만.
  2. JAX RS 구성 요소/REST 계층 내부의 비즈니스 서비스.

첫 번째는 Arquillian과 함께 해결되었습니다. 두 번째는 완벽하게 설명되어 있습니다 Arquillican과 Mock

다음은 코드의 예입니다. 다른 애플리케이션 서버를 사용하면 다를 수 있지만 기본 아이디어와 장점을 얻을 수 있기를 바랍니다.

import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;

import com.brandmaker.skinning.service.SomeBean;

/**
* Created by alexandr on 31.07.15.
*/
@Path("/entities")
public class RestBean
{
   @Inject
   SomeBean bean;

   @GET
   public String getEntiry()
   {
       return bean.methodToBeMoked();
   }
}

import java.util.Set;

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

import com.google.common.collect.Sets;

/**
*/
@ApplicationPath("res")
public class JAXRSConfiguration extends Application
{
   @Override
   public Set<Class<?>> getClasses()
   {
       return Sets.newHashSet(RestBean.class);
   }
}


public class SomeBean
{
   public String methodToBeMoked()
   {
       return "Original";
   }
}

import javax.enterprise.inject.Specializes;

import com.brandmaker.skinning.service.SomeBean;

/**
*/
@Specializes
public class SomeBeanMock extends SomeBean
{
   @Override
   public String methodToBeMoked()
   {
       return "Mocked";
   }
}

@RunWith(Arquillian.class)
public class RestBeanTest
{
   @Deployment
   public static WebArchive createDeployment() {
       WebArchive war = ShrinkWrap.create(WebArchive.class, "test.war")
               .addClasses(JAXRSConfiguration.class, RestBean.class, SomeBean.class, SomeBeanMock.class)
               .addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml");
       System.out.println(war.toString(true));
       return war;
   }

   @Test
   public void should_create_greeting() {
       Client client = ClientBuilder.newClient();
       WebTarget target = client.target("http://127.0.0.1:8181/test/res/entities");
       //Building the request i.e a GET request to the RESTful Webservice defined
       //by the URI in the WebTarget instance.
       Invocation invocation = target.request().buildGet();
       //Invoking the request to the RESTful API and capturing the Response.
       Response response = invocation.invoke();
       //As we know that this RESTful Webserivce returns the XML data which can be unmarshalled
       //into the instance of Books by using JAXB.
       Assert.assertEquals("Mocked", response.readEntity(String.class));
   }
}

몇 가지 메모 :

  1. Web.xml이없는 JAX RS 구성이 여기에서 사용됩니다.
  2. JAX RS 클라이언트는 여기에서 사용됩니다 (ReseAsy/Jersey 없음, 더 편리한 API를 노출시킵니다)
  3. 테스트가 시작되면 Arquillian의 러너가 작동하기 시작합니다. 여기 필요한 애플리케이션 서버로 Arquillian의 테스트를 구성하는 방법을 찾을 수 있습니다.
  4. 선택한 응용 프로그램 서버에 따라 테스트의 URL이 약간 다릅니다. 다른 포트가 사용될 수 있습니다. 8181은 내 예에 내장 된 Glassfish에 의해 사용됩니다.

희망, 도움이 될 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top