পিডির উত্তরের জন্য আরও ব্যবহারিক পদ্ধতির গ্রহণ করা । টেডিডি টেস্টিংয়ের চেয়ে সফটওয়্যার ডিজাইনের বিষয়। আপনি পাশাপাশি চলার সাথে সাথে আপনার কাজ যাচাই করতে ইউনিট পরীক্ষা ব্যবহার করেন।
সুতরাং একটি ইউনিট পরীক্ষার স্তরে আপনাকে ইউনিটগুলি ডিজাইন করতে হবে যাতে সেগুলি পুরোপুরি ডিটারমিনিস্টিক ফ্যাশনে পরীক্ষা করা যায়। আপনি ইউনিটকে ননডেটারিস্টেমিক (যেমন একটি এলোমেলো সংখ্যা জেনারেটর) তৈরি করে এবং এটিকে বিমূর্ত করে এমন কিছু গ্রহণ করে আপনি এটি করতে পারেন। বলুন যে কোনও পদক্ষেপ ভাল কিনা সে সম্পর্কে সিদ্ধান্ত নেওয়ার জন্য আমাদের কাছে একটি নিষ্প্রভ উদাহরণ রয়েছে:
class Decider {
public boolean decide(float input, float risk) {
float inputRand = Math.random();
if (inputRand > input) {
float riskRand = Math.random();
}
return false;
}
}
// The usage:
Decider d = new Decider();
d.decide(0.1337f, 0.1337f);
এই পদ্ধতিটি পরীক্ষা করা খুব কঠিন এবং আপনি ইউনিট পরীক্ষায় যা যা সত্যই যাচাই করতে পারবেন তা হ'ল তার সীমানা ... তবে এর সীমানায় যাওয়ার জন্য অনেক চেষ্টা দরকার requires সুতরাং পরিবর্তে, এর ইন্টারফেস এবং কার্যকরীতা মোড়ানো একটি কংক্রিট বর্গ তৈরি করে এলোমেলো অংশটি বাদ দিন:
public interface IRandom {
public float random();
}
public class ConcreteRandom implements IRandom {
public float random() {
return Math.random();
}
}
Decider
শ্রেণী এখন বিমূর্ততা, অর্থাত্ ইন্টারফেসের মাধ্যমে কংক্রিট বর্গ ব্যবহার করার প্রয়োজন। জিনিসগুলি করার এই পদ্ধতিটিকে নির্ভরতা ইনজেকশন বলা হয় (নীচের উদাহরণটি কনস্ট্রাক্টর ইনজেকশনের উদাহরণ, তবে আপনি সেটারের সাহায্যে এটিও করতে পারেন):
class Decider {
IRandom irandom;
public Decider(IRandom irandom) { // constructor injection
this.irandom = irandom;
}
public boolean decide(float input, float risk) {
float inputRand = irandom.random();
if (inputRand > input) {
float riskRand = irandom.random();
}
return false;
}
}
// The usage:
Decider d = new Decider(new ConcreteRandom);
d.decide(0.1337f, 0.1337f);
আপনি নিজেকে জিজ্ঞাসা করতে পারেন কেন এই "কোড ব্লাট" প্রয়োজনীয়। ভাল, শুরু করার জন্য, আপনি এখন অ্যালগরিদমের এলোমেলো অংশের আচরণকে বিদ্রূপ করতে পারেন কারণ Decider
এখন IRandom
"ডিগ্রি" অনুসরণ করে একটি নির্ভরতা রয়েছে । আপনি এটির জন্য একটি উপহাসের কাঠামো ব্যবহার করতে পারেন তবে এই কোডটি নিজেকে কোড করার জন্য যথেষ্ট সহজ:
class MockedRandom() implements IRandom {
public List<Float> floats = new ArrayList<Float>();
int pos;
public void addFloat(float f) {
floats.add(f);
}
public float random() {
float out = floats.get(pos);
if (pos != floats.size()) {
pos++;
}
return out;
}
}
সর্বোত্তম অংশটি হ'ল এটি সম্পূর্ণ "প্রকৃত" কংক্রিট বাস্তবায়ন প্রতিস্থাপন করতে পারে। কোডটি এই জাতীয়ভাবে পরীক্ষা করা সহজ হয়ে যায়:
@Before void setUp() {
MockedRandom mRandom = new MockedRandom();
Decider decider = new Decider(mRandom);
}
@Test
public void testDecisionWithLowInput_ShouldGiveFalse() {
mRandom.addFloat(0f);
assertFalse(decider.decide(0.1337f, 0.1337f));
}
@Test
public void testDecisionWithHighInputRandButLowRiskRand_ShouldGiveFalse() {
mRandom.addFloat(1f);
mRandom.addFloat(0f);
assertFalse(decider.decide(0.1337f, 0.1337f));
}
@Test
public void testDecisionWithHighInputRandAndHighRiskRand_ShouldGiveTrue() {
mRandom.addFloat(1f);
mRandom.addFloat(1f);
assertTrue(decider.decide(0.1337f, 0.1337f));
}
আশা করি এটি আপনাকে কীভাবে আপনার অ্যাপ্লিকেশনটি ডিজাইন করবেন সে সম্পর্কে ধারণা দেয় যাতে অনুমতিগুলি বাধ্য করা যায় যাতে আপনি সমস্ত প্রান্তের মামলাগুলি পরীক্ষা করতে পারেন এবং কী নন।