একটি JAX-RS ওয়েব পরিষেবা পরীক্ষা করছেন?


84

আমি বর্তমানে একটি JAX-RS (RESTful ওয়েব পরিষেবাদির জন্য জাভা API) ভিত্তিক ওয়েব পরিষেবাদির জন্য স্বয়ংক্রিয় পরীক্ষার তৈরি করার উপায়গুলি খুঁজছি ।

মূলত এটির নির্দিষ্ট ইনপুটগুলি প্রেরণ করার জন্য এবং আমার প্রত্যাশিত প্রতিক্রিয়াগুলি আছে কিনা তা যাচাই করার জন্য আমার একটি উপায় প্রয়োজন। আমি JUnit এর মাধ্যমে এটি করতে পছন্দ করব, তবে কীভাবে এটি অর্জন করা যায় তা আমি নিশ্চিত নই।

আপনার ওয়েব পরিষেবাদি পরীক্ষা করতে আপনি কোন পদ্ধতির ব্যবহার করেন?

আপডেট: এনটজিক যেমন উল্লেখ করেছেন, ব্যবসায়িক যুক্তি থেকে ওয়েব পরিষেবাটি ডিকুয়াল করা আমাকে ব্যবসায়ের যুক্তি পরীক্ষা করার অনুমতি দেয়। তবে, আমি সঠিক HTTP স্থিতি কোড ইত্যাদির জন্যও পরীক্ষা করতে চাই


6
ভাল প্রশ্ন - তবে আমি বলব যে আপনি যদি HTTP- র মাধ্যমে পরীক্ষা করে থাকেন তবে তা আমাকে আঘাত করে যে এটি ইন্টিগ্রেশন টেস্ট।
টম ডাকারিং

টম তুমি একদম সঠিক. আমাদের এটির জন্য একটি ডামি এইচটিটিপি এমুলেটর / লাইটওয়েট ধারক ইনজেক্ট করা উচিত। নোড.জেজেসে বিশ্বের সেরা এটি তৈরি করে। আপনি এক্সপ্রেস.জেএস অনুকরণ করতে পারেন।
Fırat KÜÇÜK

উত্তর:


34

জার্সি একটি দুর্দান্ত রেস্টস্টুল ক্লায়েন্ট এপিআই নিয়ে আসে যা ইউনিট পরীক্ষাগুলি লেখার পক্ষে সহজ করে তোলে। জার্সির সাথে যে উদাহরণগুলি পাঠানো হয় সেগুলিতে ইউনিট পরীক্ষাগুলি দেখুন। আমরা বিশ্রাম সমর্থন পরীক্ষা করার জন্য এই পদ্ধতির ব্যবহার এ্যাপাচি উটের , আপনি আগ্রহী হলে পরীক্ষার বিষয় এখানে আছেন


6
পুনরায়: এখন খারাপ লিঙ্কটি জার্সি / নমুনাগুলিতে উল্লিখিত উদাহরণগুলি ইউনিট পরীক্ষাগুলি দেখায়, মূলত জার্সির গ্রাহকরা ওয়েব সংস্থান গ্রহণের জন্য ব্যবহার করে find ডাউনলোড.
java.net/maven/2/com/sun/jersey/sample/bookstore/…

4
এই প্রকল্পটি গিটিহাব
ভেঙ্কট

4
আমি এই উত্তরটিতে সন্দেহ করি না, তবে আমি এটি অবিশ্বাস্যরকম মজার মনে করি যে জার্সি সর্বদা একটি JAX-RS কথোপকথনে প্রবেশ করে, যখন কোনও কোনও ক্ষেত্রে (ওয়েবস্পিয়ার, দুর্ভাগ্যবশত, সঠিক হতে) এটি অনুপলব্ধ এবং সমস্ত গ্রহণযোগ্য উত্তরগুলির 99% রেন্ডার করে when স্ট্যাক ওভারফ্লো নাল এবং অকার্যকর।

26

আপনি REST আশ্বাস চেষ্টা করে দেখতে পারেন যা REST পরিষেবাদি পরীক্ষা করা এবং জাভাতে (JUnit বা TestNG ব্যবহার করে) প্রতিক্রিয়াটিকে বৈধ করে তোলা খুব সহজ করে তোলে ।


4
লাইব্রেরিটি দেখতে ভাল লাগার কারণে আমি আপনার পোস্টটি দিয়েছিলাম, তবে তারা নিশ্চিতভাবে প্রচুর নির্ভরশীল জার ব্যবহার করে ...
পেরি ট্যু

18

জেমস যেমন বলেছিলেন; জার্সির জন্য অন্তর্নির্মিত পরীক্ষার কাঠামো রয়েছে । একটি সাধারণ হ্যালো বিশ্বের উদাহরণ এটির মতো হতে পারে:

maven সংহতকরণের জন্য pom.xml ml আপনি যখন দৌড়াবেন 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>
...

উদাহরণ অ্যাপ.জভা

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

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

}

হ্যালো ওয়ার্ল্ড.জভা

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!";
    }
}

হ্যালো ওয়ার্ল্ড টেস্ট.জভা

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

আপনি এই নমুনা অ্যাপ্লিকেশন চেক করতে পারেন ।


জার্সির ২.২ .1 .১ এর সাথে, আমাকে jersey-hk2নির্ভরতা হিসাবে যুক্ত করতে হয়েছিল কারণ আমি একটি java.lang.IllegalStateException: InjectionManagerFactoryখুঁজে পাওয়া যায়নি ত্রুটি পেয়েছি ( এই প্রশ্নটি দেখুন )। অন্যথায় এই উদাহরণটি ভাল কাজ করে।
সারা এন

7

আপনি সম্ভবত কিছু জাভা কোড লিখেছেন যা আপনার ব্যবসায়ের যুক্তি প্রয়োগ করে এবং তারপরে আপনি ওয়েব পরিষেবাদির শেষ পয়েন্টটি তৈরি করেছেন।

একটি গুরুত্বপূর্ণ জিনিস হ'ল স্বাধীনভাবে আপনার ব্যবসার যুক্তি পরীক্ষা করা। এটি খাঁটি জাভা কোড হিসাবে আপনি নিয়মিত JUnit পরীক্ষার মাধ্যমে এটি করতে পারেন।

এখন, যেহেতু ওয়েব পরিষেবাদি অংশটি একটি শেষ পয়েন্ট, আপনি যা নিশ্চিত করতে চান তা হ'ল উত্পন্ন প্লাম্বিং (স্টাব ইত্যাদি) আপনার জাভা কোডের সাথে সুসংগত। আপনি JUnit পরীক্ষা লিখে যা জেনারেটেড ওয়েব পরিষেবা জাভা ক্লায়েন্টকে অনুরোধ করে তা করতে পারেন। ওয়েব পরিষেবাগুলির স্টাফ আপডেট না করে আপনি যখন জাভা স্বাক্ষরগুলি পরিবর্তন করবেন তখন এটি আপনাকে জানাবে।

যদি আপনার ওয়েব পরিষেবাদি নদীর গভীরতানির্ণয় প্রতিটি বিল্ডে আপনার বিল্ড সিস্টেম দ্বারা স্বয়ংক্রিয়ভাবে উত্পন্ন হয়, তবে শেষের পয়েন্টগুলি পরীক্ষা করা প্রয়োজন হবে না (ধরে নিলে এটি সব সঠিকভাবে উত্পন্ন হয়েছে)। আপনার প্যারানিয়া স্তরের উপর নির্ভর করে।


4
আপনি বেশ সঠিক, যদিও আমারও ফিরে আসা সত্যিকারের এইচটিটিপি প্রতিক্রিয়াগুলি বিশেষত এইচটিটিপি স্থিতির কোডগুলি পরীক্ষা করা দরকার।
আইনার

6

যদিও প্রশ্ন পোস্ট করার তারিখ থেকে খুব দেরি হয়ে গেছে, ভেবেছিলেন এটি একইরকম প্রশ্নযুক্ত অন্যদের জন্য দরকারী। জার্সি জার্সি টেস্ট ফ্রেমওয়ার্ক নামে একটি পরীক্ষার কাঠামো নিয়ে আসে যা আপনাকে প্রতিক্রিয়া স্থিতি কোডগুলি সহ আপনার RESTful ওয়েব পরিষেবা পরীক্ষা করতে দেয়। গ্রিজলি, এইচটিটিপিএসবার এবং / অথবা এম্বেডড গ্লাস ফিশের মতো হালকা ওজনের পাত্রে আপনার পরীক্ষা চালাতে আপনি এটি ব্যবহার করতে পারেন। এছাড়াও, কাঠামোটি গ্লাস ফিশ বা টমক্যাটের মতো নিয়মিত ওয়েব ধারক হিসাবে আপনার পরীক্ষা চালাতে ব্যবহৃত হতে পারে।


কল হ্যান্ডলারদের উপহাস করার জন্য কী কী আপনার একটি ভাল উদাহরণ রয়েছে? জার্সিএইচটিপকল -> মাই রিসোর্স -> কলহ্যান্ডলিআরজেটসোমথিং () আমরা কীভাবে এখানে কলহ্যান্ডলারকে উপহাস করতে পারি?
বালাজী বোগগ্রাম রমনারায়ণ

3

রেস্টফল সার্ভিসেসে কল করতে আমি অ্যাপাচের HTTPClient (http://hc.apache.org/) ব্যবহার করি । এইচটিটিপি ক্লায়েন্ট লাইব্রেরি আপনাকে সহজেই পেতে, পোস্ট করতে বা আপনার যা প্রয়োজন অপারেশন সম্পাদন করতে দেয়। যদি আপনার পরিষেবাটি এক্সএমএল বাইন্ডিংয়ের জন্য জ্যাক্সবি ব্যবহার করে, আপনি এইচটিটিপি অনুরোধ থেকে ইনপুট এবং আউটপুটকে সিরিয়ালাইজ করতে এবং ডিজিটালাইজ করতে একটি JAXBContext তৈরি করতে পারেন।


3

কটাক্ষপাত রসায়ন বাকি ক্লায়েন্ট জেনারেটর । এটি দৃশ্যের পিছনে জার্সি ক্লায়েন্ট ব্যবহার করে আপনার JAX-RS ওয়েবসার্চ ক্লাসের জন্য একটি প্রক্সি বাস্তবায়ন তৈরি করতে পারে। কার্যকরভাবে আপনি আপনার ইউনিট পরীক্ষাগুলি থেকে ওয়েব জাওয়ার পদ্ধতিগুলিকে সাধারণ জাভা পদ্ধতি হিসাবে কল করবেন। পাশাপাশি http প্রমাণীকরণ পরিচালনা করে।

আপনার যদি সহজভাবে পরীক্ষা চালানোর প্রয়োজন হয় তবে এটি সুবিধাজনক এমন কোনও কোড জেনারেশন জড়িত নেই।

অস্বীকৃতি: আমি এই গ্রন্থাগারের লেখক।


2

সহজবোধ্য রাখো. Https://github.com/uthor4j/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...

1

একটি গুরুত্বপূর্ণ জিনিস হ'ল স্বাধীনভাবে আপনার ব্যবসার যুক্তি পরীক্ষা করা

আমি অবশ্যই ধরে নিব না যে যে ব্যক্তি জ্যাকস-আরএস কোড লিখেছেন এবং ইন্টারফেসটি একক হিসাবে দেখছেন তিনি কোনওরকম উদ্ভট, অনিবার্য কারণে, এই ধারণা থেকে অবগত নন যে তিনি বা তিনি প্রোগ্রামের অন্যান্য অংশগুলির পরীক্ষা করতে পারেন, ব্যবসায় যুক্তি ক্লাস সহ। এটি সুস্পষ্টভাবে বর্ণনা করা খুব কমই সহায়ক এবং বিষয়টি বারবার তৈরি হয়েছিল যে প্রতিক্রিয়াগুলিও পরীক্ষা করা দরকার।

জার্সি এবং RESTEasy উভয়ের ক্লায়েন্ট অ্যাপ্লিকেশন রয়েছে এবং RESTEasy এর ক্ষেত্রে আপনি একই মন্তব্যগুলি ব্যবহার করতে পারেন (এমনকি টীকাগুলি ইন্টারফেস তৈরি করতে পারেন এবং আপনার পরীক্ষার ক্লায়েন্ট এবং সার্ভার দিকে ব্যবহার করতে পারেন)।

এই পরিষেবাটি আপনার জন্য কি করতে পারে তা বিশ্রাম নিন না; এই পরিষেবার জন্য আপনি কী করতে পারেন বিশ্রাম দিন।


লোকেরা কিছু ক্রস কাটা উদ্বেগ পরীক্ষা করতে চাইতে পারে। উদাহরণস্বরূপ বৈধতা, প্রমাণীকরণ, পছন্দসই এইচটিটিপি শিরোনাম ইত্যাদি So
Fırat KÜÇÜK

আমার অ্যাপ্লিকেশনটিতে, আমি মডেলপ্যাপারটি "ডিটিও" ক্লাস থেকে "ব্যবসায়িক অবজেক্ট" শ্রেণিতে "মানচিত্র" করতে ব্যবহার করি, যা অন্তর্নিহিত "পরিষেবা" শ্রেণি দ্বারা বোঝা যায়। এটি এমন কিছুর উদাহরণ যা স্বতন্ত্রভাবে পরীক্ষা করা ভাল।
জেকেরাক

এবং কখনও কখনও আরআরইএসটি অ্যাপলেটটির এত কম জটিলতা থাকে যে আমার বর্তমান ক্ষেত্রে যেমন মকসটি অ্যাপ্লিকেশন স্তরের চেয়ে বড় হবে। :)
tekHedd

1

যেহেতু আমি বুঝতে পারি যে এই ইস্যুটির সত্যিকারের প্রধান উদ্দেশ্য হ'ল জ্যাক্স আরএস স্তরটিকে ব্যবসায় থেকে ডিক্লোল করা। এবং ইউনিট পরীক্ষা শুধুমাত্র প্রথম এক। দুটি মূল সমস্যা এখানে সমাধান করতে হবে:

  1. পরীক্ষামূলকভাবে কিছু ওয়েব / অ্যাপ্লিকেশন সার্ভার চালান, এতে জ্যাক্স আরএস উপাদান রাখুন। এবং শুধুমাত্র তাদের।
  2. জ্যাক্স আরএস উপাদানগুলি / আরএসটি স্তরের মধ্যে ব্যবসায়িক পরিষেবাগুলিকে মক করুন।

প্রথমটি আর্কিলিয়ান দিয়ে সমাধান করা হয়। দ্বিতীয়টি আর্কিলিকান এবং উপহাসে পুরোপুরি বর্ণিত হয়েছে

কোডটির একটি উদাহরণ এখানে দেওয়া হয়েছে, আপনি যদি অন্য অ্যাপ্লিকেশন সার্ভার ব্যবহার করেন তবে এটির চেয়ে আলাদা হতে পারে তবে আমি আশা করি আপনি মূল ধারণা এবং সুবিধাগুলি পাবেন।

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. ওয়েব.এক্সএমএল ছাড়াই জ্যাক্স আরএস কনফিগারেশন এখানে ব্যবহৃত হয়।
  2. জ্যাক্স আরএস ক্লায়েন্ট এখানে ব্যবহৃত হয় (কোনও বিশ্রাম / জার্সি নেই, তারা আরও সুবিধাজনক এপিআই প্রকাশ করে)
  3. যখন পরীক্ষা শুরু হয়, আর্কিলিয়ান রানার কাজ শুরু করে। এখানে আপনি প্রয়োজনীয় অ্যাপ্লিকেশন সার্ভারের সাহায্যে আরকিলিয়ানের জন্য পরীক্ষাগুলি কনফিগার করতে পারেন তা আবিষ্কার করতে পারেন।
  4. নির্বাচিত অ্যাপ্লিকেশন সার্ভারের উপর নির্ভর করে পরীক্ষার একটি ইউআরএল কিছুটা আলাদা হবে। অন্য একটি বন্দর ব্যবহার করা যেতে পারে। 8181 আমার উদাহরণে গ্লাস ফিশ এম্বেড ব্যবহার করেছেন।

আশা করি, এটি সাহায্য করবে


এই জাতীয় জিনিসটি জার্সি পরীক্ষার কাঠামোর অন্তর্নির্মিত দ্বারা সমর্থিত? আমি জার্সির সাথে ইতিমধ্যে কিছু উপলভ্য থাকলে আমার প্রকল্পে "আরও একটি কাঠামো" এবং এর সমস্ত জার যুক্ত করতে আমি দ্বিধাগ্রস্ত।
জেকেরাক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.