Модульное тестирование веб-службы JAX-RS?

В настоящее время я ищу способы создания автоматизированных тестов для JAX-RS (API Java для веб-службы на основе RESTful).

Мне в основном нужен способ отправить определенные входные данные и убедиться, что я получаю ожидаемые ответы. Я бы предпочел сделать это через JUnit, но я не уверен, как этого достичь.

Какой подход вы используете для тестирования своих веб-сервисов?

Обновление . Как указывал entzik, отделение веб-службы от бизнес-логики позволяет мне тестировать бизнес-логику модульно. Однако я также хочу проверить правильность кодов HTTP-статуса и т. Д.

75 голосов | спросил Einar 23 rdEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 23 Sep 2008 18:18:00 +0400 2008, 18:18:00

9 ответов


0

Джерси поставляется с отличным клиентским API-интерфейсом RESTful, который действительно упрощает написание модульных тестов. Смотрите юнит-тесты в примерах, которые поставляются с Джерси. Мы используем этот подход для проверки поддержки REST в Apache Camel , если вас интересует контрольные примеры здесь

ответил James Strachan 29 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowMon, 29 Sep 2008 13:56:50 +0400 2008, 13:56:50
0

Вы можете попробовать REST Assured , что делает его очень просто тестировать службы REST и проверять ответ в Java (используя JUnit или TestNG).

ответил Johan 27 MonEurope/Moscow2010-12-27T11:14:17+03:00Europe/Moscow12bEurope/MoscowMon, 27 Dec 2010 11:14:17 +0300 2010, 11:14:17
0

Как сказал Джеймс; Для Джерси существует тестовая структура для Джерси. Простой пример "Привет, мир!" Может быть таким:

pom.xml для интеграции с Maven. Когда вы запускаете mvn test. Каркасы запускают контейнер гризли. Вы можете использовать причал или кота, изменяя зависимости.

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

Вы можете проверить этот пример приложения.

ответил Fırat KÜÇÜK 25 FebruaryEurope/MoscowbWed, 25 Feb 2015 21:10:57 +0300000000pmWed, 25 Feb 2015 21:10:57 +030015 2015, 21:10:57
0

Хотя уже слишком поздно с даты публикации вопроса, подумал, что это может быть полезно для тех, у кого похожий вопрос. Джерси поставляется с тестовой платформой под названием Джерси каркас для тестирования , которая позволяет вам тестировать свой RESTful Веб-сервис, включая коды статуса ответа. Вы можете использовать его для запуска тестов на легких контейнерах, таких как Grizzly, HTTPServer и /или EmbeddedGlassFish. Кроме того, инфраструктура может использоваться для запуска ваших тестов на обычном веб-контейнере, таком как GlassFish или Tomcat.

ответил 10 J0000006Europe/Moscow 2009, 10:32:50
0

Вы, вероятно, написали некоторый код Java, который реализует вашу бизнес-логику, а затем сгенерировали для него конечную точку веб-служб.

Важно сделать независимую проверку своей бизнес-логики. Поскольку это чистый код Java, вы можете сделать это с помощью обычных тестов JUnit.

Теперь, поскольку часть веб-сервисов - это всего лишь конечная точка, вы должны убедиться, что сгенерированная сантехника (заглушки и т. д.) синхронизирована с вашим Java-кодом. Вы можете сделать это, написав тесты JUnit, которые вызывают сгенерированные Java-клиенты веб-службы. Это позволит вам узнать, когда вы измените свои подписи Java без обновления содержимого веб-служб.

Если ваша система веб-служб автоматически генерируется системой сборки при каждой сборке, то может не потребоваться тестировать конечные точки (при условии, что все они созданы правильно). Зависит от вашего уровня паранойи.

ответил entzik 23 rdEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 23 Sep 2008 18:46:50 +0400 2008, 18:46:50
0

Взгляните на генератор клиента отдыха алхимии . Это может сгенерировать реализацию прокси для вашего класса веб-сервиса JAX-RS, используя клиент-джерси за кулисами. По сути, вы будете называть вас методами веб-сервиса как простые java-методы из ваших модульных тестов. Также обрабатывает HTTP-аутентификацию.

Генерация кода не требуется, если вам нужно просто запустить тесты, чтобы это было удобно.

Отказ от ответственности: я являюсь автором этой библиотеки.

ответил Ashish Shinde 27 Maypm15 2015, 14:46:18
0
  
    

Важно сделать, чтобы самостоятельно проверить свою бизнес-логику

  

Я, конечно, не предполагал бы, что человек, который написал код JAX-RS и ищет модульное тестирование интерфейса, каким-то причудливым, необъяснимым причинам не замечает, что он или она может тестировать другие части Программа, в том числе бизнес-логики. Вряд ли полезно заявлять об очевидном, и неоднократно отмечалось, что ответы также необходимо проверять.

На Jersey и RESTEasy есть клиентские приложения, и в случае RESTEasy вы можете использовать одни и те же аннотации (даже исключая аннотированный интерфейс и его использование на стороне клиента и сервера ваших тестов).

ОТДЫХАЙТЕ не то, что этот сервис может сделать для вас; ОТДЫХАЙТЕ, что вы можете сделать для этой услуги.

ответил 5 AM000000120000005831 2009, 00:39:58
0

Как я понимаю, основной целью автора этой проблемы является отделение слоя JAX RS от бизнес-уровня. И юнит тест только первый. Здесь необходимо решить две основные проблемы:

  1. Запустите на тестировании какой-нибудь сервер /сервер приложений, поместите компоненты JAX RS в Это. И только их.
  2. Ложные бизнес-сервисы внутри JAX RS слой компонентов /REST.

Первый решается с помощью Arquillian. Второй прекрасно описан в arquillican and 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. Здесь используется конфигурация JAX RS без web.xml.
  2. Здесь используется JAX RS Client (без RESTEasy /Jersey, они предоставляют более удобный API)
  3. Когда начинается тест, бегун Аркиллиана начинает работать. Здесь вы можете найти, как настроить тесты для Arquillian с необходимым сервером приложений.
  4. В зависимости от выбранного сервера приложений, URL в Тест будет немного отличаться. Можно использовать другой порт. 8181 используется Glassfish Embedded в моем примере.

Надеюсь, это поможет.

ответил Alexandr 31 J000000Friday15 2015, 13:47:37

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132