আরডুইনো ডিভাইস বা এমুলেটরটিতে ইউনিট টেস্টগুলি চালাবেন না
মাইক্রোকন্ট্রোলার ডিভাইস / এমুলেটর / সিম ভিত্তিক পরীক্ষার বিরুদ্ধে মামলা
ইউনিট পরীক্ষার অর্থ কী তা নিয়ে প্রচুর আলোচনা রয়েছে এবং আমি এখানে সে সম্পর্কে কোনও যুক্তি দেওয়ার চেষ্টা করছি না। এই পোস্টটি
আপনাকে আপনার চূড়ান্ত টার্গেটের হার্ডওয়ারের সমস্ত ব্যবহারিক পরীক্ষার এড়াতে বলছে না । আমি আপনার সবচেয়ে গুরুত্বপূর্ণ এবং ঘন ঘন পরীক্ষাগুলি থেকে আপনার টার্গেট হার্ডওয়্যারটি সরিয়ে আপনার বিকাশের প্রতিক্রিয়া চক্রটি অনুকূল করার বিষয়ে একটি বিষয় বলার চেষ্টা করছি। পরীক্ষার অধীনে থাকা ইউনিটগুলি পুরো প্রকল্পের তুলনায় অনেক ছোট বলে ধরে নেওয়া হয়।
ইউনিট পরীক্ষার উদ্দেশ্যটি হল আপনার নিজের কোডের মান পরীক্ষা করা। ইউনিট পরীক্ষাগুলি সাধারণত কখনই আপনার নিয়ন্ত্রণের বাইরে কারণগুলির কার্যকারিতা পরীক্ষা করে না।
এটি এইভাবে চিন্তা করুন: এমনকি আপনি যদি আরডিনো গ্রন্থাগার, মাইক্রোকন্ট্রোলার হার্ডওয়্যার বা একটি এমুলেটর কার্যকারিতা পরীক্ষা করে দেখেন তবে এই জাতীয় পরীক্ষার ফলাফলগুলির জন্য আপনার নিজের কাজের গুণমান সম্পর্কে আপনাকে কিছু বলা একেবারেই অসম্ভব । সুতরাং, টার্গেট ডিভাইস (বা এমুলেটর) না চালিত ইউনিট পরীক্ষা লিখতে এটি অনেক বেশি মূল্যবান এবং দক্ষ।
আপনার টার্গেট হার্ডওয়্যার উপর ঘন ঘন পরীক্ষার একটি বেদনাদায়ক ধীর চক্র থাকে:
- আপনার কোডটি টুইঙ্ক করুন
- আরডুইনো ডিভাইসে সংকলন এবং আপলোড করুন
- আচরণটি পর্যবেক্ষণ করুন এবং অনুমান করুন যে আপনার কোডটি আপনি যা প্রত্যাশা করছেন তা করছে কিনা
- পুনরাবৃত্তি
ধাপ 3 বিশেষত বাজে যদি আপনি সিরিয়াল পোর্টের মাধ্যমে ডায়াগনস্টিক বার্তাগুলি পাওয়ার আশা করেন তবে আপনার প্রকল্পে আপনার নিজের আরডুইনোর একমাত্র হার্ডওয়্যার সিরিয়াল পোর্ট ব্যবহার করা দরকার। আপনি যদি ভাবছিলেন যে সফটওয়্যারশিয়ার লাইব্রেরি সাহায্য করতে পারে তবে আপনার জানা উচিত যে এটি করার ফলে একই সাথে অন্যান্য সংকেত উত্পন্ন করার মতো সঠিক সময় প্রয়োজন এমন কোনও কার্যকারিতা ব্যাহত হতে পারে। এই সমস্যাটি আমার কাছে ঘটেছে।
আবার, যদি আপনি কোনও এমুলেটর ব্যবহার করে আপনার স্কেচটি পরীক্ষা করে দেখেন এবং আপনার সময়-সমালোচনামূলক রুটিনগুলি আপনি সত্যিকারের আরডিনোতে আপলোড না করা পর্যন্ত পুরোপুরি দৌড়াদৌড়ি করেন তবে আপনি যে শিখতে চলেছেন তা হ'ল এমুলেটরটি ত্রুটিযুক্ত - এবং এটি এখনও জেনে রাখা আপনার নিজের কাজের গুণমান সম্পর্কে কিছুই প্রকাশ করে না ।
ডিভাইস বা এমুলেটর পরীক্ষা করার জন্য এটি নির্বোধ যদি হয় তবে আমার কী করা উচিত ?
আপনি সম্ভবত আপনার আরডিনো প্রকল্পে কাজ করার জন্য একটি কম্পিউটার ব্যবহার করছেন। সেই কম্পিউটারটি মাইক্রোকন্ট্রোলারের চেয়ে দ্রুতগতির অর্ডার। আপনার কম্পিউটারে তৈরি এবং চালনার জন্য পরীক্ষাগুলি লিখুন ।
মনে রাখবেন, আরডুইনো গ্রন্থাগার এবং মাইক্রোকন্ট্রোলারের আচরণটি সঠিক বা কমপক্ষে ধারাবাহিকভাবে ভুল বলে ধরে নেওয়া উচিত ।
যখন আপনার পরীক্ষাগুলি আপনার প্রত্যাশার বিপরীতে আউটপুট উত্পন্ন করে, তখন সম্ভবত আপনার কোডটিতে পরীক্ষা করা হয়েছিল। যদি আপনার পরীক্ষার আউটপুট আপনার প্রত্যাশার সাথে মিলে যায়, তবে আপনি যখন এটি আরডিনোতে আপলোড করেন তখন প্রোগ্রামটি সঠিকভাবে আচরণ করে না, তবে আপনি জানেন যে আপনার পরীক্ষাগুলি ভুল অনুমানের উপর ভিত্তি করে হয়েছিল এবং আপনার সম্ভবত একটি ত্রুটিযুক্ত পরীক্ষা রয়েছে। উভয় ক্ষেত্রেই, আপনার পরবর্তী কোড পরিবর্তনগুলি কী হওয়া উচিত সে সম্পর্কে আপনাকে প্রকৃত অন্তর্দৃষ্টি দেওয়া হবে। আপনার প্রতিক্রিয়া মান থেকে "উন্নত হয় কিছু নষ্ট হয়ে গেছে" এ "এই নির্দিষ্ট কোড নষ্ট হয়ে গেছে" ।
আপনার পিসিতে টেস্টগুলি কীভাবে তৈরি এবং পরিচালনা করবেন
প্রথম জিনিস আপনি কি করতে প্রয়োজন আপনার টেস্টিং গোল চিহ্নিত । আপনার নিজের কোডের কোন অংশটি আপনি পরীক্ষা করতে চান সে সম্পর্কে চিন্তা করুন এবং তারপরে আপনার প্রোগ্রামটি এমনভাবে তৈরি করা নিশ্চিত করুন যাতে আপনি পরীক্ষার জন্য পৃথক অংশগুলি বিচ্ছিন্ন করতে পারেন ।
আপনি যে অংশগুলি পরীক্ষা করতে চান সেগুলি যদি কোনও আরডিনো ফাংশনকে কল করে তবে আপনার পরীক্ষা প্রোগ্রামে আপনাকে মক-আপ প্রতিস্থাপন সরবরাহ করতে হবে। এটি মনে হয় তুলনায় অনেক কম কাজ। আপনার মক আপগুলি আপনার পরীক্ষাগুলির জন্য অনুমানযোগ্য ইনপুট এবং আউটপুট সরবরাহ করা ছাড়া আসলে কিছুই করতে হবে না।
আপনি যে নিজের কোডটি পরীক্ষা করতে চান তার কোনও একটিতে .pde স্কেচ ব্যতীত উত্স ফাইলগুলিতে থাকা দরকার। চিন্তা করবেন না, আপনার স্কেচটি স্কেচের বাইরে কিছু উত্স কোড সহ এখনও সংকলন করবে। আপনি যখন সত্যিই এতে নামবেন, আপনার প্রোগ্রামের সাধারণ প্রবেশ প্রবেশ বিন্দুর চেয়ে সামান্য বেশি স্কেচ ফাইলে সংজ্ঞায়িত করা উচিত।
যা যা অবশিষ্ট রয়েছে তা হ'ল আসল পরীক্ষাগুলি লিখতে এবং তারপরে এটি আপনার প্রিয় সি ++ সংকলক ব্যবহার করে সংকলন করে! এটি সম্ভবত একটি বাস্তব বিশ্বের উদাহরণ দিয়ে সবচেয়ে ভাল চিত্রিত হয়েছে।
একটি বাস্তব কাজের উদাহরণ
এখানে পাওয়া আমার পোষা প্রাণীর একটি প্রকল্পের কিছু সাধারণ পরীক্ষা রয়েছে যা পিসিতে চালিত হয়। এই উত্তর জমা দেওয়ার জন্য, আমি ঠিক কীভাবে আমি আরডিনো গ্রন্থাগার ফাংশনগুলির কয়েকটি এবং যেগুলি মক আপগুলি পরীক্ষা করার জন্য লিখেছিলাম সেগুলি উপহাস করব over এটি অন্য লোকের কোড পরীক্ষা না করার বিষয়ে আমি আগে যা বলেছিলাম তার বিপরীতে নয় কারণ মক-আপগুলি আমিই লিখেছিলাম। আমি খুব নিশ্চিত হতে চেয়েছিলাম যে আমার উপহাসগুলি সঠিক ছিল।
Mock_arduino.cpp এর উত্স, এতে এমন কোড রয়েছে যা আরডুইনো লাইব্রেরি দ্বারা সরবরাহিত কিছু সমর্থন কার্যকারিতাটিকে নকল করে:
#include <sys/timeb.h>
#include "mock_arduino.h"
timeb t_start;
unsigned long millis() {
timeb t_now;
ftime(&t_now);
return (t_now.time - t_start.time) * 1000 + (t_now.millitm - t_start.millitm);
}
void delay( unsigned long ms ) {
unsigned long start = millis();
while(millis() - start < ms){}
}
void initialize_mock_arduino() {
ftime(&t_start);
}
আমার কোডটি হার্ডওয়্যার সিরিয়াল ডিভাইসে বাইনারি ডেটা লিখলে আমি পঠনযোগ্য আউটপুট তৈরি করতে নিম্নলিখিত মক-আপ ব্যবহার করি।
fake_serial.h
#include <iostream>
class FakeSerial {
public:
void begin(unsigned long);
void end();
size_t write(const unsigned char*, size_t);
};
extern FakeSerial Serial;
fake_serial.cpp
#include <cstring>
#include <iostream>
#include <iomanip>
#include "fake_serial.h"
void FakeSerial::begin(unsigned long speed) {
return;
}
void FakeSerial::end() {
return;
}
size_t FakeSerial::write( const unsigned char buf[], size_t size ) {
using namespace std;
ios_base::fmtflags oldFlags = cout.flags();
streamsize oldPrec = cout.precision();
char oldFill = cout.fill();
cout << "Serial::write: ";
cout << internal << setfill('0');
for( unsigned int i = 0; i < size; i++ ){
cout << setw(2) << hex << (unsigned int)buf[i] << " ";
}
cout << endl;
cout.flags(oldFlags);
cout.precision(oldPrec);
cout.fill(oldFill);
return size;
}
FakeSerial Serial;
এবং পরিশেষে, আসল পরীক্ষা প্রোগ্রাম:
#include "mock_arduino.h"
using namespace std;
void millis_test() {
unsigned long start = millis();
cout << "millis() test start: " << start << endl;
while( millis() - start < 10000 ) {
cout << millis() << endl;
sleep(1);
}
unsigned long end = millis();
cout << "End of test - duration: " << end - start << "ms" << endl;
}
void delay_test() {
unsigned long start = millis();
cout << "delay() test start: " << start << endl;
while( millis() - start < 10000 ) {
cout << millis() << endl;
delay(250);
}
unsigned long end = millis();
cout << "End of test - duration: " << end - start << "ms" << endl;
}
void run_tests() {
millis_test();
delay_test();
}
int main(int argc, char **argv){
initialize_mock_arduino();
run_tests();
}
এই পোস্টটি যথেষ্ট দীর্ঘ, সুতরাং আরও কিছু পরীক্ষার কেস কার্যত দেখতে দয়া করে গিটহাবের আমার প্রকল্পটি দেখুন। আমি মাস্টার ব্যতীত অন্য শাখাগুলিতে আমার কার্য-অগ্রগতি রেখেছি, সুতরাং অতিরিক্ত পরীক্ষার জন্য সেই শাখাগুলিও চেক করুন।
আমি আমার নিজের লাইটওয়েট পরীক্ষার রুটিনগুলি লিখতে পছন্দ করেছি, তবে সিপিউউনিটের মতো আরও শক্তিশালী ইউনিট-পরীক্ষা ফ্রেমওয়ার্কগুলিও উপলব্ধ।