$lang['tuto'] = "টিউটোরিয়াল"; ?>$lang['tuto'] = "টিউটোরিয়াল"; ?> টেস্ট ক্লাসের বাইরে

টেস্ট ক্লাসের বাইরে @LocalServerPort ব্যবহার করে স্প্রিং বুটে অটোওয়্যারিং সমস্যাগুলি কীভাবে ঠিক করবেন

Temp mail SuperHeros
টেস্ট ক্লাসের বাইরে @LocalServerPort ব্যবহার করে স্প্রিং বুটে অটোওয়্যারিং সমস্যাগুলি কীভাবে ঠিক করবেন
টেস্ট ক্লাসের বাইরে @LocalServerPort ব্যবহার করে স্প্রিং বুটে অটোওয়্যারিং সমস্যাগুলি কীভাবে ঠিক করবেন

স্প্রিং বুট টেস্টিং-এ নির্ভরতা ইনজেকশনের চ্যালেঞ্জ বোঝা

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

আপনার কন্ট্রোলারদের জন্য API টেস্টিং স্ট্রীমলাইন করার জন্য একটি কাস্টম র‌্যাপার তৈরি করার কল্পনা করুন। এই বিমূর্ততা পুনরাবৃত্তিমূলক কলগুলিকে সহজ করতে পারে, কিন্তু স্প্রিং বুট টেস্টিং ইকোসিস্টেমের সাথে এটিকে একীভূত করা প্রায়শই নির্ভরতা ইনজেকশন ত্রুটির দিকে পরিচালিত করে। এই ধরনের সমস্যাগুলি ঘটে কারণ স্প্রিং-এর পরীক্ষার পরিবেশ সবসময় স্থানধারকদের মত সমাধান করে না ${local.server.port} অ-পরীক্ষা মটরশুটি মধ্যে.

বিকাশকারীরা প্রায়শই ত্রুটির সম্মুখীন হন: "স্বয়ংক্রিয়তার নির্ভরতার ইনজেকশন ব্যর্থ হয়েছে; স্থানধারক 'local.server.port' সমাধান করা যায়নি।" এটি বিশেষভাবে হতাশাজনক হতে পারে যখন আপনি জটিল পরীক্ষা সেটআপ নিয়ে কাজ করছেন বা আপনার পরীক্ষার কোড পরিষ্কার এবং মডুলার রাখার লক্ষ্য রাখেন। কেন এটি ঘটে তা বোঝা একটি সমাধান বাস্তবায়নের মূল চাবিকাঠি।

এই নিবন্ধে, আমরা এই সমস্যার মূল কারণটি অন্বেষণ করব এবং এটি কাটিয়ে উঠতে একটি ধাপে ধাপে সমাধান প্রদান করব। টিপস এবং সর্বোত্তম অনুশীলন সহ সম্পর্কিত পরিস্থিতিগুলি ব্যবহার করে, আমরা নিশ্চিত করব যে আপনার পরীক্ষার যাত্রা কার্যকর এবং ত্রুটি-মুক্ত উভয়ই। 🚀

আদেশ ব্যবহারের উদাহরণ
@DynamicPropertySource এই টীকাটি একটি পরীক্ষার জন্য বৈশিষ্ট্যগুলির গতিশীল কনফিগারেশনের অনুমতি দেয়। স্প্রিং বুট পরীক্ষার জন্য গতিশীলভাবে সার্ভার পোর্ট সেট করতে উদাহরণে এটি ব্যবহার করা হয়।
DynamicPropertyRegistry @DynamicPropertySource-এর সাথে টীকাকৃত পদ্ধতিতে একটি বস্তু পাস করা হয়েছে, যা সার্ভার পোর্টের মতো গতিশীল বৈশিষ্ট্যের নিবন্ধন সক্ষম করে।
setApplicationContext() ApplicationContextAware ইন্টারফেস থেকে, এই পদ্ধতিটি গতিশীলভাবে পরিবেশের বৈশিষ্ট্যগুলি আনার জন্য স্প্রিং অ্যাপ্লিকেশন কনটেক্সটে অ্যাক্সেস প্রদান করে।
Environment.getProperty() স্প্রিং এনভায়রনমেন্ট থেকে সম্পত্তির মান পুনরুদ্ধার করতে ব্যবহৃত হয়। উদাহরণে, এটি local.server.port মান আনে।
@Value স্প্রিং এনভায়রনমেন্ট থেকে সরাসরি ক্ষেত্র বা পদ্ধতির প্যারামিটারে মানগুলি ইনজেক্ট করে। উদাহরণে, এটি কাস্টম বিন কনফিগারেশনে পোর্ট মান সেট করে।
@Configuration BaseControllerWrapper এর মতো কাস্টম মটরশুটি নিবন্ধন সক্ষম করে, স্প্রিং IoC-এর জন্য একটি কনফিগারেশন ক্লাস হিসাবে একটি ক্লাস চিহ্নিত করে৷
@Bean একটি পদ্ধতি সংজ্ঞায়িত করে যা স্প্রিং দ্বারা পরিচালিত একটি শিম ফেরত দেয়। উদাহরণে, এটি সার্ভার পোর্টের সাথে বেসকন্ট্রোলার র্যাপার শুরু করে।
@Autowired পারমিশন টেস্ট ক্লাসে SpecificControllerWrapper এর মতো ক্ষেত্র বা পদ্ধতিতে বসন্ত-পরিচালিত মটরশুটি ইনজেকশন করতে ব্যবহৃত হয়।
@SpringBootTest স্প্রিং বুটে ইন্টিগ্রেশন পরীক্ষার জন্য টীকা। এটি পরীক্ষার পরিবেশ সেট করে এবং ওয়েবএনভায়রনমেন্টের মতো বৈশিষ্ট্যগুলিকে সক্ষম করে।
@DirtiesContext পরীক্ষার মধ্যে বসন্ত প্রসঙ্গ পুনরায় সেট করতে ব্যবহৃত হয়। এটি প্রদত্ত উদাহরণে প্রতিটি পরীক্ষার জন্য একটি পরিষ্কার অবস্থা নিশ্চিত করে।

স্থানীয় সার্ভার পোর্টের সাথে পরীক্ষার জন্য নির্ভরতা ইনজেকশন বোঝা

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

আরেকটি স্ক্রিপ্ট লিভারেজ ApplicationContextAware ইন্টারফেস, যা স্প্রিং অ্যাপ্লিকেশন কনটেক্সটে সরাসরি অ্যাক্সেসের অনুমতি দেয়। এটি বিশেষভাবে কার্যকর যখন আপনি পরিবেশের ভেরিয়েবলগুলি পুনরুদ্ধার করতে চান, যেমন সার্ভার পোর্ট, গতিশীলভাবে। উদাহরণস্বরূপ, যখন র‍্যাপিং কন্ট্রোলার এপিআই পরীক্ষার জন্য কল করে, তখন র‍্যাপার ক্লাস রানটাইমে সঠিক পোর্ট আনতে এবং ব্যবহার করতে পারে। এই পদ্ধতিটি হার্ডকোডিং দূর করে এবং পরীক্ষার নমনীয়তা উন্নত করে। একটি এলোমেলো পোর্টের উপর নির্ভর করে এমন একটি API পরীক্ষা করার কল্পনা করুন - আপনাকে আর এটিকে ম্যানুয়ালি সেট করতে হবে না। 😊

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

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

সমাধান 1: পোর্ট ইনজেকশন সমাধান করতে @DynamicPropertySource ব্যবহার করে

এই পদ্ধতিটি স্প্রিং বুটের @DynamicPropertySource ব্যবহার করে পরীক্ষার সময় স্থানীয় সার্ভার পোর্টকে গতিশীলভাবে সেট করতে।

@Component
public class BaseControllerWrapper {
    protected int port;
}

@Component
public class SpecificControllerWrapper extends BaseControllerWrapper {
    public void callEndpoint() {
        System.out.println("Calling endpoint on port: " + port);
    }
}

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class PermissionsTest {
    @Autowired
    private SpecificControllerWrapper specificControllerWrapper;

    @DynamicPropertySource
    static void dynamicProperties(DynamicPropertyRegistry registry) {
        registry.add("server.port", () -> 8080);
    }

    @Test
    public void testSomething() {
        specificControllerWrapper.port = 8080; // Dynamically set
        specificControllerWrapper.callEndpoint();
    }
}

সমাধান 2: পোর্ট ইনজেকশনের জন্য ApplicationContextAware ব্যবহার করা

এই সমাধানটি পরিবেশগত বৈশিষ্ট্যগুলিকে গতিশীলভাবে আনতে ApplicationContext ব্যবহার করে।

@Component
public class BaseControllerWrapper {
    protected int port;
}

@Component
public class SpecificControllerWrapper extends BaseControllerWrapper {
    public void callEndpoint() {
        System.out.println("Calling endpoint on port: " + port);
    }
}

@Component
public class PortInjector implements ApplicationContextAware {
    @Autowired
    private SpecificControllerWrapper wrapper;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        Environment env = applicationContext.getEnvironment();
        wrapper.port = Integer.parseInt(env.getProperty("local.server.port", "8080"));
    }
}

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class PermissionsTest {
    @Autowired
    private SpecificControllerWrapper specificControllerWrapper;

    @Test
    public void testSomething() {
        specificControllerWrapper.callEndpoint();
    }
}

সমাধান 3: বন্দর পরিচালনার জন্য একটি কাস্টম বিন কনফিগার করা

এই পদ্ধতিটি পোর্ট ইনজেকশন এবং রেজোলিউশন পরিচালনা করার জন্য একটি কাস্টম বিন সেট আপ করে।

@Configuration
public class PortConfig {
    @Bean
    public BaseControllerWrapper baseControllerWrapper(@Value("${local.server.port}") int port) {
        BaseControllerWrapper wrapper = new BaseControllerWrapper();
        wrapper.port = port;
        return wrapper;
    }
}

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class PermissionsTest {
    @Autowired
    private SpecificControllerWrapper specificControllerWrapper;

    @Test
    public void testSomething() {
        specificControllerWrapper.callEndpoint();
    }
}

স্প্রিং বুট টেস্টে নির্ভরশীলতা ইনজেকশন চ্যালেঞ্জগুলি অতিক্রম করা

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

একটি কার্যকর পন্থা ব্যবহার করা হয় @DynamicPropertySource টীকা, যা গতিশীলভাবে একটি সম্পত্তি হিসাবে স্থানীয় সার্ভার পোর্ট নিবন্ধন করে। এটি নিশ্চিত করে যে মানটি স্প্রিং প্রেক্ষাপট জুড়ে পাওয়া যায়, এমনকি পরীক্ষার ক্লাসের বাইরেও। উদাহরণস্বরূপ, আপনি যদি রিইস্ট এপিআই কলগুলিকে পুনঃব্যবহারযোগ্যতার জন্য একটি কন্ট্রোলার র‍্যাপারে মুড়ে রাখেন, পোর্টটি গতিশীলভাবে সেট করা আপনার পরীক্ষাগুলিকে মডুলার এবং পরিষ্কার রাখে। 🚀

আরেকটি পদ্ধতি ব্যবহার করা হয় ApplicationContext এবং এর Environment গতিশীলভাবে সার্ভার পোর্ট আনতে। এই পদ্ধতিটি জটিল অ্যাপ্লিকেশনগুলিতে বিশেষভাবে কার্যকর যেখানে সম্পত্তির রেজোলিউশন রানটাইমে ঘটতে হবে। পোর্টটি সরাসরি মোড়ক বা বিনের মধ্যে কনফিগার করার মাধ্যমে, আপনি পরীক্ষা সেটআপ না ভেঙে সামঞ্জস্যতা নিশ্চিত করেন।

স্প্রিং বুট টেস্টে @LocalServerPort সম্পর্কে প্রায়শই জিজ্ঞাসিত প্রশ্ন

  1. কিভাবে করে @LocalServerPort কাজ?
  2. এটি একটি স্প্রিং বুট পরীক্ষার সময় এমবেডেড সার্ভারে বরাদ্দ করা এলোমেলো পোর্টকে ইনজেক্ট করে।
  3. ব্যবহার করতে পারি @LocalServerPort পরীক্ষার ক্লাসের বাইরে?
  4. সরাসরি না, কিন্তু আপনি সমাধান ব্যবহার করতে পারেন @DynamicPropertySource বা ApplicationContext.
  5. কি @DynamicPropertySource?
  6. এটি একটি স্প্রিং বুট বৈশিষ্ট্য যা আপনাকে পরীক্ষার সময় গতিশীলভাবে বৈশিষ্ট্য নিবন্ধন করতে দেয়।
  7. কেন স্প্রিং একটি স্থানধারক রেজোলিউশন ত্রুটি নিক্ষেপ করে?
  8. এটি ঘটে কারণ স্থানধারক ${local.server.port} পরীক্ষার প্রসঙ্গের বাইরে সমাধান করা হয় না।
  9. আমি কি একটি ভাগ করা মোড়কের সাথে একাধিক কন্ট্রোলার পরীক্ষা করতে পারি?
  10. হ্যাঁ, গতিশীল পোর্ট রেজোলিউশন পদ্ধতি আপনাকে একাধিক কন্ট্রোলারের জন্য একটি একক মোড়ক দক্ষতার সাথে পুনরায় ব্যবহার করতে দেয়। 😊

পোর্ট ইনজেকশনের চ্যালেঞ্জ মোড়ানো

ব্যবহার করে @লোকাল সার্ভারপোর্ট স্প্রিং বুট পরীক্ষায় কার্যকরভাবে পরীক্ষার প্রসঙ্গ আচরণের একটি শক্তিশালী বোঝার প্রয়োজন। ডায়নামিক প্রপার্টি কনফিগারেশন বা পরিবেশ-ভিত্তিক ইনজেকশনগুলির মতো সমাধানগুলি এই সমস্যাগুলি পরিচালনা করা সহজ করে। এটি নিশ্চিত করে যে আপনি পরীক্ষার স্থিতিশীলতার সাথে আপস না করেই কন্ট্রোলার র্যাপারের মতো উপাদানগুলি পুনরায় ব্যবহার করতে পারেন।

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

সূত্র এবং তথ্যসূত্র
  1. স্প্রিং বুট টেস্টিং এবং টীকা সম্পর্কে বিশদ বিবরণ অফিসিয়াল স্প্রিং ডকুমেন্টেশন থেকে নেওয়া হয়েছে। আরো জন্য, দেখুন স্প্রিং বুট অফিসিয়াল ডকুমেন্টেশন .
  2. নির্ভরতা ইনজেকশন সমস্যাগুলি সমাধান করার অন্তর্দৃষ্টি স্ট্যাক ওভারফ্লোতে সম্প্রদায়ের আলোচনা থেকে নেওয়া হয়েছিল। এ মূল থ্রেড পরীক্ষা করুন স্ট্যাক ওভারফ্লো .
  3. পরীক্ষার প্রসঙ্গে @DynamicPropertySource ব্যবহার করার অতিরিক্ত উদাহরণ Baeldung-এর বিস্তারিত গাইড থেকে উল্লেখ করা হয়েছে: স্প্রিং বুট টেস্টে গতিশীল বৈশিষ্ট্য .
  4. অ্যাপ্লিকেশান কনটেক্সটের সাধারণ ধারণা এবং গতিশীল সম্পত্তি রেজোলিউশনে এর ব্যবহার জাভা কোড গীক্সের নিবন্ধগুলির মাধ্যমে অন্বেষণ করা হয়েছিল: জাভা কোড গীক্স .