থ্রেডড কোডটি আমি কীভাবে ইউনিট করব?


704

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

এটি আজ প্রোগ্রামারদের কাছে সত্যিই একটি মূল সমস্যা বলে মনে হচ্ছে, এটি আমাদের জ্ঞানটিকে এই ইমোর উপর চাপিয়ে দেওয়া কার্যকর হবে।


2
আমি ঠিক এই একই বিষয়ে একটি প্রশ্ন পোস্ট করার কথা ভাবছিলাম। উইল নীচে অনেক ভাল পয়েন্ট তৈরি করার সময়, আমি মনে করি আমরা আরও ভাল করতে পারি। আমি সম্মত হ'ল পরিষ্কারভাবে এটির মোকাবেলায় কোনও একক "পদ্ধতির" নেই is তবে, "আপনি যতটা পারেন সর্বোত্তম পরীক্ষার" বারটি খুব কম সেট করছে। আমি আমার অনুসন্ধানগুলি নিয়ে ফিরে আসব।
জাচ বার্লিংগেম

জাভাতে: java.util.concurrent প্যাকেজটিতে কিছু খারাপ জ্ঞাত শ্রেণি রয়েছে, যা জৈনিত-পরীক্ষাগুলি নির্ধারণে সহায়তা করতে পারে। - কটাক্ষপাত আছে CountDownLatch - সেমফোর্ - এক্সচেঞ্জার
Synox

দয়া করে আপনার পূর্ববর্তী ইউনিট পরীক্ষার সম্পর্কিত কোনও লিঙ্ক সরবরাহ করতে পারেন?
অ্যান্ড্রু গ্রিম

@Andrew গ্রিম: stackoverflow.com/questions/11060/...
jkp

7
আমি মনে করি এটি গুরুত্বপূর্ণ যে এই প্রশ্নটি 8 বছরের পুরানো, এবং এর মধ্যে অ্যাপ্লিকেশন লাইব্রেরিগুলি বেশ দীর্ঘ পথ পেরিয়েছে note "আধুনিক যুগে" (২০১)) বহু-থ্রেডযুক্ত বিকাশ মূলত এমবেডড সিস্টেমে আসে। তবে আপনি যদি কোনও ডেস্কটপ বা ফোন অ্যাপে কাজ করছেন তবে প্রথমে বিকল্পগুলি অন্বেষণ করুন। .NET এর মতো অ্যাপ্লিকেশন পরিবেশে এখন সাধারণ মাল্টি-থ্রেডিং পরিস্থিতিগুলির 90% সম্ভবত পরিচালনা বা ব্যাপকভাবে সরল করার সরঞ্জামগুলি অন্তর্ভুক্ত। (asnync / প্রতীক্ষা, PLinq, IObservable, TPL ...)। বহু-থ্রেডযুক্ত কোডটি শক্ত। আপনি যদি চক্রটি পুনরায় উদ্ভাবন না করেন তবে আপনাকে এটি পরীক্ষা করতে হবে না।
পল উইলিয়ামস

উত্তর:


245

দেখুন, এটি করার সহজ কোনও উপায় নেই। আমি এমন একটি প্রকল্পে কাজ করছি যা সহজাতভাবে মাল্টিথ্রেডেড। অপারেটিং সিস্টেম থেকে ইভেন্টগুলি আসে এবং আমি তাদের একযোগে প্রক্রিয়া করতে পারি।

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

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

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

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

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


1
কোড বিশ্লেষণ দুর্দান্ত যদি আপনি কোনও ভাষা / ফ্রেমওয়ার্ক ব্যবহার করেন যা এটির অনুমতি দেয়। ইজি: ফাইন্ডব্যাগগুলি স্ট্যাটিক ভেরিয়েবলগুলির সাথে খুব সহজ এবং সহজ ভাগ করে নেওয়া একত্রীকরণ বিষয়গুলি খুঁজে পাবে। এটি সিংগলটন ডিজাইনের নিদর্শনগুলি যা খুঁজে পাচ্ছে না তা ধরে নিয়েছে সমস্ত বস্তু একাধিকবার তৈরি করা যেতে পারে। এই প্লাগইনটি স্প্রিংয়ের মতো ফ্রেমওয়ার্কের জন্য দু: খজনকভাবে অপর্যাপ্ত।
জম্বি

3
সক্রিয় বস্তু: আসলে একটি নিরাময় আছে। drdobbs.com/parallel/prefer- using
ডিল

6
যদিও এটি একটি ভাল পরামর্শ, আমি এখনও জিজ্ঞাসা করেই রেখেছি, "আমি এমন ন্যূনতম অঞ্চলগুলিতে কীভাবে পরীক্ষা করব যেখানে একাধিক থ্রেডের প্রয়োজন হয়?"
ব্রায়ান রায়নার

5
"যদি এটি পরীক্ষা করা খুব জটিল হয় তবে আপনি এটি ভুল করছেন" - আমাদের সবাইকে লিগ্যাসি কোডে ডুবতে হবে যা আমরা লিখিনি। এই পর্যবেক্ষণটি কাউকে ঠিক কীভাবে সহায়তা করে?
রোনা

2
স্থির বিশ্লেষণ সম্ভবত একটি ভাল ধারণা, কিন্তু এটি পরীক্ষা করে না। এই পোস্টটি সত্যিই প্রশ্নের উত্তর দেয় না, যা পরীক্ষা করার পদ্ধতি সম্পর্কে।
ওয়ারেন শিশ

96

এই প্রশ্নটি পোস্ট করার পরে খুব বেশি সময় হয়েছে, তবে এখনও এর উত্তর দেওয়া হয়নি ...

kleolb02 এর উত্তরটি একটি ভাল। আমি আরও বিশদে যাওয়ার চেষ্টা করব।

একটি উপায় আছে, যা আমি সি # কোডের জন্য অনুশীলন করি। ইউনিট পরীক্ষার জন্য আপনার পুনরুত্পাদনযোগ্য টেস্টগুলি প্রোগ্রাম করতে সক্ষম হওয়া উচিত , এটি মাল্টিথ্রেডেড কোডের মধ্যে বৃহত্তম চ্যালেঞ্জ। সুতরাং আমার উত্তরটির লক্ষ্য অ্যাসিক্রোনাস কোডকে একটি পরীক্ষার জোতাতে বাধ্য করা, যা একযোগে কাজ করে

এটি জেরার্ড মেসজার্ডোসের " xUnit টেস্ট প্যাটার্নস " বইয়ের একটি ধারণা এবং এটি "বিনীত অবজেক্ট" (পি। 695) নামে পরিচিত: আপনাকে মূল লজিক কোড এবং একে অপরের থেকে অ্যাসিনক্রোনাস কোডের মতো গন্ধযুক্ত কিছু আলাদা করতে হবে। এটি মূল যুক্তির জন্য একটি শ্রেণীর ফলাফল করবে, যা সিঙ্ক্রোনসিভভাবে কাজ করে

এটি আপনাকে সিঙ্ক্রোনাস পদ্ধতিতে মূল লজিক কোডটি পরীক্ষা করার অবস্থানে রাখে । মূল যুক্তিতে আপনি যে কলগুলি করছেন তার সময়কালের উপর আপনার সম্পূর্ণ নিয়ন্ত্রণ রয়েছে এবং সুতরাং এটি পুনরুত্পাদনযোগ্য পরীক্ষা করতে পারে । এবং এটি মূল যুক্তি এবং অ্যাসিনক্রোনাস যুক্তি পৃথক করা থেকে আপনার লাভ।

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

এর উপরে যে কোনও কিছু (শ্রেণীর মধ্যে পারস্পরিক মিথস্ক্রিয়া পরীক্ষা করা) উপাদান পরীক্ষা tests এছাড়াও আপনি যদি "নম্র অবজেক্ট" প্যাটার্নটির সাথে আঁকেন তবে এই ক্ষেত্রেও আপনার সময়সীমার উপর নিখুঁত নিয়ন্ত্রণ রাখতে সক্ষম হওয়া উচিত।


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

মাল্টি প্রসেসর সিস্টেম সম্পর্কে কি?
টেকনোফিল

65

সত্যিই শক্ত! আমার (সি ++) ইউনিট পরীক্ষাগুলিতে, আমি এটি ব্যবহার করা সম্মতি সংক্রান্ত প্যাটার্নের লাইন ধরে কয়েকটি বিভাগে বিভক্ত করেছি:

  1. একক থ্রেডে পরিচালিত এবং থ্রেড সচেতন নয় এমন ক্লাসগুলির জন্য ইউনিট পরীক্ষা - সহজ, যথারীতি পরীক্ষা test

  2. মনিটরের অবজেক্টের জন্য ইউনিট পরীক্ষাগুলি (যাঁরা কলারদের নিয়ন্ত্রণের থ্রেডে সিঙ্ক্রোনাইজড পদ্ধতিগুলি কার্যকর করেন) যা একটি সিঙ্ক্রোনাইজড পাবলিক এপিআই প্রকাশ করে - এপিআই প্রয়োগ করে এমন একাধিক মক থ্রেড ইনস্ট্যান্ট করে। প্যাসিভ অবজেক্টের অভ্যন্তরীণ পরিস্থিতি অনুশীলনকারী পরিস্থিতিগুলি তৈরি করুন। দীর্ঘতর চলমান পরীক্ষা অন্তর্ভুক্ত করুন যা মূলত দীর্ঘ সময় ধরে একাধিক থ্রেড থেকে হ্যাককে প্রহার করে। এটি আমি অবৈজ্ঞানিক জানি কিন্তু এটি আত্মবিশ্বাস তৈরি করে।

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

একপাশে হিসাবে:

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


51

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

টেস্টেবল মাল্টিথ্রেডেড কোড লেখা

প্রথমটি হ'ল আপনার প্রোডাকশন থ্রেড হ্যান্ডলিং কোডটি এমন সমস্ত কোড থেকে আলাদা করা যা প্রকৃত ডেটা প্রক্রিয়াকরণ করে। এইভাবে, ডেটা প্রসেসিংটি একক থ্রেডেড কোড হিসাবে পরীক্ষা করা যেতে পারে এবং মাল্টিথ্রেডেড কোডটি কেবল থ্রেড সমন্বয় করা।

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

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

মাল্টিথ্রেডেড কোডের জন্য লিখন ইউনিট পরীক্ষা

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

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

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

অবশেষে, আপনার পরীক্ষায় যে বাগের সংখ্যা ধরা পড়েছিল তার সন্ধান করুন। যদি আপনার পরীক্ষায় ৮০% কোডের কভারেজ থাকে তবে এটি আপনার বাগের প্রায় ৮০% ধরা আশা করা যায়। যদি আপনার পরীক্ষাটি খুব ভালভাবে ডিজাইন করা থাকে তবে কোনও বাগ খুঁজে না পান, তবে যুক্তিসঙ্গত সম্ভাবনা রয়েছে যে আপনার কাছে অতিরিক্ত বাগ নেই যা কেবলমাত্র উত্পাদন ক্ষেত্রে প্রদর্শিত হবে। পরীক্ষায় যদি এক বা দুটি বাগ ধরা পড়ে তবে আপনি ভাগ্যবান হতে পারেন। এর বাইরে এবং আপনি আপনার থ্রেড হ্যান্ডলিং কোডটির একটি সম্পূর্ণ পুনর্লিখন বা এমনকি একটি সম্পূর্ণ পুনর্লিখন বিবেচনা করতে চাইতে পারেন, যেহেতু সম্ভবত কোডটিতে এখনও লুকানো বাগ রয়েছে যা কোডটি উত্পাদন না হওয়া পর্যন্ত খুঁজে পাওয়া খুব কঠিন এবং সম্ভবত তখন ঠিক করা কঠিন।


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

4
একটি স্বল্পতম বোঝা উপায়ের আশ্চর্য সংক্ষিপ্তসার। আপনার উত্তরটি আসল বিভাজনকে পিপিল করে যা সাধারণত উপেক্ষা করে on
prash

1
ডজন সেকেন্ডটি বেশ দীর্ঘ সময়, এমনকি যদি আপনি কেবল তার দৈর্ঘ্যের কয়েক শতাধিক পরীক্ষাও করেন ...
টবি স্পাইট

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

2
আপনার থ্রেড লজিককে কার্যকারিতা থেকে পৃথক হিসাবে আলাদা করতে পারার পক্ষে এটি একটি ভাল যুক্তি (আমি জানি, সম্পন্নের চেয়ে অনেক সহজ বলা হয়েছে)। এবং, যদি সম্ভব হয় তবে পরীক্ষার স্যুটটি "প্রতিটি পরিবর্তন" এবং "প্রাক কমিট" সেটগুলিতে বিভক্ত করা (যাতে আপনার মিনিট থেকে মিনিটের পরীক্ষাগুলি খুব বেশি প্রভাবিত হয় না)।
টবি স্পিড

22

মাল্টি-থ্রেড কোড টেস্ট করার ক্ষেত্রেও আমার গুরুতর সমস্যা হয়েছিল। তারপরে জেরার্ড মেসজারোসের "xUnit টেস্ট প্যাটার্নস" এ আমি একটি দুর্দান্ত সমাধান পেয়েছি। তিনি যে প্যাটার্নটি বর্ণনা করেছেন তাকে নম্র অবজেক্ট বলা হয় ।

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


20

চারপাশে কয়েকটি সরঞ্জাম রয়েছে যা বেশ ভাল। এখানে কিছু জাভা সংক্ষিপ্তসার রয়েছে।

কিছু ভাল স্থিতিশীল বিশ্লেষণ সরঞ্জামগুলির মধ্যে রয়েছে ফাইন্ডব্যাগস (কিছু দরকারী ইঙ্গিত দেয়), জে লিন্ট , জাভা পাথফাইন্ডার (জেপিএফ এবং জেপিএফ 2), এবং বোগর

মাল্টিথ্রেডডিটিসি হ'ল একটি দুর্দান্ত গতিশীল বিশ্লেষণ সরঞ্জাম (জুনিতের সাথে সংহত) যেখানে আপনাকে নিজের পরীক্ষার কেস সেট আপ করতে হবে।

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

স্পিন আপনার জাভা (এবং অন্যান্য) উপাদানগুলির মডেলিংয়ের জন্য একটি দুর্দান্ত সরঞ্জাম, তবে আপনার কিছু কার্যকর কাঠামো থাকা দরকার। এটি যেমন ব্যবহার করা শক্ত তবে আপনি যদি এটি কীভাবে ব্যবহার করতে জানেন তবে চূড়ান্ত শক্তিশালী। বেশ কয়েকটি সরঞ্জাম হুডের নীচে স্পিন ব্যবহার করে।

মাল্টিথ্রেডডিটিসি সম্ভবত সর্বাধিক মূলধারার, তবে উপরে উল্লিখিত কয়েকটি স্থির বিশ্লেষণ সরঞ্জাম অবশ্যই দেখার মতো।


16

অপেক্ষাকৃত দক্ষতা ইউনিট পরীক্ষাগুলি লিখতে আপনাকে সহায়তা করতেও সহায়তা করতে পারে। এটি আপনাকে আপনার সিস্টেমে কোনও স্থানে আপডেট হওয়া পর্যন্ত অপেক্ষা করতে দেয়। উদাহরণ স্বরূপ:

await().untilCall( to(myService).myMethod(), greaterThan(3) );

অথবা

await().atMost(5,SECONDS).until(fieldIn(myObject).ofType(int.class), equalTo(1));

এটিতে স্কালা এবং গ্রোভির সমর্থনও রয়েছে।

await until { something() > 4 } // Scala example

1
প্রত্যাশা উজ্জ্বল - ঠিক আমি যা খুঁজছিলাম!
ফোরজি_7

14

থ্রেডেড কোড এবং সাধারণভাবে খুব জটিল সিস্টেমে টেস্ট করার (কিন্ডা) আরেকটি উপায় হ'ল ফজ টেস্টিং । এটি দুর্দান্ত নয়, এবং এটি সমস্ত কিছুই খুঁজে পাবে না, তবে এটি কার্যকর এবং এটি সহজ করার সম্ভাবনা রয়েছে।

উদ্ধৃতি:

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

...

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

...

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


13

আমি এটি অনেক কাজ করেছি এবং হ্যাঁ এটি সফল হয়।

কিছু টিপস:

  • একাধিক পরীক্ষার থ্রেড চালানোর জন্য গ্রোবোটিলগুলি
  • আলফা ওয়ার্কস কনটেষ্ট থেকে যন্ত্রের ক্লাসে পুনরাবৃত্তির মধ্যে ইন্টারলিভিংস পরিবর্তিত হয়
  • একটি throwableক্ষেত্র তৈরি করুন এবং এটি পরীক্ষা করুন tearDown(তালিকাভুক্তি দেখুন 1)। আপনি যদি অন্য থ্রেডে কোনও খারাপ ব্যতিক্রম ধরা পড়েন তবে কেবল এটিকে নিক্ষেপযোগ্য হিসাবে নির্ধারণ করুন।
  • আমি তালিকা 2 এ ইউটিস ক্লাস তৈরি করেছি এবং এটি অমূল্য পেয়েছি, বিশেষত ওয়েটফরফেরাইফাই এবং ওয়েটফোরকন্ডিশন যা আপনার পরীক্ষাগুলির কর্মক্ষমতা ব্যাপকভাবে বৃদ্ধি করবে।
  • AtomicBooleanআপনার পরীক্ষাগুলিতে ভাল ব্যবহার করুন । এটি থ্রেড নিরাপদ, এবং কলব্যাক ক্লাস এবং এই জাতীয় পছন্দগুলি থেকে মানগুলি সঞ্চয় করতে আপনার প্রায়শই একটি চূড়ান্ত রেফারেন্স ধরণের প্রয়োজন। তালিকা 3 এ উদাহরণ দেখুন।
  • সর্বদা আপনার পরীক্ষার সময়সীমা (উদাহরণস্বরূপ @Test(timeout=60*1000)) দেওয়ার বিষয়টি নিশ্চিত করুন , কারণ সহকারী পরীক্ষাগুলি কখনও কখনও ভেঙে গেলে চিরতরে স্তব্ধ হয়ে যায়।

তালিকা 1:

@After
public void tearDown() {
    if ( throwable != null )
        throw throwable;
}

তালিকা 2:

import static org.junit.Assert.fail;
import java.io.File;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.util.Random;
import org.apache.commons.collections.Closure;
import org.apache.commons.collections.Predicate;
import org.apache.commons.lang.time.StopWatch;
import org.easymock.EasyMock;
import org.easymock.classextension.internal.ClassExtensionHelper;
import static org.easymock.classextension.EasyMock.*;

import ca.digitalrapids.io.DRFileUtils;

/**
 * Various utilities for testing
 */
public abstract class DRTestUtils
{
    static private Random random = new Random();

/** Calls {@link #waitForCondition(Integer, Integer, Predicate, String)} with
 * default max wait and check period values.
 */
static public void waitForCondition(Predicate predicate, String errorMessage) 
    throws Throwable
{
    waitForCondition(null, null, predicate, errorMessage);
}

/** Blocks until a condition is true, throwing an {@link AssertionError} if
 * it does not become true during a given max time.
 * @param maxWait_ms max time to wait for true condition. Optional; defaults
 * to 30 * 1000 ms (30 seconds).
 * @param checkPeriod_ms period at which to try the condition. Optional; defaults
 * to 100 ms.
 * @param predicate the condition
 * @param errorMessage message use in the {@link AssertionError}
 * @throws Throwable on {@link AssertionError} or any other exception/error
 */
static public void waitForCondition(Integer maxWait_ms, Integer checkPeriod_ms, 
    Predicate predicate, String errorMessage) throws Throwable 
{
    waitForCondition(maxWait_ms, checkPeriod_ms, predicate, new Closure() {
        public void execute(Object errorMessage)
        {
            fail((String)errorMessage);
        }
    }, errorMessage);
}

/** Blocks until a condition is true, running a closure if
 * it does not become true during a given max time.
 * @param maxWait_ms max time to wait for true condition. Optional; defaults
 * to 30 * 1000 ms (30 seconds).
 * @param checkPeriod_ms period at which to try the condition. Optional; defaults
 * to 100 ms.
 * @param predicate the condition
 * @param closure closure to run
 * @param argument argument for closure
 * @throws Throwable on {@link AssertionError} or any other exception/error
 */
static public void waitForCondition(Integer maxWait_ms, Integer checkPeriod_ms, 
    Predicate predicate, Closure closure, Object argument) throws Throwable 
{
    if ( maxWait_ms == null )
        maxWait_ms = 30 * 1000;
    if ( checkPeriod_ms == null )
        checkPeriod_ms = 100;
    StopWatch stopWatch = new StopWatch();
    stopWatch.start();
    while ( !predicate.evaluate(null) ) {
        Thread.sleep(checkPeriod_ms);
        if ( stopWatch.getTime() > maxWait_ms ) {
            closure.execute(argument);
        }
    }
}

/** Calls {@link #waitForVerify(Integer, Object)} with <code>null</code>
 * for {@code maxWait_ms}
 */
static public void waitForVerify(Object easyMockProxy)
    throws Throwable
{
    waitForVerify(null, easyMockProxy);
}

/** Repeatedly calls {@link EasyMock#verify(Object[])} until it succeeds, or a
 * max wait time has elapsed.
 * @param maxWait_ms Max wait time. <code>null</code> defaults to 30s.
 * @param easyMockProxy Proxy to call verify on
 * @throws Throwable
 */
static public void waitForVerify(Integer maxWait_ms, Object easyMockProxy)
    throws Throwable
{
    if ( maxWait_ms == null )
        maxWait_ms = 30 * 1000;
    StopWatch stopWatch = new StopWatch();
    stopWatch.start();
    for(;;) {
        try
        {
            verify(easyMockProxy);
            break;
        }
        catch (AssertionError e)
        {
            if ( stopWatch.getTime() > maxWait_ms )
                throw e;
            Thread.sleep(100);
        }
    }
}

/** Returns a path to a directory in the temp dir with the name of the given
 * class. This is useful for temporary test files.
 * @param aClass test class for which to create dir
 * @return the path
 */
static public String getTestDirPathForTestClass(Object object) 
{

    String filename = object instanceof Class ? 
        ((Class)object).getName() :
        object.getClass().getName();
    return DRFileUtils.getTempDir() + File.separator + 
        filename;
}

static public byte[] createRandomByteArray(int bytesLength)
{
    byte[] sourceBytes = new byte[bytesLength];
    random.nextBytes(sourceBytes);
    return sourceBytes;
}

/** Returns <code>true</code> if the given object is an EasyMock mock object 
 */
static public boolean isEasyMockMock(Object object) {
    try {
        InvocationHandler invocationHandler = Proxy
                .getInvocationHandler(object);
        return invocationHandler.getClass().getName().contains("easymock");
    } catch (IllegalArgumentException e) {
        return false;
    }
}
}

তালিকা 3:

@Test
public void testSomething() {
    final AtomicBoolean called = new AtomicBoolean(false);
    subject.setCallback(new SomeCallback() {
        public void callback(Object arg) {
            // check arg here
            called.set(true);
        }
    });
    subject.run();
    assertTrue(called.get());
}

2
একটি সময়সীমা হ'ল একটি ভাল ধারণা, তবে যদি কোনও পরীক্ষার সময় শেষ হয় তবে পরবর্তী সময়ে যে কোনও ফলাফল সন্দেহ হয় suspect সময়সীমা নির্ধারিত পরীক্ষায় এখনও কিছু থ্রেড চলতে পারে যা আপনাকে জড়িয়ে দিতে পারে।
ডন কার্কবি

12

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

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

যাইহোক, আমি মনে করি এমটি কোড পরীক্ষার এই দিকটি এখানে উল্লেখ করা হয়নি: কোডের আক্রমণকারীদের সনাক্ত করুন যা আপনি এলোমেলোভাবে পরীক্ষা করতে পারেন। দুর্ভাগ্যক্রমে, এই আক্রমণকারীদের সন্ধান করাও বেশ কঠিন সমস্যা। এছাড়াও মৃত্যুদন্ড কার্যকর করার সময় তারা সর্বদা না ধরে থাকতে পারে, তাই আপনাকে মৃত্যুদন্ড কার্যকর করার পয়েন্টগুলি খুঁজে পেতে / প্রয়োগ করতে হবে যেখানে আপনি সেগুলি সত্য হতে পারে বলে আশা করতে পারেন। কোড প্রয়োগের ক্ষেত্রে এ জাতীয় অবস্থায় আনাও একটি কঠিন সমস্যা (এবং এটি নিজেই সম্মতিজনিত সমস্যাগুলির মধ্যে পড়ে।

পড়ার জন্য কিছু আকর্ষণীয় লিঙ্ক:

  • নির্ধারিত ইন্টারলিভিং : একটি কাঠামো যা নির্দিষ্ট থ্রেড ইন্টারলিভিংগুলিকে বাধ্য করতে এবং তারপরে আক্রমণকারীদের জন্য পরীক্ষা করতে দেয়
  • jMock ব্লিটজার : স্ট্রেস টেস্ট সিঙ্ক্রোনাইজেশন
  • assertConcurrent : স্ট্রেস টেস্টিং সিঙ্ক্রোনাইজেশনের JUnit সংস্করণ
  • সাম্প্রতিক কোড পরীক্ষা করা : ব্রুট ফোর্স (স্ট্রেস টেস্ট) বা ডিস্ট্রিমেন্টিক (আক্রমণকারীদের দিকে যাচ্ছেন) দুটি প্রাথমিক পদ্ধতির সংক্ষিপ্ত বিবরণ

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

6

পিট গুডলিফের থ্রেডযুক্ত কোডের ইউনিট টেস্টিংয়ের একটি সিরিজ রয়েছে ।

এটা কঠিন. আমি সহজতর উপায় গ্রহণ করি এবং থ্রেডিং কোডটি আসল পরীক্ষা থেকে বিমূর্ত রাখার চেষ্টা করি। পিট উল্লেখ করেছেন যে আমি যেভাবে এটি করি তা ভুল তবে আমি বিচ্ছেদটি সঠিকভাবে পেয়েছি বা আমি ভাগ্যবান হয়েছি।


6
আমি এ পর্যন্ত প্রকাশিত দুটি নিবন্ধ পড়েছি, এবং আমি সেগুলিকে খুব সহায়ক মনে করি না। তিনি খুব বেশি সুনির্দিষ্ট পরামর্শ না দিয়ে কেবল অসুবিধাগুলি সম্পর্কে কথা বলেন। ভবিষ্যতে নিবন্ধগুলি উন্নত হতে পারে।
ডন কার্কবি

6

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

ইউনিট পরীক্ষাগুলির সাহায্যে থ্রেড-সুরক্ষা "প্রুভিং" অনেক dicier। আমার বিশ্বাস যে এটি বিভিন্ন প্ল্যাটফর্ম / কনফিগারেশনে স্বয়ংক্রিয় সংহতকরণ পরীক্ষার মাধ্যমে আরও ভাল পরিবেশিত হয়।


6

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

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

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

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

আপডেট: আমি মাল্টিথ্রেডেড টিসি জাভা লাইব্রেরির সাথে কিছুটা খেলেছি, এবং এটি ভালভাবে কাজ করে। আমি এর কয়েকটি বৈশিষ্ট্য একটি নেট। সংস্করণেও টিকেটেষ্টকে কল করেছি


5

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

অতএব আমি এমন মোড়কের লিখন লিখেছি যা দেখতে এরকম কিছু দেখায় (সরলীকৃত):

public interface IThread
{
    void Start();
    ...
}

public class ThreadWrapper : IThread
{
    private readonly Thread _thread;

    public ThreadWrapper(ThreadStart threadStart)
    {
        _thread = new Thread(threadStart);
    }

    public Start()
    {
        _thread.Start();
    }
}

public interface IThreadingManager
{
    IThread CreateThread(ThreadStart threadStart);
}

public class ThreadingManager : IThreadingManager
{
    public IThread CreateThread(ThreadStart threadStart)
    {
         return new ThreadWrapper(threadStart)
    }
}

সেখান থেকে আমি সহজেই আইটিহ্রেডিং ম্যানেজারটিকে আমার উপাদানগুলিতে ইনজেক্ট করতে পারি এবং পরীক্ষার সময় যেমনটি আশা করি তেমন থ্রেডটি আচরণ করতে আমার পছন্দসই বিচ্ছিন্ন কাঠামোটি ব্যবহার করতে পারি।

এটি এখনও পর্যন্ত আমার পক্ষে দুর্দান্ত কাজ করেছে এবং আমি থ্রেড পুল, সিস্টেমের জিনিসগুলির জন্য n পরিবেশ, ঘুম ইত্যাদি for


5

আমার সম্পর্কিত উত্তরটি একবার দেখুন

একটি কাস্টম বাধা জন্য একটি পরীক্ষার ক্লাস নকশা

এটি জাভার দিকে পক্ষপাতদুষ্ট তবে বিকল্পগুলির যুক্তিসঙ্গত সংক্ষিপ্তসার রয়েছে।

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

স্থিতিশীল বিশ্লেষণ এবং আনুষ্ঠানিক পদ্ধতিগুলি (দেখুন, সংক্ষিপ্তকরণ : রাজ্য মডেল এবং জাভা প্রোগ্রামগুলি ) একটি বিকল্প তবে আমি তাদের বাণিজ্যিক বিকাশে সীমিত ব্যবহার করতে পেলাম।

ভুলে যাবেন না যে কোনও লোড / ভেজানো শৈলীর পরীক্ষাগুলি খুব কমই সমস্যা হাইলাইট করার গ্যারান্টিযুক্ত।

শুভকামনা!


আপনার tempus-fugitএখানে আপনার গ্রন্থাগারেরও উল্লেখ করা উচিত , যা helps write and test concurrent code;)
আইডলন

4

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

এমনকি ক্লাস সাবমোমেশন, সমবর্তী ক্লাসের মাধ্যমে অনিরাপদ বস্তুগুলিতে অ্যাক্সেস করা এবং ডাবল চেকড লকিং দৃষ্টান্ত ব্যবহার করার সময় নিখোঁজ অস্থির সংশোধকগুলিকে চিহ্নিত করার মতো বিষয়গুলির আশেপাশে কিছু খুব সূক্ষ্ম সম্ভাব্য সমস্যাও ধরা পড়ে।

আপনি মাল্টিথ্রেডেড জাভা লিখলে শট দিন।


3

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

স্প্রিংকলার - উন্নত সিঙ্ক্রোনাইজেশন অবজেক্ট


3
দয়া করে এখানে উপায়গুলি ব্যাখ্যা করুন, বাহ্যিক লিঙ্কগুলি ভবিষ্যতে মৃত হতে পারে।
ইউওউ

2

আমি গত সপ্তাহের বেশিরভাগ সময় একটি ইউনিভার্সিটি লাইব্রেরিতে কাটিয়েছি সহবর্তী কোডের ডিবাগিং অধ্যয়নরত। কেন্দ্রীয় সমস্যাটি হ'ল সমকালীন কোডটি অ-নিরস্তক। সাধারণত, একাডেমিক ডিবাগিং এখানে তিনটি শিবিরের মধ্যে পড়েছে:

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

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

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

শুভকামনা, এবং সমস্যাটি নিয়ে কাজ চালিয়ে যান।


2

থ্রেডেড কোড টেস্ট করার দুর্ভাগ্যজনক কাজটি আমি করেছি এবং এগুলি অবশ্যই আমার লেখা সবচেয়ে কঠিন পরীক্ষা।

আমার পরীক্ষা লেখার সময়, আমি প্রতিনিধি এবং ইভেন্টগুলির সংমিশ্রণটি ব্যবহার করি। মূলত এগুলি কোনও কোনও বা PropertyNotifyChangedকোনওরকমের সাথে ইভেন্টগুলি ব্যবহার সম্পর্কে aboutWaitCallbackConditionalWaiter

আমি নিশ্চিত নই যে এটি সর্বোত্তম পন্থা ছিল কিনা তবে এটি আমার পক্ষে কার্যকর হয়েছে।


1

"মাল্টি-থ্রেডেড" কোডের অধীনে ধরে নেওয়া মানে এমন কিছু ছিল

  • রাষ্ট্রীয় এবং পরিবর্তনীয়
  • এবং একসাথে একাধিক থ্রেড দ্বারা অ্যাক্সেস / সংশোধিত

অন্য কথায় আমরা কাস্টম স্টেটফুল থ্রেড-সেফ ক্লাস / পদ্ধতি / ইউনিট পরীক্ষা করার কথা বলছি - যা আজকাল খুব বিরল জন্তু হওয়া উচিত।

কারণ এই প্রাণীটি বিরল, প্রথমে আমাদের এটি নিশ্চিত করার দরকার আছে যে এটি লেখার জন্য সমস্ত বৈধ অজুহাত রয়েছে।

পদক্ষেপ 1. একই সিঙ্ক্রোনাইজেশন প্রসঙ্গে রাষ্ট্র পরিবর্তন করার বিষয়টি বিবেচনা করুন।

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

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

পদক্ষেপ 2. যদি একক সিঙ্ক্রোনাইজেশন প্রসঙ্গে ভাগ করা রাষ্ট্রের কারসাজি করা একেবারেই সম্ভব না।

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

দ্রষ্টব্য: যদি কোডটি একাধিক শ্রেণীর জুড়ে বড় / স্প্যান হয় এবং একাধিক থ্রেডের স্টেট ম্যানিপুলেশন প্রয়োজন হয় তবে নকশাটি ভাল না হওয়ার খুব বেশি সম্ভাবনা রয়েছে, পদক্ষেপ 1 পুনর্বিবেচনা করুন

পদক্ষেপ ৩. যদি এই পদক্ষেপটি পৌঁছে যায় তবে আমাদের নিজস্ব কাস্টম রাষ্ট্রীয় থ্রেড-নিরাপদ শ্রেণি / পদ্ধতি / ইউনিট পরীক্ষা করা দরকার

আমি মরে যাবো সত্য: এই জাতীয় কোডের জন্য আমাকে কখনই সঠিক পরীক্ষা লিখতে হয়নি। বেশিরভাগ সময় আমি প্রথম ধাপে চলে যাই, কখনও কখনও 2 য় ধাপে Last শেষবারের মতো আমাকে কাস্টম থ্রেড-নিরাপদ কোডটি লিখতে হয়েছিল এত বছর আগে আমি ইউনিট টেস্টিং গ্রহণ করার আগে এটি ছিল / সম্ভবত আমার এটি লিখতে হবে না যাইহোক বর্তমান জ্ঞান সঙ্গে।

যদি আমাকে সত্যিই এই জাতীয় কোড পরীক্ষা করতে হয় ( শেষ পর্যন্ত, প্রকৃত উত্তর ) তবে আমি নীচের কয়েকটি জিনিস চেষ্টা করব

  1. অ-নিরস্তিক স্ট্রেস টেস্টিং। যেমন একসাথে 100 থ্রেড চালান এবং শেষ ফলাফলটি সামঞ্জস্যপূর্ণ তা পরীক্ষা করুন check এটি একাধিক ব্যবহারকারীর দৃশ্যের উচ্চ স্তরের / সংহতকরণ পরীক্ষার জন্য আরও সাধারণ তবে ইউনিট পর্যায়েও এটি ব্যবহার করা যেতে পারে।

  2. কিছু পরীক্ষার 'হুকস' প্রকাশ করুন যেখানে পরীক্ষাগুলি নির্ধারণমূলক পরিস্থিতি তৈরি করতে সহায়তা করতে কিছু কোড ইনজেক্ট করতে পারে যেখানে একটি থ্রেডের অপরটির আগে অপারেশন করতে হবে। এটি যতটা কুৎসিত, আমি এর চেয়ে ভাল আর কিছু ভাবতে পারি না।

  3. থ্রেডগুলি চালিত করতে এবং নির্দিষ্ট ক্রমে ক্রিয়াকলাপ সম্পাদন করতে বিলম্ব-চালিত পরীক্ষা। কঠোরভাবে এ জাতীয় পরীক্ষাগুলি অ-নিরোধকও হয় (সিস্টেম জমে থাকা / স্টপ-দ্য ওয়ার্ল্ড জিসি সংগ্রহের সুযোগ রয়েছে যা অন্যথায় অর্কেস্ট্রেটেড বিলম্বকে বিকৃত করতে পারে), এটি কুৎসিত হলেও হুকগুলি এড়াতে দেয়।


0

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

আপনি অনিরাপদ http মোডে কিছু বাগ খুঁজে পেতে পারেন, যেখানে আপনি কমপক্ষে যে ফর্ম তথ্য প্রেরণ করা হচ্ছে তা বিশ্লেষণ করতে পারেন এবং প্রতিটি ব্যবহারকারীর জন্য এটি নিয়মিতভাবে পরিবর্তন করতে পারেন। সত্যিকারের পরীক্ষাগুলি হ'ল আপনি যখন https তে চালিত হন (সুরক্ষিত সকেট স্তর)। তারপরে, আপনার নিয়মিত পদ্ধতিতে সেশন এবং কুকি ডেটা পরিবর্তনের সাথেও লড়াই করতে হবে যা কিছুটা আরও বিশৃঙ্খল হতে পারে।

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

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

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


0

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

তবে এমনকি এই গ্রন্থাগারের জাভা মেমোরি মডেল স্পেসিফিকেশন সম্পর্কে ভাল জ্ঞান প্রয়োজন যাতে আমরা ঠিক কীভাবে পরীক্ষা করি know তবে আমি মনে করি এই প্রচেষ্টার কেন্দ্রবিন্দুটি মিরকোবেনমার্কস। বিশাল ব্যবসায়িক অ্যাপ্লিকেশন নয়।


0

এই বিষয়ের উপর একটি নিবন্ধ রয়েছে, উদাহরণ কোডে রাস্টকে ভাষা হিসাবে ব্যবহার করে:

https://medium.com/@polyglot_factotum/rust-concurrency-five-easy-pieces-871f1c62906a

সংক্ষেপে, কৌশলটি আপনার সমবর্তী যুক্তিটি লিখতে হবে যাতে চ্যানেল এবং কনডওয়ারের মতো সরঞ্জামগুলি ব্যবহার করে মৃত্যুদণ্ডের একাধিক থ্রেডের সাথে জড়িত অ-নির্ধারণবাদের পক্ষে দৃ is় হয়।

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

লিঙ্ক-টু নিবন্ধটি ইউনিট-পরীক্ষাগুলি ব্যবহার করে পুরোপুরি লেখা।


-1

আপনি সহজ পরীক্ষা যদি নতুন থ্রেড (runnable) .run () আপনি runnable ক্রমানুসারে চালানোর জন্য থ্রেড উপহাস করতে

উদাহরণস্বরূপ, যদি পরীক্ষিত অবজেক্টের কোডটি নতুন থ্রেডের অনুরোধ করে

Class TestedClass {
    public void doAsychOp() {
       new Thread(new myRunnable()).start();
    }
}

তারপরে নতুন থ্রেডগুলি উপহাস করা এবং ধারাবাহিকভাবে চলমানযোগ্য যুক্তি চালানো সহায়তা করতে পারে

@Mock
private Thread threadMock;

@Test
public void myTest() throws Exception {
    PowerMockito.mockStatic(Thread.class);
    //when new thread is created execute runnable immediately 
    PowerMockito.whenNew(Thread.class).withAnyArguments().then(new Answer<Thread>() {
        @Override
        public Thread answer(InvocationOnMock invocation) throws Throwable {
            // immediately run the runnable
            Runnable runnable = invocation.getArgumentAt(0, Runnable.class);
            if(runnable != null) {
                runnable.run();
            }
            return threadMock;//return a mock so Thread.start() will do nothing         
        }
    }); 
    TestedClass testcls = new TestedClass()
    testcls.doAsychOp(); //will invoke myRunnable.run in current thread
    //.... check expected 
}

-3

(যদি সম্ভব হয়) থ্রেড ব্যবহার করবেন না, অভিনেতা / সক্রিয় বস্তু ব্যবহার করুন। পরীক্ষা সহজ।


2
@ ওমর্টেনটিটি হতে পারে তবে এটি এখনও সেরা উত্তর ইমো।
ডিল

-5

পরীক্ষার দৃষ্টান্ত থ্রেডসেফ তৈরি করতে আপনি EasyMock.makeThreadSafe ব্যবহার করতে পারেন


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