ইউনিট পরীক্ষা লেখার কোনও মূল্য আছে যা অন্য পরীক্ষার একটি উপসেট?


15

কিছুটা স্বীকৃত উদাহরণ দেওয়ার জন্য, আমি বলি যে আমি পরীক্ষা করতে চাই যে একটি ফাংশন দুটি সংখ্যা দেয় এবং প্রথমটি দ্বিতীয়টির চেয়ে ছোট হয়:

def test_length():
    result = my_function()
    assert len(result) == 2

def test_order()
    a, b = my_function()
    assert a < b

এখানে, যদি test_lengthব্যর্থ হয়, তবে test_orderখুব ব্যর্থ হবে। এটি লেখার test_lengthপক্ষে বা এড়িয়ে যাওয়া কি সেরা অনুশীলন ?

সম্পাদনা: নোট করুন যে এই পরিস্থিতিতে, উভয় পরীক্ষা বেশিরভাগ একে অপরের থেকে স্বতন্ত্র, প্রত্যেককে বিচ্ছিন্নভাবে চালানো যেতে পারে, বা সেগুলি বিপরীতে চালানো যেতে পারে, এটি কোনও ব্যাপার নয় not সুতরাং এই সাবেক প্রশ্নগুলির কোনটিই নয়

উপরের একটির সদৃশ।



2
@ গ্লেনএইচ 7 - এটি অন্যরকম প্রশ্নের মতো মনে হচ্ছে। অন্যটি হ'ল "যদি আপনার ফাংশন থাকে যেখানে Aকলগুলি Bএকই ফলাফল দেয় Aএবং আপনার দুটি পরীক্ষা করা উচিত B"। এটি পরীক্ষার অধীনে ফাংশন (গুলি) না দিয়ে পরীক্ষাগুলি ওভারল্যাপিংয়ের বিষয়ে আরও রয়েছে । (যদিও এটি বর্তমানে নাম হিসাবে এটি বিভ্রান্তিকর)।
তেলস্তিন


1
কঠোরভাবে বলতে গেলে এই পরীক্ষাগুলি সত্যিই ওভারল্যাপিং হয় না (তাদের সাফল্যের নির্ভরতা নেই)। একটি ফাংশন lambda: type('', (), {'__len__': lambda self: 2})()প্রথম পাস করবে, তবে দ্বিতীয়টি নয়।
লাইওরি

1
@ গ্লেনএইচ 7: এফডাব্লুআইডাব্লু, আমি সত্যিই প্রশ্নটি পরিবর্তন করিনি, কেবল এটাকে জিনাত-নিরাপদ করার চেষ্টা করেছি ;-) (@ গন্যাট: কোনও অপরাধ নয়, কেবল রসিকতা করছি!)
ডক ব্রাউন

উত্তর:


28

মান হতে পারে, তবে এটি একটি গন্ধ কিছুটা। হয় আপনার পরীক্ষাগুলি ভালভাবে বিচ্ছিন্ন নয় (যেহেতু test_orderসত্যই দুটি জিনিস পরীক্ষা করে) বা আপনি নিজের পরীক্ষায় খুব দ্বিধাদ্বন্দ্বী হয়ে উঠছেন (একই যুক্তিযুক্ত বিষয়টির জন্য দুটি পরীক্ষা করা)।

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


আমি আপনার উত্তরটিকে উজ্জীবিত করেছি যদিও এটি একটি ছোটখাটো বিষয় মিস করে। পাইথনে, দ্বিতীয় পরীক্ষাটিও ব্যর্থ হবে যখন my_functionকোনও দৃ values়তা ছাড়াই ঠিক দুটি মান ফেরত দেয় না - কারণ অ্যাসাইনমেন্টটি ব্যতিক্রম ঘটবে। সুতরাং একই জিনিসটি পরীক্ষা করার জন্য একাধিক সংস্থান এবং দুটি চেক ব্যবহার করার দরকার নেই।
ডক ব্রাউন

@ ডকব্রাউন - আমি ততটুকু ধরে নিয়েছি তবে তথ্যগত কারণে র্যান্ডম ব্যতিক্রম / ত্রুটির পরিবর্তে দৃ failure় ব্যর্থতার কোনও মূল্য থাকতে পারে কিনা তা জানার জন্য আমি পাইথনের ত্রুটি বার্তাগুলির সাথে পরিচিত নই।
টেলাস্টিন

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

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

@ ক্রিসহেইস: আমি লিখেছিলাম "দরকার নেই", এতে "কোনও মূল্য নেই"।
ডক ব্রাউন

5

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

আমি জানি না যে এটি আপনি পোস্ট করেছেন পাইথনে এটি কীভাবে চলে, তবে যদি len(result)3 হয় তবে প্রথমটি ব্যর্থ হবে তবে দ্বিতীয়টি পাস হতে পারে (এবং যদি পাইথনে না হয়, তবে নিশ্চিতভাবে জাভাস্ক্রিপ্টের মতো ভাষায়)।

আপনি যেমন বলেছিলেন, আপনি পরীক্ষা করতে চান যে ফাংশনটি দুটি নম্বর দেয় এবং সেগুলি ক্রমযুক্ত। এটি দুটি পরীক্ষা।


1
It's not completely inferred that if text_length fails test_order fails- পাইথনে, এটি আপনাকে ব্যতিক্রম দেয় will
ডক ব্রাউন

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

2
@ ডেভিডওয়ালেস: মনে রাখবেন, প্রশ্নটি ছিল "টেস্ট_লেন্থ লেখার পক্ষে বা এড়িয়ে যাওয়া কি সেরা অনুশীলন"? জাভাস্ক্রিপ্টে, আপনি কোনও সমস্যা মিস করেছেন না তা নিশ্চিত করার জন্য আপনার উভয় পরীক্ষার প্রয়োজন (যখন আপনি দুটি পরীক্ষাকে একটিতে মার্জ করবেন না)। পাইথনে, আপনি নিরাপদে প্রথমটিকে বাদ দিতে পারেন (যা এই উত্তরের প্রথম বাক্যে অস্বীকার করা হয়েছে, এবং দ্বিতীয়টিতে "আমি নিশ্চিত নন" হিসাবে ঘোষণা করেছেন)। সত্যি বলতে, একটি ভাল উত্তর অন্যরকম দেখাচ্ছে। যাইহোক, আমি এই উত্তরটিকে কমিয়ে দেখিনি কারণ ভাল অংশটি আসলে জাভাস্ক্রিপ্টের উল্লেখ।
ডক ব্রাউন

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

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

2

এখানে একমাত্র মান test_lengthহ'ল, যদি সমস্ত কিছু পাস হয় তবে এর উপস্থিতি ইঙ্গিত দেয় যে "দৈর্ঘ্য" পরীক্ষা করা হয়েছে।

সুতরাং এই দুটি পরীক্ষা নেওয়া সত্যিই অপ্রয়োজনীয়। কেবল রাখুন test_orderতবে এর নামকরণের বিষয়টি বিবেচনা করুন test_length_and_order

ঘটনাচক্রে, আমি এমন নাম ব্যবহার করতে শুরু করি যা testকিছুটা আনাড়ি দিয়ে শুরু হয় । আমি পরীক্ষার নামগুলির একটি দৃ adv় সমর্থনকারী যা আসলে আপনি যে শর্তটি বলছেন তা বর্ণনা করে।


1
testআঁচিল পাইথন টেস্ট কাঠামো থেকে অর্থবহ। অবশ্যই আপনি এর ভক্ত কিনা তা পরিবর্তনের দরকার নেই, তবে এটির ব্যবহার কেউ বন্ধ করার জন্য প্রয়োজনীয় যুক্তির ওজন পরিবর্তন করে ;-)
স্টিভ জেসোপ

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

@ ডেভিডওয়ালেস: আপনি চাইলে উপসর্গটি পরিবর্তন করতে পারেন।
মিথ্যা রায়ান

1

আমি যদি এই পরীক্ষাগুলি এভাবেই বিবর্তিত হয়ে থাকি তবে আমি এই পরীক্ষাগুলি আলাদা করে রেখে দিতাম। হ্যাঁ test_orderযখনই করবে ব্যর্থ হওয়ার সম্ভাবনা রয়েছে test_lengthতবে আপনি অবশ্যই জানেন why

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

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

তবে নোট করুন এখন ফলাফলের জন্য আপনার কাছে পরীক্ষার ব্যাটারি রয়েছে my_function()। যদি এটির পরীক্ষার জন্য একাধিক প্রসঙ্গ (বা, সম্ভবত একাধিক পরামিতি) থাকে তবে এখন থেকে সমস্ত ফলাফল পরীক্ষা করার জন্য সাবরুটিন হতে পারে my_function()

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

তাই আমি সম্ভবত আপনার আলাদা পরীক্ষা শুরু করতে হবে এবং প্রসারিত হবে test_lengthথেকে test_length_and_typesছেড়ে test_orderআধুনিক অভিমানী পৃথক, "স্বাভাবিক প্রক্রিয়াকরণ" বলে মনে করা হয়।

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