স্প্রিংবুটটেষ্টের সাথে মকএমভিসি ব্যবহার এবং ওয়েবএমভিসিটেষ্ট ব্যবহারের মধ্যে পার্থক্য


95

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

কোড স্নিপেট 1:

@RunWith(SpringRunner.class)
@WebMvcTest(HelloController.class)
public class HelloControllerApplicationTest {
    @Autowired    
    private MockMvc mvc;

    @Test
    public void getHello() throws Exception {
        mvc.perform(MockMvcRequestBuilders.get("/").accept(MediaType.APPLICATION_JSON))
                .andExpect(status().isOk())
                .andExpect(content().string(equalTo("Greetings from Spring Boot!")));
    }
}

এই পরীক্ষাটি @WebMvcTestটীকাগুলি ব্যবহার করে যা আমি বিশ্বাস করি বৈশিষ্ট্য স্লাইস পরীক্ষার জন্য এবং কেবলমাত্র একটি ওয়েব অ্যাপ্লিকেশনটির এমভিসি স্তর পরীক্ষা করে।

কোড স্নিপেট 2:

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class HelloControllerTest {

    @Autowired
    private MockMvc mvc;

    @Test
    public void getHello() throws Exception {
    mvc.perform(MockMvcRequestBuilders.get("/").accept(MediaType.APPLICATION_JSON))
            .andExpect(status().isOk())
            .andExpect(content().string(equalTo("Greetings from Spring Boot!")));
    }
}

এই পরীক্ষাটি @SpringBootTestটিকা এবং এ ব্যবহার করে MockMvc। তাহলে কোড স্নিপেট 1 থেকে এটি কীভাবে আলাদা? এটি আলাদাভাবে কী করে?

সম্পাদনা করুন: কোড স্নিপেট 3 যুক্ত করা (এটি বসন্তের ডকুমেন্টেশনে ইন্টিগ্রেশন পরীক্ষার উদাহরণ হিসাবে পাওয়া গেছে)

@RunWith(SpringRunner.class) 
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) 
public class HelloControllerIT {
    
    @LocalServerPort private int port;
    private URL base;
    
    @Autowired private TestRestTemplate template;
    
    @Before public void setUp() throws Exception {
        this.base = new URL("http://localhost:" + port + "/");
    }
    
    @Test public void getHello() throws Exception {
        ResponseEntity < String > response = template.getForEntity(base.toString(), String.class);
        assertThat(response.getBody(), equalTo("Greetings from Spring Boot!"));
    }
}

উত্তর:


88

@SpringBootTestসাধারণ পরীক্ষার টিকা। আপনি যদি 1.4 এর আগে একই কাজ করে এমন কিছু সন্ধান করছেন, তবে এটিই আপনার ব্যবহার করা উচিত। এটি কাটা কাটা মোটেই ব্যবহার করে না যার অর্থ এটি আপনার সম্পূর্ণ অ্যাপ্লিকেশন প্রসঙ্গটি শুরু করবে এবং উপাদান স্ক্যানিং মোটেও কাস্টমাইজ করবে না।

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

ডকটি পড়া সম্ভবত আপনারও সহায়তা করবে।


সাড়া দেওয়ার জন্য অনেক ধন্যবাদ !! সুতরাং যদি আমি আপনাকে সঠিকভাবে বুঝতে পারি তবে এর অর্থ হ'ল উভয় কোড স্নিপেটগুলি কেবলমাত্র অ্যাপ্লিকেশনের এমভিসি অংশটি পরীক্ষা করে। তবে টকোড স্নিপেট 1 সম্পূর্ণ অ্যাপ্লিকেশন প্রসঙ্গে লোড করে যেখানে কোড স্নিপেট 2 শুধুমাত্র নিয়ামককে স্ক্যান করে। এটা কি সঠিক? নিয়ামক পরীক্ষা করার জন্য কোড স্নিপেট 1 কে ইউনিট পরীক্ষা হিসাবে বিবেচনা করা যেতে পারে?
রেভানশা

4
না এটি সঠিক নয়। SpringBootTestআপনার সম্পূর্ণ অ্যাপ্লিকেশনটি লোড করছে (কিছুটা প্রসারিতভাবে, ডিফল্টরূপে এটি যদি এম্বেড থাকা ধারকটি উপলভ্য হয় না তবে এটির webEnvironmentজন্য সেখানে রয়েছে)। আমি বলব না যে @SpringBootTestএটি নিয়ামকের একটি ইউনিট পরীক্ষা তবে আরও একটি সংহতকরণ পরীক্ষা, সত্যই। WebMvcTestসত্যই আপনার নিয়ামকের একক পরীক্ষা এই অর্থে যে এর যদি নির্ভরতা থাকে তবে আপনাকে সেগুলি নিজেই সরবরাহ করতে হবে (হয় কোনও কনফিগার বা কোনও ধরণের উপহাস)।
স্টিফেন নিকল

সাড়া দেওয়ার জন্য আবার ধন্যবাদ। আমি প্রশ্নটি সম্পাদনা করেছি এবং কোড স্নিপেট ৩ যোগ করেছি You আপনি উল্লেখ করেছেন যে @ স্প্রিংবুটটেষ্ট টীকা সংহতকরণ পরীক্ষার জন্য বেশি ব্যবহৃত হয়। আমি বিশ্বাস করি স্নিপেট 3 এটি প্রদর্শন করে। সুতরাং যদি স্নিপেট 3 এর মতো সংহতকরণ পরীক্ষা করা হয় তবে স্নিপেট 2 কী করবে? স্নিপেট 2 স্প্রিংবুটস্টেস্ট টিকা এবং মক পরিবেশ (ওয়েইন এনভায়রনমেন্ট অ্যাট্রিবিউটের ডিফল্ট মান) ব্যবহার করে। এছাড়াও, স্নিপেট 3 এমবেডড সার্ভারটি শুরু করে এবং সত্যিই এইচটিটিপি কল করে যেখানে স্নিপেট 2 এটি করে না। সুতরাং এটি বিবেচনা করে, ক্যান্ট স্নিপেট 2 একটি ইউনিট পরীক্ষা হিসাবে বিবেচিত হবে?
রেভানশা

4
আমি নিশ্চিত নই যে আমরা এখানে এটিকে বাছাই করব। জিটার হতে পারে? জিনিস যে আপনি ক্রমাগত মিস্ বলে মনে হচ্ছে যে আবেদন প্রেক্ষাপটে যে SpringBootTestএবং WebMvcTestতৈরি অতি ভিন্ন। প্রাক্তন আপনার পুরো অ্যাপ্লিকেশনটি লোড করে এবং সমস্ত স্বতঃ-কনফিগারেশন সক্ষম করে যখন পরবর্তীতে কেবল স্প্রিং এমভিসি সক্ষম করে এবং কিছুই স্ক্যান করে না HelloController। সর্বোপরি ইউনিট পরীক্ষার দ্বারা আপনি কী বোঝাতে চাইছেন এটি সমস্ত নির্ভর করে। তবে এটাই পার্থক্য।
স্টিফেন নিকল

আপনার প্রতিক্রিয়ার জন্য ধন্যবাদ. এটা আমার জন্য খুব সহায়ক। ওয়েবমভিসিটিস্টে যখন আমার পরীক্ষাটি স্প্রিংবুটস্টেস্টের সাথে বাদ পড়তে পারে তবে ব্যতিক্রম। আবার অনেক ধন্যবাদ।
Alps1992

69

@ স্প্রিংবুটটেষ্ট টীকাটি স্প্রিং বুটকে একটি মূল কনফিগারেশন ক্লাস (উদাহরণস্বরূপ @ স্প্রিংবুট অ্যাপ্লিকেশন সহ একটি) সন্ধান করার জন্য বলেছে এবং এটি একটি স্প্রিং অ্যাপ্লিকেশন প্রসঙ্গে শুরু করতে ব্যবহার করে। স্প্রিংবুটটেষ্ট সম্পূর্ণ অ্যাপ্লিকেশন লোড করে এবং ধীরে ধীরে হতে পারে এমন সমস্ত মটরশুটিকে ইনজেকশন দেয়।

@ ওয়েবেএমভিসিটিস্ট - নিয়ামক স্তরটি পরীক্ষা করার জন্য এবং আপনাকে মক অবজেক্টগুলি ব্যবহার করে প্রয়োজনীয় নির্ভরতা সরবরাহ করতে হবে।

আপনার রেফারেন্সের জন্য নীচে আরও কয়েকটি টিকা।

অ্যাপ্লিকেশনটির টুকরোগুলি পরীক্ষা করা কখনও কখনও আপনি পুরো অ্যাপ্লিকেশনটিকে স্বয়ংক্রিয়ভাবে কনফিগার করার পরিবর্তে অ্যাপ্লিকেশনটির একটি সাধারণ "স্লাইস" পরীক্ষা করতে চান। স্প্রিং বুট 1.4 4 টি নতুন পরীক্ষার টীকাগুলি উপস্থাপন করেছে:

@WebMvcTest - for testing the controller layer
@JsonTest - for testing the JSON marshalling and unmarshalling
@DataJpaTest - for testing the repository layer
@RestClientTests - for testing REST clients

আরও তথ্যের জন্য দেখুন: https://spring.io/guides/gs/testing-web/


এখানে স্পিনিং বুট রেফারেন্সের লিঙ্কটি দেওয়া হয়েছে - স্বতঃ-কনফিগারেশন টীকাটি পরীক্ষা করুন । এখানে রৌশনকুমার-মুঠা কেবলমাত্র চারটি @ তালিকাভুক্ত করেছেন। শুরু করার গাইডের লিঙ্কটি এই স্লাইসগুলি গভীরভাবে কভার করে না।
জর্জ পান্তাজেস

15

এমভিসি পরীক্ষাগুলি কেবলমাত্র আপনার অ্যাপ্লিকেশনটির নিয়ামক অংশটি কভার করার উদ্দেশ্যে। এইচটিটিপি অনুরোধ এবং প্রতিক্রিয়াগুলি উপহাস করা হয়েছে যাতে আসল সংযোগ তৈরি হয় না। অন্যদিকে, আপনি যখন ব্যবহার @SpringBootTestকরবেন তখন ওয়েব অ্যাপ্লিকেশন প্রসঙ্গে সমস্ত কনফিগারেশন লোড হয়ে যায় এবং সংযোগগুলি আসল ওয়েব সার্ভারের মধ্য দিয়ে চলেছে। সেক্ষেত্রে আপনি MockMvcশিমটি ব্যবহার করবেন না RestTemplateপরিবর্তে একটি মান (বা নতুন বিকল্প TestRestTemplate) alternative

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

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

উত্স - স্প্রিং বুট সহ মাইক্রোসার্ভেসগুলি শেখা


4
আমি বুঝতে পারছি না কেন এই উত্তরটি আপভোট করা হয়েছে .. আপনি যখন ব্যবহার করবেন তখন আপনার @SpringBootTestকাছে না থাকলে একটি সত্যিকারের ওয়েব সার্ভার আরম্ভ করা হবে নাwebEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT (বা ক DEFINED_PORT) থাকে এবং সংযোগগুলি সত্যিকারের ওয়েব সার্ভারের মধ্যে না যায়। ডিফল্ট @SpringBootTestহল WebEnvironment.MOCK
Koray Tugay
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.