এই পৃষ্ঠায় ট্রেডফেডে কীভাবে একটি নতুন টেস্ট রানার লিখতে হয় তা বর্ণনা করা হয়েছে।
পটভূমি
ট্রেডফেড আর্কিটেকচারে টেস্ট রানারদের অবস্থান সম্পর্কে আপনি যদি জানতে আগ্রহী হন, তাহলে “স্ট্রাকচার অফ এ টেস্ট রানার” দেখুন।
নতুন টেস্ট রানার লেখার জন্য এটি কোনো পূর্বশর্ত নয়; টেস্ট রানার আলাদাভাবেও লেখা যেতে পারে।
ন্যূনতম: ইন্টারফেসটি বাস্তবায়ন করুন।
Tradefed টেস্ট রানার হিসেবে যোগ্যতা অর্জনের জন্য ন্যূনতম শর্ত হলো IRemoteTest ইন্টারফেস এবং আরও নির্দিষ্টভাবে run(TestInformation testInfo, ITestInvocationListener listener) মেথডটি ইমপ্লিমেন্ট করা।
টেস্ট রানার ব্যবহার করার সময় হারনেস এই মেথডটিকেই কল করে, যা একটি জাভা রানএবল (Runnable)-এর অনুরূপ।
ওই মেথডের প্রতিটি অংশই টেস্ট রানার এক্সিকিউশনের অংশ হিসেবে বিবেচিত হয়।
টেস্ট রানার থেকে প্রাপ্ত ফলাফল রিপোর্ট করুন।
বেস ইন্টারফেসের run মেথডটি ITestInvocationListener টাইপের একটি লিসেনার অবজেক্ট অ্যাক্সেস করার সুযোগ দেয়। টেস্ট রানার থেকে হারনেসে কাঠামোগত ফলাফল রিপোর্ট করার জন্য এই অবজেক্টটিই হলো মূল চাবিকাঠি।
কাঠামোগত ফলাফল প্রতিবেদন করার মাধ্যমে, একটি টেস্ট রানারের নিম্নলিখিত বৈশিষ্ট্যগুলো থাকে:
- পরিচালিত সমস্ত পরীক্ষার একটি সঠিক তালিকা, সেগুলি সম্পন্ন হতে কত সময় লেগেছে এবং পরীক্ষার্থীরা পৃথকভাবে পাস, ফেল বা অন্য কোনো অবস্থায় আছে কিনা, তা প্রতিবেদন আকারে জমা দিন।
- প্রযোজ্য হলে পরীক্ষাগুলোর সাথে সম্পর্কিত মেট্রিকগুলো রিপোর্ট করুন, যেমন ইনস্টলেশন-সময়ের মেট্রিক।
- বেশিরভাগ অবকাঠামোগত টুলিং অন্তর্ভুক্ত করুন, যেমন ফলাফল এবং মেট্রিক্স প্রদর্শন করা ইত্যাদি।
- সাধারণত ডিবাগ করা সহজ হয়, কারণ কার্য সম্পাদনের আরও বিশদ বিবরণ পাওয়া যায়।
তবে, কাঠামোগত ফলাফল জানানো ঐচ্ছিক; একজন টেস্ট রানার প্রকৃত কার্যসম্পাদনের কোনো বিবরণ ছাড়াই পুরো রানটির অবস্থাকে কেবল পাস বা ফেল হিসেবে মূল্যায়ন করতে চাইতে পারেন।
এক্সিকিউশনের বর্তমান অগ্রগতি সম্পর্কে হারনেসকে অবহিত করতে লিসেনারে নিম্নলিখিত ইভেন্টগুলো কল করা যেতে পারে:
- testRunStarted: পরস্পর সম্পর্কিত একগুচ্ছ টেস্ট কেসের শুরু হওয়ার বিজ্ঞপ্তি দেয়।
- testStarted: একটি টেস্ট কেস শুরু হওয়ার বিজ্ঞপ্তি।
- testFailed/testIgnored: চলমান টেস্ট কেসের অবস্থার পরিবর্তন সম্পর্কে অবহিত করে। অবস্থার কোনো পরিবর্তন না হলে একটি টেস্ট কেসকে সফল বলে গণ্য করা হয়।
- testEnded: টেস্ট কেস শেষ হওয়ার বিজ্ঞপ্তি দিন।
- testRunFailed: এটি জানায় যে টেস্ট কেসগুলোর সমষ্টির এক্সিকিউশনের সামগ্রিক অবস্থা ব্যর্থ হয়েছে। এক্সিকিউশন কী প্রত্যাশা করছিল তার উপর নির্ভর করে, টেস্ট কেসগুলোর ফলাফলের ওপর ভিত্তি করে একটি টেস্ট রান পাস বা ফেল হতে পারে। উদাহরণস্বরূপ, একাধিক টেস্ট কেস চালানো একটি বাইনারি সব টেস্ট কেস পাস হিসেবে রিপোর্ট করতে পারে, কিন্তু একটি এরর এক্সিট কোড সহ (যেকোনো কারণে: ফাইল লিক হওয়া, ইত্যাদি)।
- testRunEnded: টেস্ট কেসগুলোর সমষ্টির সমাপ্তি সম্পর্কে অবহিত করে।
কলব্যাকগুলোর সঠিক ক্রম বজায় রাখা এবং নিশ্চিত করা টেস্ট রানার ইমপ্লিমেন্টারের দায়িত্ব; উদাহরণস্বরূপ, একটি finally ক্লজ ব্যবহার করে এক্সেপশনের ক্ষেত্রে testRunEnded কল করা নিশ্চিত করা।
টেস্ট কেসের কলব্যাকগুলো ( testStarted , testEnded ইত্যাদি) ঐচ্ছিক। কোনো টেস্ট কেস ছাড়াই টেস্ট রান সম্পন্ন হতে পারে।
আপনি হয়তো লক্ষ্য করবেন যে, এই ঘটনাপ্রবাহের কাঠামোটি সাধারণ JUnit কাঠামো থেকে অনুপ্রাণিত। এটি ইচ্ছাকৃতভাবেই করা হয়েছে, যাতে বিষয়গুলো এমন কোনো মৌলিক বিষয়ের কাছাকাছি থাকে যা সম্পর্কে ডেভেলপারদের সাধারণত ধারণা থাকে।
টেস্ট রানার থেকে লগ রিপোর্ট করুন
আপনি যদি নিজের ট্রেডফেড টেস্ট ক্লাস বা রানার লেখেন, তাহলে আপনাকে IRemoteTest ইমপ্লিমেন্ট করতে হবে এবং run() মেথডের মাধ্যমে একটি ITestInvocationListener পেতে হবে। এই লিসেনারটি নিম্নলিখিত উপায়ে ফাইল লগ করতে ব্যবহার করা যেতে পারে:
listener.testLog(String dataName, LogDataType type_of_data, InputStreamSource data);
একটি ডিভাইস দিয়ে পরীক্ষা করুন
উপরের ন্যূনতম ইন্টারফেসটি দিয়ে খুব সাধারণ টেস্ট চালানো যায়, যেগুলো বিচ্ছিন্ন এবং কোনো বিশেষ রিসোর্সের প্রয়োজন হয় না, যেমন জাভা ইউনিট টেস্ট।
যেসব টেস্ট রাইটার ডিভাইস টেস্টিং- এর পরবর্তী ধাপে যেতে চান, তাদের নিম্নলিখিত ইন্টারফেসগুলোর প্রয়োজন হবে:
- IDeviceTest পরীক্ষাধীন ডিভাইসটির প্রতিনিধিত্বকারী
ITestDeviceঅবজেক্টটি গ্রহণ করার সুযোগ দেয় এবং এর সাথে মিথস্ক্রিয়া করার জন্য এপিআই (API) প্রদান করে। - IBuildReceiver টেস্টটিকে বিল্ড প্রোভাইডার ধাপে তৈরি হওয়া
IBuildInfoঅবজেক্টটি পেতে সাহায্য করে, যেটিতে টেস্ট সেটআপ সম্পর্কিত সমস্ত তথ্য এবং আর্টিফ্যাক্ট থাকে।
টেস্ট রানাররা সাধারণত এই ইন্টারফেসগুলোতে আগ্রহী হন, যাতে তারা এক্সিকিউশন-সম্পর্কিত আর্টিফ্যাক্ট, যেমন অতিরিক্ত ফাইল, এবং এক্সিকিউশনের সময় টার্গেট করা হবে এমন টেস্টাধীন ডিভাইসটি পেতে পারেন।
একাধিক ডিভাইস দিয়ে পরীক্ষা করুন
ট্রেডফেড একই সময়ে একাধিক ডিভাইসে পরীক্ষা চালানো সমর্থন করে। যেসব কম্পোনেন্টের জন্য বাহ্যিক ইন্টারঅ্যাকশনের প্রয়োজন হয়, যেমন ফোন ও ঘড়ির পেয়ারিং, সেগুলো পরীক্ষা করার ক্ষেত্রে এটি উপযোগী।
একাধিক ডিভাইস ব্যবহার করতে পারে এমন একটি টেস্ট রানার লেখার জন্য, আপনাকে IMultiDeviceTest ইমপ্লিমেন্ট করতে হবে, যা ITestDevice থেকে IBuildInfo এর একটি ম্যাপ গ্রহণ করার সুযোগ দেবে। এই ম্যাপে ডিভাইস রিপ্রেজেন্টেশনগুলোর সম্পূর্ণ তালিকা এবং তাদের সংশ্লিষ্ট বিল্ড তথ্য অন্তর্ভুক্ত থাকবে।
ইন্টারফেসের সেটারটি সর্বদা run মেথডের আগে কল করা হবে, তাই এটা ধরে নেওয়া নিরাপদ যে run কল করার সময় স্ট্রাকচারটি উপলব্ধ থাকবে।
পরীক্ষাগুলি তাদের সেটআপ সম্পর্কে সচেতন
কিছু টেস্ট রানার ইমপ্লিমেন্টেশন সঠিকভাবে কাজ করার জন্য সামগ্রিক সেটআপ সম্পর্কে তথ্যের প্রয়োজন হতে পারে, যেমন ইনভোকেশন সম্পর্কিত কিছু মেটাডেটা, বা আগে কোন target_preparer চলেছিল, ইত্যাদি।
এটি সম্পন্ন করার জন্য, একটি টেস্ট রানার সেই IConfiguration অবজেক্টটি অ্যাক্সেস করতে পারে যার এটি একটি অংশ এবং যার মধ্যে এটি এক্সিকিউট করা হয়। আরও বিস্তারিত জানতে কনফিগারেশন অবজেক্টের বিবরণ দেখুন।
টেস্ট রানার বাস্তবায়নের জন্য, IConfiguration অবজেক্টটি গ্রহণ করতে আপনাকে IConfigurationReceiver ইমপ্লিমেন্ট করতে হবে।
নমনীয় টেস্ট রানার
টেস্ট রানাররা তাদের টেস্টগুলো চালানোর জন্য একটি নমনীয় উপায় প্রদান করতে পারে, যদি সেগুলোর উপর তাদের সূক্ষ্ম নিয়ন্ত্রণ থাকে; উদাহরণস্বরূপ, একটি JUnit টেস্ট রানার প্রতিটি ইউনিট টেস্ট আলাদাভাবে চালাতে পারে।
এটি বৃহত্তর হারনেস এবং পরিকাঠামোকে সেই সূক্ষ্ম নিয়ন্ত্রণকে কাজে লাগাতে এবং ব্যবহারকারীদের ফিল্টারিংয়ের মাধ্যমে টেস্ট রানারকে আংশিকভাবে চালানোর সুযোগ দেয়।
ITestFilterReceiver ইন্টারফেসে ফিল্টারিং সমর্থনের বর্ণনা দেওয়া হয়েছে, যার মাধ্যমে কোন টেস্টগুলো চালানো উচিত বা উচিত নয়, তার জন্য include এবং exclude ফিল্টারের সেট গ্রহণ করা যায়।
আমাদের নিয়ম অনুযায়ী, একটি টেস্ট তখনই চালানো হবে যখন সেটি এক বা একাধিক ইনক্লুড ফিল্টারের সাথে মিলবে এবং কোনো এক্সক্লুড ফিল্টারের সাথে মিলবে না। যদি কোনো ইনক্লুড ফিল্টার না দেওয়া হয়, তবে সব টেস্টই চালানো হবে, যতক্ষণ না সেগুলো কোনো এক্সক্লুড ফিল্টারের সাথে মেলে।