JUnit ব্যবহার করে আমার সার্লেটটি কীভাবে পরীক্ষা করবেন


112

আমি জাভা সার্লেটস ব্যবহার করে একটি ওয়েব সিস্টেম তৈরি করেছি এবং এখন JUnit পরীক্ষা করতে চাই। আমার dataManagerকোডের কেবল একটি বেসিক টুকরা যা এটি ডাটাবেসে জমা দেয়। আপনি কীভাবে জুনিতের সাথে একটি সার্লেট পরীক্ষা করবেন?

আমার কোড উদাহরণ যা কোনও ব্যবহারকারীকে রেজিস্ট্রেশন / সাইন আপ করতে দেয় যা এজেএক্স এর মাধ্যমে আমার প্রধান পৃষ্ঠা থেকে জমা দেওয়া হয়েছে:

public void doPost(HttpServletRequest request, HttpServletResponse response) 
         throws ServletException, IOException{

    // Get parameters
    String userName = request.getParameter("username");
    String password = request.getParameter("password");
    String name = request.getParameter("name");

    try {

        // Load the database driver
        Class.forName("com.mysql.jdbc.Driver");

        //pass reg details to datamanager       
        dataManager = new DataManager();
        //store result as string
        String result = dataManager.register(userName, password, name);

        //set response to html + no cache
        response.setContentType("text/html");
        response.setHeader("Cache-Control", "no-cache");
        //send response with register result
        response.getWriter().write(result);

    } catch(Exception e){
        System.out.println("Exception is :" + e);
    }  
}

উত্তর:


169

মোকটি সঠিক প্যারামগুলি ফিরিয়ে আনার জন্য মকিতো ব্যবহার করে এটি করতে পারেন, সেগুলি সত্যই ডাকা হয়েছে তা যাচাই করুন ( allyচ্ছিকভাবে বারের সংখ্যা নির্দিষ্ট করুন), 'ফলাফল' লিখুন এবং এটি সঠিক তা যাচাই করুন।

import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
import java.io.*;
import javax.servlet.http.*;
import org.apache.commons.io.FileUtils;
import org.junit.Test;

public class TestMyServlet extends Mockito{

    @Test
    public void testServlet() throws Exception {
        HttpServletRequest request = mock(HttpServletRequest.class);       
        HttpServletResponse response = mock(HttpServletResponse.class);    

        when(request.getParameter("username")).thenReturn("me");
        when(request.getParameter("password")).thenReturn("secret");

        StringWriter stringWriter = new StringWriter();
        PrintWriter writer = new PrintWriter(stringWriter);
        when(response.getWriter()).thenReturn(writer);

        new MyServlet().doPost(request, response);

        verify(request, atLeast(1)).getParameter("username"); // only if you want to verify username was called...
        writer.flush(); // it may not have been flushed yet...
        assertTrue(stringWriter.toString().contains("My expected string"));
    }
}

এইভাবে, আপনি কীভাবে প্রতিক্রিয়াতে "ক্যাশে-নিয়ন্ত্রণ" সেট করা হচ্ছে তা নিশ্চিত করবেন?
মার্কাস শুল্টে

34
ডিস্কে কোনও আসল ফাইলে মুদ্রণের পরিবর্তে, আপনি স্ট্রিং রাইটার (মুদ্রণ-লেখকের নির্মাণকারীর প্যারামিটার হিসাবে) ব্যবহার করতে পারেন। তারপরে আপনি দৃsert়প্রত্যয় (স্ট্রিংট্রাইটার.টো স্ট্রিং ()। এ ("আমার প্রত্যাশিত স্ট্রিং") থাকে); এইভাবে, পরীক্ষাটি ডিস্কের পরিবর্তে মেমরিটি পড়বে / লিখবে।
SPG

@ আরোনভর্গাস: উত্তর দেওয়ার জন্য আপনাকে ধন্যবাদ! তবে আমি যখন আপনার কোডটি কার্যকর করি, তখন আমি নিম্নলিখিত ত্রুটিটি পেয়েছি: java.util.MissingResourceException: বেস নাম javax.servlet.LocalStrings, লোকেল ডি_ডি জন্য বান্ডিল খুঁজে পাচ্ছি না - এটি নতুন মাই সার্ভালেট () এর সম্পাদনের সময় ঘটে () .পোস্ট ( ...)। কোন ধারণা কি ভেঙে যেতে পারে?
বেনি নিউজবাউয়ার

1
@ বেনিনিউজবাউয়ার, বান্ডেলগুলি ক্লাসপথে নেই বলে মনে হচ্ছে। আমি অন্য JUnit পরীক্ষা লিখব যা সমস্যাটি বিচ্ছিন্ন করতে কেবল বান্ডেল থেকে একটি মান পায়।
অ্যারোনভার্গাস

@ আরোনভর্গাস, আপনার মতামতের জন্য ধন্যবাদ! আমি এর জন্য একটি সমাধান খুঁজে পেয়েছি। আমার pom.xML এ আমার নির্ভরতার উপর "javax.servlet-api" করতে হয়েছিল।
বেনি নিউজবাউয়ার 21

49

প্রথমে, সত্যিকারের অ্যাপ্লিকেশনটিতে আপনি কোনও সার্লেলে ডাটাবেস সংযোগের তথ্য কখনও পাবেন না; আপনি এটি আপনার অ্যাপ্লিকেশন সার্ভারে কনফিগার করতে পারেন।

কনটেইনারটি না চালিয়ে সার্ভলেটগুলি পরীক্ষা করার উপায় রয়েছে। একটি হ'ল মক অবজেক্ট ব্যবহার করা। এইচটিপিএস সার্লেট্রেক্সেস্ট, এইচটিটিপি সার্লেট্রেস্পোনস, এইচটিটিপি সার্ভেলিটেশন ইত্যাদি ইত্যাদির জন্য স্প্রিং খুব দরকারী উপহাসের একটি সেট সরবরাহ করে:

http://static.springsource.org/spring/docs/3.0.x/api/org/springframework/mock/web/package-summary.html

এই বিদ্রূপগুলি ব্যবহার করে, আপনি পছন্দ মতো জিনিস পরীক্ষা করতে পারেন

যদি ব্যবহারকারীর নামটি অনুরোধে না থাকে তবে কী হবে?

অনুরোধে ব্যবহারকারীর নাম থাকলে কী হবে?

ইত্যাদি

তারপরে আপনি এই জাতীয় জিনিসগুলি করতে পারেন:

import static org.junit.Assert.assertEquals;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.junit.Before;
import org.junit.Test;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;

public class MyServletTest {
    private MyServlet servlet;
    private MockHttpServletRequest request;
    private MockHttpServletResponse response;

    @Before
    public void setUp() {
        servlet = new MyServlet();
        request = new MockHttpServletRequest();
        response = new MockHttpServletResponse();
    }

    @Test
    public void correctUsernameInRequest() throws ServletException, IOException {
        request.addParameter("username", "scott");
        request.addParameter("password", "tiger");

        servlet.doPost(request, response);

        assertEquals("text/html", response.getContentType());

        // ... etc
    }
}

3

আমি একীকরণ বা কার্যকরী (শেষ থেকে শেষ) পরীক্ষার সাথে সেলেনিয়াম পরীক্ষাগুলি আরও দরকারী বলে মনে করি। আমি org.springframework.mock.web ব্যবহার করার চেষ্টা করে কাজ করছি , তবে আমি খুব বেশি দূরে নই। আমি একটি জেমক সহ একটি নমুনা নিয়ামক সংযুক্ত করছি পরীক্ষার স্যুট ।

প্রথম, নিয়ামক:

package com.company.admin.web;

import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.bind.support.SessionStatus;

import com.company.admin.domain.PaymentDetail;
import com.company.admin.service.PaymentSearchService;
import com.company.admin.service.UserRequestAuditTrail;
import com.company.admin.web.form.SearchCriteria;

/**
 * Controls the interactions regarding to the refunds.
 * 
 * @author slgelma
 *
 */
@Controller
@SessionAttributes({"user", "authorization"})
public class SearchTransactionController {

    public static final String SEARCH_TRANSACTION_PAGE = "searchtransaction";

    private PaymentSearchService searchService;
    //private Validator searchCriteriaValidator;
    private UserRequestAuditTrail notifications;

    @Autowired
    public void setSearchService(PaymentSearchService searchService) {
        this.searchService = searchService;
    }

    @Autowired
    public void setNotifications(UserRequestAuditTrail notifications) {
        this.notifications = notifications;
    }

    @RequestMapping(value="/" + SEARCH_TRANSACTION_PAGE)
    public String setUpTransactionSearch(Model model) {
        SearchCriteria searchCriteria = new SearchCriteria();
        model.addAttribute("searchCriteria", searchCriteria);
        notifications.transferTo(SEARCH_TRANSACTION_PAGE);
        return SEARCH_TRANSACTION_PAGE;
    }

    @RequestMapping(value="/" + SEARCH_TRANSACTION_PAGE, method=RequestMethod.POST, params="cancel")
    public String cancelSearch() {
        notifications.redirectTo(HomeController.HOME_PAGE);
        return "redirect:/" + HomeController.HOME_PAGE;
    }

    @RequestMapping(value="/" + SEARCH_TRANSACTION_PAGE, method=RequestMethod.POST, params="execute")
    public String executeSearch(
            @ModelAttribute("searchCriteria") @Valid SearchCriteria searchCriteria,
            BindingResult result, Model model,
            SessionStatus status) {
        //searchCriteriaValidator.validate(criteria, result);
        if (result.hasErrors()) {
            notifications.transferTo(SEARCH_TRANSACTION_PAGE);
            return SEARCH_TRANSACTION_PAGE;
        } else {
            PaymentDetail payment = 
                searchService.getAuthorizationFor(searchCriteria.geteWiseTransactionId());
            if (payment == null) {
                ObjectError error = new ObjectError(
                        "eWiseTransactionId", "Transaction not found");
                result.addError(error);
                model.addAttribute("searchCriteria", searchCriteria);
                notifications.transferTo(SEARCH_TRANSACTION_PAGE);
                return SEARCH_TRANSACTION_PAGE;
            } else {
                model.addAttribute("authorization", payment);
                notifications.redirectTo(PaymentDetailController.PAYMENT_DETAIL_PAGE);
                return "redirect:/" + PaymentDetailController.PAYMENT_DETAIL_PAGE;
            }
        }
    }

}

পরবর্তী, পরীক্ষা:

    package test.unit.com.company.admin.web;

    import static org.hamcrest.Matchers.containsString;
    import static org.hamcrest.Matchers.equalTo;
    import static org.junit.Assert.assertThat;

    import org.jmock.Expectations;
    import org.jmock.Mockery;
    import org.jmock.integration.junit4.JMock;
    import org.jmock.integration.junit4.JUnit4Mockery;
    import org.junit.Before;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.ui.Model;
    import org.springframework.validation.BindingResult;
    import org.springframework.validation.ObjectError;
    import org.springframework.web.bind.support.SessionStatus;

    import com.company.admin.domain.PaymentDetail;
    import com.company.admin.service.PaymentSearchService;
    import com.company.admin.service.UserRequestAuditTrail;
    import com.company.admin.web.HomeController;
    import com.company.admin.web.PaymentDetailController;
    import com.company.admin.web.SearchTransactionController;
    import com.company.admin.web.form.SearchCriteria;

    /**
     * Tests the behavior of the SearchTransactionController.
     * @author slgelma
     *
     */
    @RunWith(JMock.class)
    public class SearchTransactionControllerTest {

        private final Mockery context = new JUnit4Mockery(); 
        private final SearchTransactionController controller = new SearchTransactionController();
        private final PaymentSearchService searchService = context.mock(PaymentSearchService.class);
        private final UserRequestAuditTrail notifications = context.mock(UserRequestAuditTrail.class);
        private final Model model = context.mock(Model.class);


        /**
         * @throws java.lang.Exception
         */
        @Before
        public void setUp() throws Exception {
            controller.setSearchService(searchService);
            controller.setNotifications(notifications);
        }

        @Test
        public void setUpTheSearchForm() {

            final String target = SearchTransactionController.SEARCH_TRANSACTION_PAGE;

            context.checking(new Expectations() {{
                oneOf(model).addAttribute(
                        with(any(String.class)), with(any(Object.class)));
                oneOf(notifications).transferTo(with(any(String.class)));
            }});

            String nextPage = controller.setUpTransactionSearch(model);
            assertThat("Controller is not requesting the correct form", 
                    target, equalTo(nextPage));
        }

        @Test
        public void cancelSearchTest() {

            final String target = HomeController.HOME_PAGE;

            context.checking(new Expectations(){{
                never(model).addAttribute(with(any(String.class)), with(any(Object.class)));
                oneOf(notifications).redirectTo(with(any(String.class)));
            }});

            String nextPage = controller.cancelSearch();
            assertThat("Controller is not requesting the correct form", 
                    nextPage, containsString(target));
        }

        @Test
        public void executeSearchWithNullTransaction() {

            final String target = SearchTransactionController.SEARCH_TRANSACTION_PAGE;

            final SearchCriteria searchCriteria = new SearchCriteria();
            searchCriteria.seteWiseTransactionId(null);

            final BindingResult result = context.mock(BindingResult.class);
            final SessionStatus status = context.mock(SessionStatus.class);

            context.checking(new Expectations() {{
                allowing(result).hasErrors(); will(returnValue(true));
                never(model).addAttribute(with(any(String.class)), with(any(Object.class)));
                never(searchService).getAuthorizationFor(searchCriteria.geteWiseTransactionId());
                oneOf(notifications).transferTo(with(any(String.class)));
            }});

            String nextPage = controller.executeSearch(searchCriteria, result, model, status);
            assertThat("Controller is not requesting the correct form", 
                    target, equalTo(nextPage));
        }

        @Test
        public void executeSearchWithEmptyTransaction() {

            final String target = SearchTransactionController.SEARCH_TRANSACTION_PAGE;

            final SearchCriteria searchCriteria = new SearchCriteria();
            searchCriteria.seteWiseTransactionId("");

            final BindingResult result = context.mock(BindingResult.class);
            final SessionStatus status = context.mock(SessionStatus.class);

            context.checking(new Expectations() {{
                allowing(result).hasErrors(); will(returnValue(true));
                never(model).addAttribute(with(any(String.class)), with(any(Object.class)));
                never(searchService).getAuthorizationFor(searchCriteria.geteWiseTransactionId());
                oneOf(notifications).transferTo(with(any(String.class)));
            }});

            String nextPage = controller.executeSearch(searchCriteria, result, model, status);
            assertThat("Controller is not requesting the correct form", 
                    target, equalTo(nextPage));
        }

        @Test
        public void executeSearchWithTransactionNotFound() {

            final String target = SearchTransactionController.SEARCH_TRANSACTION_PAGE;
            final String badTransactionId = "badboy"; 
            final PaymentDetail transactionNotFound = null;

            final SearchCriteria searchCriteria = new SearchCriteria();
            searchCriteria.seteWiseTransactionId(badTransactionId);

            final BindingResult result = context.mock(BindingResult.class);
            final SessionStatus status = context.mock(SessionStatus.class);

            context.checking(new Expectations() {{
                allowing(result).hasErrors(); will(returnValue(false));
                atLeast(1).of(model).addAttribute(with(any(String.class)), with(any(Object.class)));
                oneOf(searchService).getAuthorizationFor(with(any(String.class)));
                    will(returnValue(transactionNotFound));
                oneOf(result).addError(with(any(ObjectError.class)));
                oneOf(notifications).transferTo(with(any(String.class)));
            }});

            String nextPage = controller.executeSearch(searchCriteria, result, model, status);
            assertThat("Controller is not requesting the correct form", 
                    target, equalTo(nextPage));
        }

        @Test
        public void executeSearchWithTransactionFound() {

            final String target = PaymentDetailController.PAYMENT_DETAIL_PAGE;
            final String goodTransactionId = "100000010";
            final PaymentDetail transactionFound = context.mock(PaymentDetail.class);

            final SearchCriteria searchCriteria = new SearchCriteria();
            searchCriteria.seteWiseTransactionId(goodTransactionId);

            final BindingResult result = context.mock(BindingResult.class);
            final SessionStatus status = context.mock(SessionStatus.class);

            context.checking(new Expectations() {{
                allowing(result).hasErrors(); will(returnValue(false));
                atLeast(1).of(model).addAttribute(with(any(String.class)), with(any(Object.class)));
                oneOf(searchService).getAuthorizationFor(with(any(String.class)));
                    will(returnValue(transactionFound));
                oneOf(notifications).redirectTo(with(any(String.class)));
            }});

            String nextPage = controller.executeSearch(searchCriteria, result, model, status);
            assertThat("Controller is not requesting the correct form", 
                    nextPage, containsString(target));
        }

    }

আমি আশা করি এটি সাহায্য করতে পারে।


3

আপডেট ফেব্রুয়ারী 2018: ওপেনব্রেস লিমিটেড বন্ধ হয়ে গেছে , এবং এর ওবমিমিক পণ্য আর সমর্থিত নয়।

সার্ভলেট এপিআই টেস্ট-ডাবলস (প্রকাশ: আমি এর বিকাশকারী) এর ওপেনব্রেসের ওবমিমিক লাইব্রেরি ব্যবহার করে এখানে অন্য বিকল্প রয়েছে ।

package com.openbrace.experiments.examplecode.stackoverflow5434419;

import static org.junit.Assert.*;
import com.openbrace.experiments.examplecode.stackoverflow5434419.YourServlet;
import com.openbrace.obmimic.mimic.servlet.ServletConfigMimic;
import com.openbrace.obmimic.mimic.servlet.http.HttpServletRequestMimic;
import com.openbrace.obmimic.mimic.servlet.http.HttpServletResponseMimic;
import com.openbrace.obmimic.substate.servlet.RequestParameters;
import org.junit.Before;
import org.junit.Test;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * Example tests for {@link YourServlet#doPost(HttpServletRequest,
 * HttpServletResponse)}.
 *
 * @author Mike Kaufman, OpenBrace Limited
 */
public class YourServletTest {

    /** The servlet to be tested by this instance's test. */
    private YourServlet servlet;

    /** The "mimic" request to be used in this instance's test. */
    private HttpServletRequestMimic request;

    /** The "mimic" response to be used in this instance's test. */
    private HttpServletResponseMimic response;

    /**
     * Create an initialized servlet and a request and response for this
     * instance's test.
     *
     * @throws ServletException if the servlet's init method throws such an
     *     exception.
     */
    @Before
    public void setUp() throws ServletException {
        /*
         * Note that for the simple servlet and tests involved:
         * - We don't need anything particular in the servlet's ServletConfig.
         * - The ServletContext isn't relevant, so ObMimic can be left to use
         *   its default ServletContext for everything.
         */
        servlet = new YourServlet();
        servlet.init(new ServletConfigMimic());
        request = new HttpServletRequestMimic();
        response = new HttpServletResponseMimic();
    }

    /**
     * Test the doPost method with example argument values.
     *
     * @throws ServletException if the servlet throws such an exception.
     * @throws IOException if the servlet throws such an exception.
     */
    @Test
    public void testYourServletDoPostWithExampleArguments()
            throws ServletException, IOException {

        // Configure the request. In this case, all we need are the three
        // request parameters.
        RequestParameters parameters
            = request.getMimicState().getRequestParameters();
        parameters.set("username", "mike");
        parameters.set("password", "xyz#zyx");
        parameters.set("name", "Mike");

        // Run the "doPost".
        servlet.doPost(request, response);

        // Check the response's Content-Type, Cache-Control header and
        // body content.
        assertEquals("text/html; charset=ISO-8859-1",
            response.getMimicState().getContentType());
        assertArrayEquals(new String[] { "no-cache" },
            response.getMimicState().getHeaders().getValues("Cache-Control"));
        assertEquals("...expected result from dataManager.register...",
            response.getMimicState().getBodyContentAsString());

    }

}

মন্তব্য:

  • প্রতিটি "নকল" এর যৌক্তিক অবস্থার জন্য একটি "মিমিকস্টেট" অবজেক্ট থাকে। এটি সার্ভলেট এপিআই পদ্ধতি এবং মিমির অভ্যন্তরীণ অবস্থার কনফিগারেশন এবং পরিদর্শনের মধ্যে একটি স্পষ্ট পার্থক্য সরবরাহ করে।

  • আপনি অবাক হতে পারেন যে বিষয়বস্তুর ধরণের চেকটিতে "চারসেট = আইএসও -8859-1" অন্তর্ভুক্ত রয়েছে। তবে প্রদত্ত "ডওপোস্ট" কোডের জন্য এটি সার্ভলেট এপিআই জাভাদোক, এবং এইচটিটিপি সার্ভেলটেস্পসনের নিজস্ব গেটকন্টেন্ট টাইপ পদ্ধতি এবং যেমন গ্লাস ফিশ 3 এ উত্পাদিত আসল সামগ্রী-প্রকারের শিরোনাম অনুসারে এটি আপনি উপলব্ধি করতে পারবেন না যদি সাধারণ মক অবজেক্ট এবং আপনার এপিআই এর আচরণ সম্পর্কে নিজস্ব প্রত্যাশা। এক্ষেত্রে সম্ভবত এটি কোনও ব্যাপার নয়, তবে আরও জটিল ক্ষেত্রে এটি হ'ল অপ্রত্যাশিত এপিআই আচরণ যা বিদ্রূপকে কিছুটা উপহাস করতে পারে!

  • আমি response.getMimicState().getContentType()কন্টেন্টের ধরণটি পরীক্ষা করার এবং উপরের পয়েন্টটি চিত্রিত করার সহজতম উপায় হিসাবে ব্যবহার করেছি , তবে আপনি যদি (ব্যবহার করতে response.getMimicState().getContentTypeMimeType()) চান তবে আপনি নিজেরাই "টেক্সট / এইচটিএমএল" পরীক্ষা করতে পারেন । ক্যাশে-নিয়ন্ত্রণ শিরোনামের মতো কন্টেন্ট-টাইপ শিরোলেখ পরীক্ষা করাও কাজ করে।

  • এই উদাহরণের জন্য প্রতিক্রিয়া সামগ্রীটি চরিত্রের ডেটা হিসাবে পরীক্ষা করা হয় (এটি লেখকের এনকোডিং ব্যবহার করে)। আমরা এটিও পরীক্ষা করে দেখতে পারি যে প্রতিক্রিয়াটির লেখক তার আউটপুট স্ট্রিমের পরিবর্তে (ব্যবহার করা response.getMimicState().isWritingCharacterContent()) ব্যবহার করেছে , তবে আমি এটি গ্রহণ করেছি যে আমরা কেবল ফলাফলের ফলাফল নিয়েই উদ্বিগ্ন, এবং এপিআই কলগুলি কী উত্পন্ন করেছে তা বিবেচনা করে না (যদিও এটি হতে পারে) খুব চেক করা হয়েছে ...)। বাইট হিসাবে প্রতিক্রিয়াটির শরীরের সামগ্রী পুনরুদ্ধার করা, লেখক / আউটপুট স্ট্রিম ইত্যাদির বিশদ অবস্থা পরীক্ষা করাও সম্ভব possible

ওবমিমিকের সম্পূর্ণ বিবরণ এবং ওপেনব্রেস ওয়েবসাইটে একটি বিনামূল্যে ডাউনলোড রয়েছে । অথবা আপনার কোনও প্রশ্ন থাকলে আপনি আমার সাথে যোগাযোগ করতে পারেন (যোগাযোগের বিশদটি ওয়েবসাইটে রয়েছে)।


2

সম্পাদনা : ক্যাকটাস এখন একটি মৃত প্রকল্প: http://attic.apache.org/projects/jakarta-cactus.html


আপনি ক্যাকটাস তাকান করতে পারেন।

http://jakarta.apache.org/cactus/

প্রকল্প বর্ণনা

ক্যাকটাস ইউনিট টেস্টিং সার্ভার-সাইড জাভা কোডের জন্য একটি সাধারণ পরীক্ষার কাঠামো (সার্লেটস, ইজেবি, ট্যাগ লিবিস, ফিল্টার, ...)।

ক্যাকটাসের উদ্দেশ্যটি হ'ল সার্ভার-সাইড কোডের জন্য পরীক্ষার লেখার ব্যয়টি কম করা। এটি JUnit ব্যবহার করে এবং এটি প্রসারিত করে।

ক্যাকটাস একটি ইন-কন্টেইনার কৌশল প্রয়োগ করে, যার অর্থ ধারকগুলির ভিতরে পরীক্ষা চালানো হয়।


2

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

আপনি যেতে পারেন এমন কয়েকটি পৃথক রুট রয়েছে - সাধারণ দুটি হ'ল টমক্যাট এবং জেটি।

সতর্কতা: এম্বেড করার জন্য সার্ভারটি বেছে নেওয়ার সময় মনে রাখার মতো কিছু হ'ল আপনি ব্যবহার করছেন সার্লেট-এপিআইয়ের সংস্করণ (লাইব্রেরি যা এইচটিটিপি সার্ভলেটরেক্সেস্টের মতো ক্লাস সরবরাহ করে)। যদি আপনি 2.5 ব্যবহার করছেন, আমি জেটি 6.x ভালভাবে কাজ করতে দেখতে পেয়েছি (যা উদাহরণটি আমি নীচে দেব)। আপনি যদি সার্লেট-এপিআই 3.0 ব্যবহার করছেন তবে টমক্যাট -7 এমবেড করা স্টাফগুলি একটি ভাল বিকল্প বলে মনে হচ্ছে, তবে আমাকে যে অ্যাপ্লিকেশনটি পরীক্ষিত হয়েছিল তা সার্ভলেট-এপিআই 2.5 ব্যবহার করার জন্য আমার চেষ্টাটি ত্যাগ করতে হয়েছিল। দুটি মিশ্রিত করার চেষ্টা করার ফলে সার্ভারটি কনফিগার করার বা শুরু করার চেষ্টা করার সময় NoSuchMethod এবং এই জাতীয় ব্যতিক্রম ঘটবে।

আপনি এই জাতীয় সার্ভার সেট আপ করতে পারেন (জেটি 6.1.26, সার্লেট-এপিআই 2.5):

public void startServer(int port, Servlet yourServletInstance){
    Server server = new Server(port);
    Context root = new Context(server, "/", Context.SESSIONS);

    root.addServlet(new ServletHolder(yourServletInstance), "/servlet/context/path");

    //If you need the servlet context for anything, such as spring wiring, you coudl get it like this
    //ServletContext servletContext = root.getServletContext();

    server.start();
}

এছাড়াও, যদি আপনি নির্ভরতা ইনজেকশন অনুসন্ধান করে বেছে নেন তবে আপনি সম্ভবত বসন্তে চলে যাবেন। স্প্রিং ইনজেকশন আইটেমগুলি অনুসন্ধান করতে প্রসঙ্গ ব্যবহার করে। যদি আপনার সার্লেটটি বসন্ত ব্যবহার করে শেষ হয়, আপনি উপরের পদ্ধতিটিতে (শুরু করার আগে) নিম্নলিখিতটি যোগ করে পরীক্ষার মতো একই প্রসঙ্গটি সরবরাহ করতে পারেন: এক্সএমএলওয়েব্লিকেশনস কনটেক্সট ডাব্লুটিএক্স = নতুন এক্সএমএলওয়েব অ্যাপ্লিকেশনস কনটেক্সট (); wctx.setParent (yourAppContext); wctx.setConfigLocation ( ""); wctx.setServletContext (servletContext); wctx.refresh (); servletContext.setAttribute (WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, wctx);
রোমারা

1

ওয়েববেসড ইউনিট পরীক্ষার জন্য সেলেনিয়াম ব্যবহার করুন । সেলেনিয়াম আইডিই নামে একটি ফায়ারফক্স প্লাগইন রয়েছে যা ওয়েবপৃষ্ঠায় ক্রিয়াকলাপ রেকর্ড করতে পারে এবং JUnit পরীক্ষার কেসগুলিতে রফতানি করতে পারে যা পরীক্ষার সার্ভার চালানোর জন্য সেলেনিয়াম আরসি ব্যবহার করে।


এটির জন্য ধন্যবাদ দেখতে ভাল লাগছে, তবে এটি সরাসরি পদ্ধতি নয় / সার্লেট কোডটি পদ্ধতিগুলি পরীক্ষা করে না? বা আমি ভুল করছি
চন্দ্র

এটি, প্রোগ্রামটিগতভাবে এইচটিটিপি অনুরোধগুলি ফায়ার করে।
বালুসসি

1
 public class WishServletTest {
 WishServlet wishServlet;
 HttpServletRequest mockhttpServletRequest;
 HttpServletResponse mockhttpServletResponse;

@Before
public void setUp(){
    wishServlet=new WishServlet();
    mockhttpServletRequest=createNiceMock(HttpServletRequest.class);
    mockhttpServletResponse=createNiceMock(HttpServletResponse.class);
}

@Test
public void testService()throws Exception{
    File file= new File("Sample.txt");
    File.createTempFile("ashok","txt");
    expect(mockhttpServletRequest.getParameter("username")).andReturn("ashok");
    expect(mockhttpServletResponse.getWriter()).andReturn(new PrintWriter(file));
    replay(mockhttpServletRequest);
    replay(mockhttpServletResponse);
    wishServlet.doGet(mockhttpServletRequest, mockhttpServletResponse);
    FileReader fileReader=new FileReader(file);
    int count = 0;
    String str = "";
    while ( (count=fileReader.read())!=-1){
        str=str+(char)count;
    }

    Assert.assertTrue(str.trim().equals("Helloashok"));
    verify(mockhttpServletRequest);
    verify(mockhttpServletResponse);

}

}

0

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

একবার আপনার নির্ভরতা ইনজেকশনের পরে আপনি বিচ্ছিন্নভাবে আপনার শ্রেণি পরীক্ষা করতে পারেন।

সার্ভলেটটি পরীক্ষা করার জন্য, অন্যান্য পুরানো থ্রেড রয়েছে যা এটি নিয়ে আলোচনা করেছে .. এখানে এবং এখানে চেষ্টা করুন


আপনার মন্তব্যের জন্য ধন্যবাদ, আপনি কি বলছেন যে ডেটা ম্যানেজারটি সেই সার্লেটের মধ্যে কোনও পদ্ধতির মধ্যে তৈরি করা উচিত? আমি সেই ভিডিওটি দেখেছি এবং এটি সত্যই বুঝতে পারি নি :( জাভা খুব নতুন, এবং কোনও ধরণের পরীক্ষা কখনও করেনি
লুনার

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