অনুলিপি-আটকানো টেস্ট কোড: এটি কতটা খারাপ?


12

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

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

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

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


আপনি কোন পরীক্ষার সরঞ্জামটি ব্যবহার করছেন? এটি হতে পারে যে আপনার পরীক্ষার কাঠামোটি আপনি যে ধরণের পরীক্ষাগুলিতে লিখছেন তা সমর্থন করে না। 3 টিরও বেশি লাইনের কাট-এন-পেস্টটি সাধারণত খারাপ হয় তবে আপনি যদি প্রতিটি সময় নিজেই GUI পরীক্ষা সম্পাদন করার চেয়ে GUI পরীক্ষা স্বয়ংক্রিয়করণের মাধ্যমে আরও দীর্ঘমেয়াদী মান যুক্ত করতে সক্ষম হন তবে আপনি যা কিছু করছেন তা সম্ভবত খুব খারাপ হয়ে গেছে ভাল.
গ্লেনপিটারসন

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

3
আমি যা কিছু লিখেছি, পরীক্ষার কোডটি রিফ্যাক্টরিং থেকে বাদ দেওয়া হয়নি ..
সাইমন হোয়াইটহেড

উত্তর:


23

অনুলিপি-আটকানো এবং তারপরে সম্পাদিত পরীক্ষার কেসগুলি প্রায়শই ভাল থাকে।

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

অবশ্যই, বয়লারপ্লেট কোড যা অনেক পরীক্ষার ক্ষেত্রে অভিন্ন এবং কনসার্টে পরিবর্তন আনতে হয় এবং এটি ফ্যাক্টর করা উচিত।


1
এটি মূলত আমার বোধ হয়। প্রায় একই ধরণের পরীক্ষার কোডটি অনেক ক্ষেত্রে ঠিক আছে, তবে একই পরীক্ষার কোডটি পুনরাবৃত্তি করা খারাপ খবর।
joshin4colours

12

পুনরাবৃত্তি হ'ল সমস্ত অশুভের মূল

সেটা ঠিক! পুনরাবৃত্তি হ'ল সমস্ত অশুভের মূল । সম্ভবত এটি নুথ তাঁর বইতে "অকালীন অপ্টিমাইজেশান হ'ল সমস্ত মন্দের মূল" বলেছিলেন, তবে আমি মনে করি এটি পুনরাবৃত্তি।

আপনি যখনই কোনও প্রোগ্রামের দিকে তাকান বা আপনি একটি লিখছেন এবং আপনি কোনও ধরণের পুনরাবৃত্তি আবিষ্কার করেন: এটি সরান! তাত্ক্ষণিকভাবে হত্যা করুন ... যাই হোক না কেন এটি থেকে মুক্তি পান !

প্রতিবারই যখন আমি কোনও ধরণের পুনরাবৃত্তি প্রবর্তন করেছি এবং সেখানে একটি বাগ ফিক্স করতে হয়েছিলাম, আমি প্রতিলিপিটি ঠিক করতে ভুলে গিয়েছিলাম ... (ডোনাল্ড নুথ) সুতরাং, যখনই কোনও পুনরাবৃত্তি আসে কেবল আপনি যথাসাধ্য এটি সরিয়ে ফেলুন, হ্যাক করবেন না !

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

কোড হরর থেকে আমাকে অনুপ্রাণিত করে এমন একটি ভাল পড়া এখানে দেওয়া হয়েছে - কপি এবং পেস্ট স্কুল অফ কোড পুনরায় ব্যবহারের জন্য একটি পরিমিত প্রস্তাব


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

হ্যাঁ, আমি নথের কাছ থেকে স্টেশনগুলি নিয়েছিলাম :)
ইউসুবভ

9
আপনি নিজেকে পুনরাবৃত্তি করেছেন: আপনি শিরোনাম এবং আপনার পরিচিতি বাক্যটিতে "পুনরাবৃত্তি সমস্ত মন্দের মূল" বলে নিজেকে পুনরাবৃত্তি করেছিলেন।
থমাস এডিং

ইয়াপ, আমি গুরুত্ব
সহকারে

1
টমাস এডিং, আপনি নিজেও পুনরাবৃত্তি করেছিলেন। আপনি নিজেও পুনরাবৃত্তি করেছেন =)
মার্কতানি

7

এটি কেটে পেস্ট করা এখনও বেশ খারাপ। কয়েকটি সমস্যা আছে।

আপনার পরীক্ষাগুলি ভঙ্গুর হতে পারে, কারণ আপনি এমন কোনও কিছুর প্রতি ঝুঁকির মধ্যে পড়েছেন যার জন্য সমস্ত অনুলিপি-অনুলিপি কোডের পরিবর্তন দরকার। আপনার কি সমস্ত পরীক্ষা আবার লিখতে হবে?

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

এটি পরীক্ষাগুলি কম পাঠযোগ্য করে তুলতে পারে। বর্ণনামূলক নাম সহ সহায়ক পদ্ধতিতে কল করার চেয়ে অনুলিপি করা কোডের একটি বড় ব্লক পড়া আরও কঠিন।

আমি তালিকাভুক্ত সমস্ত কিছুই সমস্যা হতে পারে। আপনি তাদের কেউ যদি জানতে আসলে হয় অবশ্যই এটা এর জরিমানা তারপর একটি সমস্যা।


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

4

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

জিইউআই পরীক্ষার জন্য, বারবার কোড হ্রাস করতে আপনি পেজওবজেক্ট প্যাটার্নটি দেখতে চাইতে পারেন ।


2

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

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


Object Mother patternসাধারণ সূচনা কোডের জন্য +1 ।
বি

2

লোকেরা যখন চেষ্টা করতে পারে এবং খ্যাতি সীমাবদ্ধ করতে পারে - হ্যাঁ। পেওফটি পরিস্থিতির উপর নির্ভর করে। এটি 'সেরা অনুশীলন' বিতর্কে ফিরে যেতে পারে। তবে প্রশ্নটি এই পরিস্থিতিতে আপনার পক্ষে সবচেয়ে ভাল best প্রতিটি নিয়মের ব্যতিক্রম আছে।

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

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


0

একটি বড় পদ্ধতি

একটি ধারণা: মনে হচ্ছে আপনি এই জাতীয় পদ্ধতি তৈরি করে কাট-এন-পেস্ট কোড এড়াতে চেষ্টা করছেন:

testScreen(title, fieldList, linkList, param1, param2, param3,...) {
    test that the layout at the top of the screen is correct
    test if PageTitle == title?
    for each field in fieldList:
        check that it appears in order on the screen
    for each field in linkList:
        check that it appears in order on the screen
    test if param1 is whatever...
    test if param2 is whatever...
    etc.
    test that the bottom of the screen is correct
}

অনেক ছোট প্রক্রিয়া (টুলকিট)

আপনি কি বিপরীত পদ্ধতির বিবেচনা করেছেন? একটি বড় টেস্টস্ক্রিন () পদ্ধতিতে মিলিয়ন প্যারামিটারগুলি পাস করার পরিবর্তে, আপনার নিজের ফ্রেমওয়ার্ক বা সামান্য সহায়ক সহায়ক পদ্ধতির সরঞ্জাম-কিট তৈরি করুন যা আপনার প্রয়োজন হিসাবে চাবুক থেকে বের করে দিন। ভালো লেগেছে:

testScreenTop()
verifyLinks(list)
testScreenBottom()

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

কেটে পেস্ট করুন

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

অটোমেটেড ইউআই টেস্টিং

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


0

এটি আসলে খুব খারাপ নয়। আসলে, যদি আপনি দেখতে পান যে নির্দিষ্ট কোডের নিদর্শনগুলি খুব ঘন ঘন ব্যবহৃত হয় এবং পরিবর্তনগুলি খুব রুটিন হয় (যেমন কয়েকটি স্ট্রিং বা প্যারামিটার মান) তবে আপনি এমন একটি কোড জেনারেটরও লিখতে পারেন যা একটি ছোট (- ish?) মানগুলির ইনপুট তালিকা যা পরিবর্তিত হয়। আমি ব্যাচ ফাইল, এসকিউএলপ্লাস স্ক্রিপ্টস এমনকি এক্সেল ম্যাক্রোগুলি ব্যবহার করে এটি (উত্পন্ন টেস্ট কোড) অনেকবার করেছি (এটি কুৎসিত মনে হয়, তবে বিভিন্ন পরীক্ষার স্ক্রিপ্টগুলির ভেরিয়েবলগুলি ইতিমধ্যে একটি স্প্রেডশিটে ছিল) এবং এটি একটি দুর্দান্ত সময় সেভার হতে পারে । জিনিসটি হ'ল পুনরাবৃত্তিমূলক পরীক্ষার কেস কোডের সামগ্রিক কাঠামোতে যদি কিছু পরিবর্তন হয় তবে আপনি যা প্রয়োজন কেবল ঠিক তা পুনরায় তৈরি করতে পারেন।


0

এটি অন্যান্য উত্তরগুলির মতো একই তবে একটি প্রযুক্তিগত ব্যবস্থাপক বুঝতে পারে এমনভাবে।

নিম্নলিখিত ত্রুটি দৃশ্যের কল্পনা করুন:

  • আপনার পরীক্ষার অনেকের উপর নির্ভর করে যেখানে কেউ ডাটাবেস টেবিলে পরিবর্তন করে।
  • ফলাফল: হঠাৎ আপনার 2933 টির মধ্যে 117 স্বয়ংক্রিয় পরীক্ষাগুলি ব্যর্থ হয়েছে।

তুমি কি করবে?

  • (1) 117 টি পরীক্ষা ঠিক করবেন?
  • (২) ১১7 টি পরীক্ষা মুছুন এবং তাদের নতুন অনুলিপি এবং পেস্টের মাধ্যমে পুনরায় প্রয়োগ করুন। এটি (1) এর চেয়ে সহজ হতে পারে
  • (3) সাধারণ কোডটি বের করার জন্য পরীক্ষাগুলি রিফ্যাক্টর যাতে ভবিষ্যতে আপনাকে পরীক্ষাগুলি ঠিক করার জন্য কেবল একটি পদ্ধতি (বা কয়েকটি) মানিয়ে নিতে হয় (@ পিডিআর বা @ মিশেল ব্রাউন এর উত্তর দেখুন)
  • (4) পরীক্ষাগুলি পুনরায় প্রয়োগ না করে 117 টি পরীক্ষা মুছুন

আমার অভিজ্ঞতা থেকে:

স্বয়ংক্রিয় পরীক্ষাগুলি প্রবর্তন করার সময় "অনুলিপি এবং পেস্ট-পরীক্ষা" পছন্দ করে: আপনি অল্প সময়ের মধ্যে অনেকগুলি পরীক্ষা পান।

কিছু "ত্রুটির পরিস্থিতি" পরিচালনা পরে পছন্দ করে (4) কারণ "অনুলিপি এবং পেস্ট-পরীক্ষা" ঠিক করা এত ব্যয়বহুল।

এটি প্রথম স্থানে করুন (3) এত দ্রুত হবে না তবে পরীক্ষা বাঁচার সম্ভাবনা বাড়ে

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