পাথ কভারেজটি সমস্ত বাগ সন্ধানের নিশ্চয়তা দেয়?


64

যদি কোনও প্রোগ্রামের প্রতিটি পথ পরীক্ষা করা হয়, তা কি সমস্ত বাগ খুঁজে পাওয়ার নিশ্চয়তা দেয়?

তা না হলে কেন? আপনি কীভাবে প্রোগ্রামের প্রবাহের প্রতিটি সম্ভাব্য সংমিশ্রণটি পেরিয়ে যেতে পারেন এবং যদি উপস্থিত থাকে তবে সমস্যাটি খুঁজে পাবেন না?

আমি "সমস্ত বাগগুলি" সন্ধান করতে পরামর্শ দিতে দ্বিধাবোধ করি, তবে এটি সম্ভবত কারণ পথ কভারেজটি ব্যবহারিক নয় (যেমন এটি সংযুক্তিযুক্ত) তাই এটি কখনও অভিজ্ঞতা হয় নি?

দ্রষ্টব্য: এই নিবন্ধটি কভারেজের ধরণের একটি দ্রুত সংক্ষিপ্তসার দেয় যা আমি তাদের সম্পর্কে ভাবি।


33
এটি থামানো সমস্যার সমতুল্য ।

31
কোড যদি সেখানে থাকা উচিত ছিল, তাই না?
রিমকো গ্রিলিচ

6
@ সোনমান: না, তা নয়। সমস্ত প্রোগ্রামের জন্য থামার সমস্যাটি সমাধান করা সম্ভব নয় তবে অনেকগুলি নির্দিষ্ট প্রোগ্রামের জন্য এটি সমাধানযোগ্য। এই প্রোগ্রামগুলির জন্য, সমস্ত কোড পাথ একটি সীমাবদ্ধ (যদিও সম্ভবত দীর্ঘ) পরিমাণে গণনা করা যেতে পারে।
জর্জেন ফোগ

3
@ জারজেনফোগ কিন্তু কোনও প্রোগ্রামে বাগ খুঁজে পাওয়ার চেষ্টা করার পরে , প্রোগ্রামটি থেমে আছে কি না তা কোনও পূর্বই অজানা নয়? "পাথ কভারেজের মাধ্যমে কোনও প্রোগ্রামে সমস্ত বাগ খুঁজে পাওয়া" এর সাধারণ পদ্ধতি সম্পর্কে এই প্রশ্নটি নয় ? কোন ক্ষেত্রে এটি "কোনও প্রোগ্রাম থামছে কিনা" তা সাদৃশ্যপূর্ণ নয়?
আন্দ্রেস এফ

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

উত্তর:


128

যদি কোনও প্রোগ্রামের প্রতিটি পথ পরীক্ষা করা হয়, তা কি সমস্ত বাগ খুঁজে পাওয়ার নিশ্চয়তা দেয়?

না

তা না হলে কেন? আপনি কীভাবে প্রোগ্রামের প্রবাহের প্রতিটি সম্ভাব্য সংমিশ্রণটি পেরিয়ে যেতে পারেন এবং যদি উপস্থিত থাকে তবে সমস্যাটি খুঁজে পাবেন না?

কারণ আপনি সমস্ত সম্ভাব্য পাথ পরীক্ষা করলেও, আপনি এখনও তাদের সমস্ত সম্ভাব্য মান বা মানগুলির সম্ভাব্য সংমিশ্রণগুলির সাথে পরীক্ষা করেন নি । উদাহরণস্বরূপ (সিউডোকোড):

def Add(x as Int32, y as Int32) as Int32:
   return x + y

Test.Assert(Add(2, 2) == 4) //100% test coverage
Add(MAXINT, 5) //Throws an exception, despite 100% test coverage

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

- ইডাব্লু ডিজকস্ট্রা (জোর দিয়েছিলেন। ১৯৮৮ সালে রচিত। এটি এখন প্রায় ২ দশকেরও বেশি সময় হয়ে গেছে।)


7
@ ডিজিটগোফার: আমি মনে করি, তবে যদি কোনও প্রোগ্রামের কোনও ইনপুট না থাকে তবে এটি কোন দরকারী জিনিসটি করে?
ম্যাসন হুইলার

34
ইন্টিগ্রেশন টেস্ট, পরীক্ষাগুলিতে বাগ, নির্ভরতার মধ্যে বাগ, বিল্ড / ডিপ্লোয়মেন্ট সিস্টেমের বাগগুলি বা মূল স্পেসিফিকেশন / প্রয়োজনীয়তাতে বাগগুলি হারিয়ে যাওয়ার সম্ভাবনাও রয়েছে। আপনি কখনই সমস্ত বাগ সন্ধানের নিশ্চয়তা দিতে পারবেন না ।
Ixrec

11
@ ইক্সেরেক: এসকিউএলাইট যদিও দুর্দান্ত সাহসী প্রচেষ্টা করে! তবে দেখুন এটি কি এক বিশাল প্রচেষ্টা! এটি বড় কোডবেসে ভাল স্কেল করতে পারে না।
ম্যাসন হুইলার

13
কেবলমাত্র আপনি সমস্ত সম্ভাব্য মান বা এর সমন্বয়গুলিই পরীক্ষা করেননি, আপনি সমস্ত আপেক্ষিক সময় পরীক্ষা করেননি, যার মধ্যে কয়েকটি জাতি পরিস্থিতি প্রকাশ করতে পারে বা সত্যই আপনার পরীক্ষাটিকে একটি অচলাবস্থায় প্রবেশ করতে পারে, যার ফলে এটি কোনও কিছু জানাতে ব্যর্থ হয় । এমনকি এটি ব্যর্থ হবে না!
আইওলনোটেক্সিস্ট আইডোনোটেক্সিস্ট

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

71

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

100% পাথ কভারেজ সহ আপনার একটি টেস্টসাইট রয়েছে তা কল্পনা করুন। এখন সমস্ত দাবিগুলি অপসারণ করুন এবং আবার টেস্টসুটি চালান। কিন্তু, পরীক্ষারটিতে এখনও 100% পাথ কভারেজ রয়েছে, তবে এটি একেবারে কিছুই পরীক্ষা করে না।


2
এটি নিশ্চিত করতে পারে যে পরীক্ষিত কোডটি কল করার সময় কোনও ব্যতিক্রম নেই (পরীক্ষার প্যারামিটারগুলির সাথে)। এটি কিছুই চেয়ে কিছুটা বেশি।
পাওলো ইবারম্যান

7
@ PaŭloEbermann সম্মত, কিছুই চেয়ে কিছুটা বেশি। যাইহোক, এটি "সমস্ত বাগ সন্ধান করা" এর চেয়ে মারাত্মকভাবে কম;)
আন্দ্রে এফ

1
@ পাওলোএবারম্যান: ব্যতিক্রম একটি কোড পাথ। যদি কোডটি নিক্ষেপ করতে পারে তবে নির্দিষ্ট পরীক্ষার ডেটা ছুঁড়ে না ফেলে তবে পরীক্ষাটি 100% পাথ কভারেজ অর্জন করে না। এটি ত্রুটি-পরিচালনা পদ্ধতি হিসাবে ব্যতিক্রমগুলির জন্য নির্দিষ্ট নয়। ভিজ্যুয়াল বেসিকগুলিও সিটির মতো ON ERROR GOTOএকটি পথ if(errno)
এমসাল্টারস

1
@ এসএমএলটারগুলি আমি কোডের বিষয়ে কথা বলছি যা ইনপুট নির্বিশেষে (স্পেসিফিকেশন দ্বারা) কোনও ব্যতিক্রম ছোঁড়া উচিত নয়। যদি এটি কোনও নিক্ষেপ করে তবে এটি একটি বাগ হবে। অবশ্যই, যদি আপনার কাছে এমন কোনও কোড থাকে যা একটি ব্যতিক্রম ছোঁড়ার জন্য নির্দিষ্ট করা থাকে, তবে এটি পরীক্ষা করা উচিত। (এবং অবশ্যই, জার্গ যেমন বলেছিলেন যে, কোডটি কোনও ব্যতিক্রম ছোঁড়ে না তা যাচাই করা সাধারণত এটি সঠিকভাবে কাজ করে তা নিশ্চিত করার জন্য পর্যাপ্ত নয় এমনকি এমনকি নিক্ষেপকারী কোডেরও নয়)) এবং কিছু ব্যতিক্রম কোনও নন দ্বারা নিক্ষেপ করা যেতে পারে শূন্য দ্বারা নাল পয়েন্টার ডিરેফারেন্স বা বিভাগের মতো-দৃশ্যমান কোড পাথ। আপনার পাথ কভারেজ সরঞ্জাম কি সেগুলি ধরে?
পাওলো ইবারম্যান 11 '20

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

34

জিনিসগুলি বন্ধ করে দেওয়ার জন্য এখানে একটি সহজ উদাহরণ। নিম্নলিখিত বাছাই করা অ্যালগরিদম (জাভাতে) বিবেচনা করুন:

int[] sort(int[] x) { return new int[] { x[0] }; }

এখন, পরীক্ষা করা যাক:

sort(new int[] { 0xCAFEBABE });

এখন, বিবেচনা করুন যে (এ) sortসঠিক ফলাফলটি ফেরানোর জন্য এই বিশেষ কলটি , (খ) সমস্ত কোড পাথ এই পরীক্ষার আওতায় এসেছে।

তবে, স্পষ্টতই, প্রোগ্রামটি আসলে বাছাই করে না।

এটি অনুসরণ করে যে প্রোগ্রামের কোনও বাগ নেই তার গ্যারান্টি দেওয়ার জন্য সমস্ত কোড পাথের কভারেজ যথেষ্ট নয়।


12

absফাংশনটি বিবেচনা করুন , এটি একটি সংখ্যার পরম মান প্রদান করে। এখানে একটি পরীক্ষা (পাইথন, কিছু পরীক্ষার কাঠামোর কল্পনা করুন):

def test_abs_of_neg_number_returns_positive():
    assert abs(-3) == 3

এই বাস্তবায়নটি সঠিক, তবে এটি কেবল 60% কোড কভারেজ পায়:

def abs(x):
    if x < 0:
        return -x
    else:
        return x

এই বাস্তবায়নটি ভুল, তবে এটি 100% কোড কভারেজ পায়:

def abs(x):
    return -x

2
এখানে আরও একটি বাস্তবায়ন যা পরীক্ষায় উত্তীর্ণ হয়েছে (দয়া করে অ-লাইনব্রোকেন পাইথনকে ক্ষমা করুন): def abs(x): if x == -3: return 3 else: return 0আপনি সম্ভবত else: return 0অংশটি সবিস্তৃত করতে এবং 100% কভারেজ পেতে পারেন, তবে ইউনিট পরীক্ষায় পাস করলেও ফাংশনটি মূলত অকেজো হবে।
একটি সিভিএন

7

ম্যাসনের উত্তরের আরও একটি সংযোজন , একটি প্রোগ্রামের আচরণ রানটাইম পরিবেশের উপর নির্ভর করে।

নিম্নলিখিত কোডটিতে একটি মুক্ত-পরে ব্যবহার রয়েছে:

int main(void)
{
    int* a = malloc(sizeof(a));
    int* b = a;
    *a = 0;
    free(a);
    *b = 12; /* UAF */
    return 0;
}

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

অন্য নোটে, এমনকি যদি পথের কভারেজটি সমস্ত বাগ সন্ধানের নিশ্চয়তা দেয় তবে কোনও প্রোগ্রামেই বাস্তবে এটি অর্জন করা সম্ভব নয়। নিম্নলিখিতটি বিবেচনা করুন:

int main(int a, int b)
{
    if (a != b) {
        if (cryptohash(a) == cryptohash(b)) {
            return ERROR;
        }
    }
    return 0;
} 

আপনার টেস্ট-স্যুট যদি এর জন্য সমস্ত পাথ তৈরি করতে পারে তবে অভিনন্দন আপনি একজন ক্রিপ্টোগ্রাফার।


পর্যাপ্ত ছোট পূর্ণসংখ্যার জন্য সহজ :)
কোডসইনচাউস 30:15

এ সম্পর্কে কিছু না জেনে cryptohash, "যথেষ্ট ছোট" কী তা বলা সামান্য কঠিন hard সুপার ক্যালকুলেটরটি শেষ হতে দুই দিন সময় লাগে days তবে হ্যাঁ, intকিছুটা হতে পারে short
dureuill

32 বিট ইন্টিজার এবং টিপিক্যাল ক্রিপ্টোগ্রাফিক হ্যাশগুলির সাথে (এসএএএ 2, এসএএএ 3, ইত্যাদি) কম্পিউটিং এটি বেশ সস্তা হওয়া উচিত। কয়েক সেকেন্ড বা তাই।
কোডসইনচাওস

7

এটি অন্যান্য জবাব থেকে পরিষ্কার যে পরীক্ষায় 100% কোড কভারেজের অর্থ 100% কোডের সঠিকতা নয়, বা এমনকি যে সমস্ত বাগগুলি পরীক্ষার মাধ্যমে পাওয়া যেতে পারে তা পাওয়া যাবে (কোনও পরীক্ষায় ধরা পড়তে পারে এমন বাগগুলি মনে করবেন না)।

এই প্রশ্নের উত্তর দেওয়ার আরেকটি উপায় অনুশীলন থেকে একটি:

বাস্তব জগতে এবং প্রকৃতপক্ষে আপনার নিজের কম্পিউটারে রয়েছে এমন অনেকগুলি সফটওয়্যার যা টেস্টের একটি সেট ব্যবহার করে বিকাশ করা হয় যা 100% কভারেজ দেয় এবং যার মধ্যে এখনও বাগ রয়েছে, যাতে আরও ভাল পরীক্ষাগুলি সনাক্ত করতে পারে including

একটি এনটাইটেল করা প্রশ্ন তাই,

কোড কভারেজ সরঞ্জামগুলির বিন্দুটি কী?

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

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

এবং অবশ্যই বানান-চেকটি ব্যবহার করার ভুল উপায়টি প্রতিটি পরামর্শের সমুদ্রের সমুদ্রের সাথে যেতে পরামর্শ দেয় যাতে হাঁসের জিনিসটি আরও খারাপ হয়ে যায় তবে ইইউ যদি leftণ রেখে দেয় তবে।

কোড কভারেজ সহ এটি লোভনীয় হতে পারে, বিশেষত যদি আপনি 98% এর কাছাকাছি থাকেন তবে কেস পূরণ করতে যাতে বাকী পথগুলি আঘাত হান।

এটি বানান-চেক সেলাইয়ের অধিকারের সমতুল্য যে এটি সমস্ত শব্দ আবহাওয়া বা গিঁটযুক্ত সমস্ত উপযুক্ত শব্দ। ফলাফল একটি হাঁসের জগাখিচুড়ি।

তবে, আপনি যদি অ-আচ্ছাদিত পাথগুলিতে সত্যিকারের প্রয়োজনের পরীক্ষাগুলি বিবেচনা করে থাকেন তবে কোড-কভারেজ সরঞ্জামটি তার কাজটি সম্পাদন করবে; আপনাকে শুদ্ধ করার প্রতিশ্রুতি দিয়ে নয়, তবে এটি করা দরকার এমন কিছু কাজকে নির্দেশ করে ।


+1 আমি এই উত্তরটি পছন্দ করি কারণ এটি গঠনমূলক এবং কভারেজের কিছু সুবিধার উল্লেখ করে।
আন্দ্রেস এফ।

4

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


1
আমি মনে করি এটি একটি বাগের সংজ্ঞা উপর নির্ভর করে। আমি মনে করি নিখোঁজ বৈশিষ্ট্য বা কার্যকারিতাটিকে বাগ হিসাবে বিবেচনা করা উচিত।
eis

@ আইস - আপনি এমন কোনও পণ্যের সাথে সমস্যা দেখতে পাচ্ছেন না যার ডকুমেন্টেশন বলে যে এটি এক্স করে যখন বাস্তবে তা না ঘটে? এটি "বাগ" এর একটি বরং সংকীর্ণ সংজ্ঞা। আমি যখন বোরল্যান্ডের সি ++ প্রোডাক্ট লাইনের জন্য কিউএ পরিচালনা করি তখন আমরা তেমন উদার ছিলাম না।
পিট বেকার

আমি দেখতে পাচ্ছি না যে ডকুমেন্টেশনগুলি কেন এটি X ব্যবহার করে তা যদি কখনও প্রয়োগ করা না হয়
eis

@ ইয়েস - যদি ফিচার এক্স এর জন্য ডকুমেন্টিকেশনটি ডকুমেন্টেশনগুলি ফিচার এক্স বর্ণনা করে শেষ করতে পারে। যদি কেউ এটি প্রয়োগ না করে তবে এটি একটি বাগ, এবং পথের কভারেজ (বা অন্য কোনও ধরণের ব্ল্যাক বক্স টেস্টিং) খুঁজে পাবেন না।
পিট বেকার

ওহো, পাথ কভারেজ হ'ল সাদা বক্স টেস্টিং, ব্ল্যাক বক্স নয় । হোয়াইট বক্স টেস্টিং অনুপস্থিত বৈশিষ্ট্যগুলি ধরতে পারে না।
পিট বেকার

4

সমস্যার অংশটি হল যে 100% কভারেজটি কেবল গ্যারান্টি দেয় যে কোডটি একক মৃত্যুর পরে সঠিকভাবে কাজ করবে । মেমরি ফাঁসের মতো কিছু বাগগুলি একক কার্যকর হওয়ার পরে আপাত হতে পারে না বা সমস্যার কারণ হতে পারে না, তবে সময়ের সাথে সাথে অ্যাপ্লিকেশনটিতে সমস্যা দেখা দেয়।

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


সম্মত হয়েছে যে এটি ইস্যুটির অংশ, তবে আসল ইস্যু তার চেয়ে বেশি মৌলিক। এমনকি অসীম স্মৃতিবিহীন কোনও তাত্ত্বিক কম্পিউটার এবং কোনও সম্মতি না থাকলেও 100% পরীক্ষার কভারেজটি বাগের অনুপস্থিতিকে বোঝায় না। উত্তরের এই তুচ্ছ উদাহরণগুলি এখানে উত্তরের মধ্যে রয়েছে, তবে এখানে আরেকটি বিষয় রয়েছে: যদি আমার প্রোগ্রামটি হয় times_two(x) = x + 2তবে এটি পুরোপুরি পরীক্ষার স্যুট দ্বারা আবৃত হবে assert(times_two(2) == 4), তবে এটি এখনও স্পষ্টত বগি কোড! মেমরি ফাঁসের দরকার নেই :)
আন্দ্রেস এফ

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

ভাল যুক্তি. একমত।
আন্দ্রেস এফ

3

যদি কোনও প্রোগ্রামের প্রতিটি পথ পরীক্ষা করা হয়, তা কি সমস্ত বাগ খুঁজে পাওয়ার নিশ্চয়তা দেয়?

যেমনটি ইতিমধ্যে বলা হয়েছে, উত্তরটি নেই।

তা না হলে কেন?

যা বলা হচ্ছে তা ছাড়াও বিভিন্ন স্তরে বাগগুলি উপস্থিত রয়েছে যা ইউনিট পরীক্ষার মাধ্যমে পরীক্ষা করা যায় না। কেবল কয়েকটি উল্লেখ করার জন্য:

  • সংহতকরণ পরীক্ষাগুলি সহ বাগগুলি ধরা হয়েছে (ইউনিট পরীক্ষাগুলি সর্বোপরি প্রকৃত সংস্থানগুলি ব্যবহার করা উচিত নয়)
  • প্রয়োজনীয় বাগ
  • ডিজাইন এবং আর্কিটেকচারে বাগগুলি

2

প্রতিটি পথ পরীক্ষা করার অর্থ কী?

অন্যান্য উত্তরগুলি দুর্দান্ত, তবে আমি কেবল এটি যুক্ত করতে চাই যে "একটি প্রোগ্রামের প্রতিটি পথ পরীক্ষা করা" শর্তটি নিজেই অস্পষ্ট।

এই পদ্ধতিটি বিবেচনা করুন:

def add(num1, num2)
  foo = "bar"  # useless statement
  $global += 1 # side effect
  num1 + num2  # actual work
end

যদি আপনি দৃ add(1, 2) == 3a ়ভাবে একটি পরীক্ষা লিখেন তবে একটি কোড কভারেজ সরঞ্জাম আপনাকে বলবে যে প্রতিটি লাইনটি ব্যবহার করা হয়েছে। তবে আপনি বিশ্বব্যাপী পার্শ্ব প্রতিক্রিয়া বা অকেজো অ্যাসাইনমেন্ট সম্পর্কে আসলে কিছুই জোর করেননি। এই লাইনগুলি কার্যকর করা হয়েছে, তবে সত্যই পরীক্ষা করা হয়নি।

মিউটেশন টেস্টিং এ জাতীয় সমস্যাগুলি খুঁজতে সহায়তা করবে। কোনও মিউটেশন পরীক্ষার সরঞ্জামটিতে কোডটি "রূপান্তর" করার জন্য পূর্ব নির্ধারিত পদ্ধতির একটি তালিকা থাকবে এবং পরীক্ষাগুলি এখনও পাস হচ্ছে কিনা তা দেখতে। উদাহরণ স্বরূপ:

  • একটি রূপান্তর পরিবর্তন হতে +=পারে -=। এই পরিবর্তনটি কোনও পরীক্ষার ব্যর্থতার কারণ হবে না, সুতরাং এটি প্রমাণিত হবে যে আপনার পরীক্ষাটি বিশ্বব্যাপী পার্শ্ব প্রতিক্রিয়া সম্পর্কে অর্থবহ কোনও কিছু দেয় না।
  • অন্য রূপান্তর প্রথম পংক্তি মুছতে পারে। এই রূপান্তরটি পরীক্ষার ব্যর্থতার কারণ হবে না, সুতরাং এটি প্রমাণ করবে যে আপনার পরীক্ষাটি কার্যনির্বাহী সম্পর্কে কোনও অর্থবোধক পদক্ষেপ নিচ্ছে না।
  • এখনও অন্য রূপান্তর তৃতীয় লাইন মুছতে পারে। এটি কোনও পরীক্ষার ব্যর্থতার কারণ হতে পারে, যা এই ক্ষেত্রে দেখায় যে আপনার পরীক্ষা সেই লাইন সম্পর্কে কিছু জোর দেয়।

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

প্রতিটি পরীক্ষা যা আমরা করতে পারি তা হ'ল বাগ-মুক্ত প্রোগ্রামগুলির দিকে অগ্রসর হওয়া। কোন কিছুই ঠিক নাই.


0

আচ্ছা ... হ্যা আসলে, যদি প্রত্যেক পথ "মাধ্যমে" প্রোগ্রাম পরীক্ষা করা হয়। তবে তার মানে হল যে সমস্ত সম্ভাব্য রাজ্যের সমস্ত স্থানের মাধ্যমে সমস্ত সম্ভাব্য রাজ্যের প্রোগ্রামটি থাকতে পারে সমস্ত ভেরিয়েবল সহ have এমনকি খুব সাধারণ স্ট্যাটিক্যালি সংকলিত প্রোগ্রামের জন্য - বলুন, একটি পুরানো ফোর্টরান নম্বর ক্রাঙ্কার - এটি সম্ভব নয়, যদিও এটি কমপক্ষে কল্পনাযোগ্যও হতে পারে: যদি আপনার কেবল দুটি পূর্ণসংখ্যের ভেরিয়েবল থাকে তবে আপনি মূলত পয়েন্টগুলি সংযোগ করার সমস্ত সম্ভাব্য উপায় নিয়ে কাজ করছেন একটি দ্বিমাত্রিক গ্রিড; এটি দেখতে অনেকটা ট্র্যাভেলিং সেলসম্যানের মতো লাগে। জন্য এন যেমন ভেরিয়েবল, আপনি একটি সঙ্গে লেনদেন করছেন এন -dimensional স্থান, তাই কোনো বাস্তব প্রোগ্রামের জন্য, কাজের সম্পূর্ণরূপে untractable হয়।

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


বলেছিল ... আসলে বিষয়গুলি এতটা নির্লজ্জ নয়। এটা তোলে হয় করা সম্ভব প্রমান কর সঠিক হতে সমগ্র প্রোগ্রাম, কিন্তু আপনি একটি কয়েক ধারনা ছেড়ে দিতে হবে করতে হবে।

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

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

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

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


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

@ ম্যাথার রিড: আপনি যদি ফলস্বরূপ এটি প্রয়োগ করেন, তবে "ত্রুটি স্পেস" হ'ল সমস্ত রাজ্যের স্থানের যথোপযুক্ত উপস্থান। অবশ্যই এটি অনুমানমূলক কারণ এমনকি "সঠিক" রাষ্ট্রগুলি কোনও বিস্তৃত পরীক্ষার অনুমতি দেওয়ার জন্য অনেক বড় জায়গা তৈরি করে।
বাম দিকের বাইরে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.