গতিশীল ভাষায় মক তৈরি করার সময় কীভাবে ত্রুটিগুলি সনাক্ত করা যায়?


10

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

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

তুচ্ছ নমুনা নিয়ে আপডেট করা হচ্ছে (কিছু তৈরি ভাষার উপর) ...

সংস্করণ 1:

Calc = {
    doMultiply(x, y) {return x * y}
}
//.... more code ....

// On some faraway remote code on a different file
Rect = {
    computeArea(l, w) {return Calc.doMultipy(x*y)}
}

// test for Rect
testComputeArea() { 
    Calc = new Mock()
    Calc.expect(doMultiply, 2, 30) // where 2 is the arity
    assertEqual(30, computeArea)
}

এখন, সংস্করণ 2 এ:

// I change the return types. I also update the tests for Calc
Calc = {
    doMultiply(x, y) {return {result: (x * y), success:true}}
}

... র‌্যাক্ট তখন রানটাইমের ক্ষেত্রে একটি ব্যতিক্রম ছুঁড়ে ফেলবে, তবুও পরীক্ষাটি সফল হবে।


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

ডিপেন্ডেন্সি ইনজেকশন সম্পর্কে আমি নিজেই এই প্রশ্নটি জিজ্ঞাসা করেছি। কারণ 1 দেখুন : রান নির্ভর সময়ে একটি নির্ভরশীল শ্রেণি পরিবর্তন করা যেতে পারে (পরীক্ষার চিন্তা করুন) । আমাদের দুজনেরই একই মানসিকতা রয়েছে তবে দুর্দান্ত ব্যাখ্যা নেই।
স্কট কোটস

আমি আপনার প্রশ্নটি আবার পড়ছি তবে ব্যাখ্যাটিতে কিছুটা বিভ্রান্ত হচ্ছি। আপনি একটি উদাহরণ প্রদান করতে পারেন?
স্কট কোটস

উত্তর:


2

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

আমার কাছে, সমস্যাটি স্ট্যাচ্যালি টাইপ করা ভাষায় আপনার চেয়ে আলাদা রিফ্যাক্টরিং কৌশল ব্যবহার করার পরামর্শ দেয়। স্থির ভাষায়, আপনি কিছু অংশে রিটার্নের ধরনগুলি প্রতিস্থাপন করেন যাতে কোন স্থানগুলি ভেঙে যেতে পারে তা জানতে আপনি "সংকলকটির উপর ঝুঁকতে" পারেন। এটি করা নিরাপদ, এবং সম্ভবত জায়গায় ফিরে আসার ধরনটি পরিবর্তনের চেয়ে নিরাপদ।

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


2

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

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

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


+1 হয় টেস্ট বা কোড দিয়ে কিছু ভুল আসলে পরিবর্তন হয়নি। কয়েক বছরের সি ++ / জাভা ব্যবহার করে অভ্যস্ত হতে আমার সময় লাগল took কোডের গতিশীল ভাষাগুলির অংশগুলির মধ্যে চুক্তিটি কী ফেরত দেওয়া উচিত নয়, তবে যা ফিরে আসে তা কী এবং এটি কী করতে পারে।
মিঃফক্স

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

ধরে নিলাম যে উপহাসকৃত ইউনিটটি 100% আচ্ছাদিত এবং কোনও জোর অনুপস্থিত নেই: কীভাবে আরও একটি সূক্ষ্ম পরিবর্তন হবে "foo এর জন্য নাল ফেরা উচিত" থেকে "foo এর জন্য খালি স্ট্রিং ফিরে আসা উচিত" how যদি কেউ সেই ইউনিটটি পরিবর্তন করে এবং এর পরীক্ষা করে কিছু গ্রাসকারী ইউনিট ভঙ্গ করতে পারে এবং মকের কারণে এটি স্বচ্ছ is (এবং না: "চুক্তি" অনুসারে বিদ্রূপযুক্ত মডিউলটি লেখার সময় বা ব্যবহার করার সময়, খালি স্ট্রিংগুলি রিটার্ন মান হিসাবে পরিচালনা করা প্রয়োজন নয় কারণ এটি খালি খালি স্ট্রিংগুলি বা কেবল নাল ফেরানোর কথা বলে;))) (মিথস্ক্রিয়ায় উভয় মডিউলের যথাযথ সংহতকরণের পরীক্ষা এটিই ধরতে পারে))
চেষ্টা করুন-শেষ পর্যন্ত
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.