যখন টিডিডি পরীক্ষাগুলি নতুন কার্যকারিতা প্রকাশ করে যা পরীক্ষাগুলিরও প্রয়োজন হয় তা প্রকাশ করে?


13

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

উদাহরণস্বরূপ, আমি একটি পয়েন্ট ক্লাস লিখছি যা উইলকোলাইডউইথ ( লাইনসেটমেন্ট ) রয়েছে :

public class Point {
    // Point data and constructor ...

    public bool CollidesWithLine(LineSegment lineSegment) {
        Vector PointEndOfMovement = new Vector(Position.X + Velocity.X,
                                               Position.Y + Velocity.Y);
        LineSegment pointPath = new LineSegment(Position, PointEndOfMovement);
        if (lineSegment.Intersects(pointPath)) return true;
        return false;
    }
}

আমি একটি পরীক্ষা লিখছিলাম CollidesWithLine যখন আমি বুঝলাম যে আমি একটি হবে LineSegment.Intersects ( LineSegment ) ফাংশন। তবে, এই নতুন কার্যকারিতাটি তৈরি করতে আমি আমার পরীক্ষার চক্রের যা করছি তা বন্ধ করে দেওয়া উচিত? এটি "রেড, গ্রিন, রিফ্যাক্টর" নীতিটি ভঙ্গ করে বলে মনে হচ্ছে।

আমি শুধু কোডটি সনাক্ত করে যে এর lineSegments ছেদ ভিতরে লেখা উচিত CollidesWithLine ফাংশন এবং refactor এটা পরে এটি কাজ করছে? লাইনসেজমেন্ট থেকে ডেটা অ্যাক্সেস করতে পারছি বলে এই ক্ষেত্রে এটি কাজ করবে তবে এই জাতীয় ডেটা প্রাইভেট থাকার ক্ষেত্রে কী হবে?

উত্তর:


14

কেবলমাত্র আপনার পরীক্ষা এবং সাম্প্রতিক কোডটি মন্তব্য করুন (বা কোনও স্ট্যাশ মধ্যে রেখে দেওয়া) যাতে আপনি প্রকৃতপক্ষে চক্রটি শুরুতে ঘড়ির পিছনে ফিরে এসেছেন। তারপরে LineSegment.Intersects(LineSegment)পরীক্ষা / কোড / রিফ্যাক্টর দিয়ে শুরু করুন। এটি শেষ হয়ে গেলে, আপনার পূর্ববর্তী পরীক্ষা / কোডটিকে (বা স্ট্যাশ থেকে টানতে) বিরামহীন করুন এবং চক্রটি বজায় রাখুন।


এটি কীভাবে আলাদা হয় কেবলমাত্র এটিকে উপেক্ষা করে এবং পরে এটিতে ফিরে আসবে?
জোশুয়া হ্যারিস

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

স্ট্যাশ কী? সংস্করণ নিয়ন্ত্রণ মত এটি?
জোশুয়া হ্যারিস

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

6

টিডিডি চক্রের:

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

আপনার বর্তমান নকশা সমাধান

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

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

সুতরাং এই দায়িত্বটি অন্য শ্রেণীর নিজস্ব হওয়া উচিত যেমন উদাহরণস্বরূপ "পয়েন্টসেটমেন্টক্লিজেশনডেক্টর" যার একটি পদ্ধতি থাকতে পারে:

বুল আরইনক্লিজেশন (পয়েন্ট পি, বিভাগের গুলি)

এবং এটি এমন কিছু যা আপনি পয়েন্ট এবং বিভাগগুলি থেকে আলাদাভাবে পরীক্ষা করে দেখতে পারেন।

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

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

আশা করি এটি সার্থক হয়েছে,


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

2

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


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

0

JUnit4 এর সাহায্যে আপনি @Ignoreযে পরীক্ষাগুলি স্থগিত করতে চান তার জন্য টীকাটি ব্যবহার করতে পারেন ।

আপনি স্থগিত করতে চান এমন প্রতিটি পদ্ধতিতে টীকা যুক্ত করুন এবং প্রয়োজনীয় কার্যকারিতাটির জন্য পরীক্ষার লিখন চালিয়ে যান। পুরানো পরীক্ষার কেসগুলি পরে রিফ্যাক্টারে ফিরে সার্কেল করুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.