গো ভাষার সাথে পরীক্ষার জন্য সঠিক প্যাকেজ নামকরণ


104

আমি গো এর মধ্যে বেশ কয়েকটি পৃথক পরীক্ষার প্যাকেজ নামকরণের কৌশল দেখেছি এবং প্রত্যেকের কি কি ভাল এবং কোনটি আমার ব্যবহার করা উচিত তা জানতে চেয়েছিলাম।

কৌশল 1:

ফাইলের নাম: github.com/user/myfunc.go

package myfunc

পরীক্ষার ফাইলের নাম: github.com/user/myfunc_test.go

package myfunc

উদাহরণের জন্য bzip2 দেখুন ।

কৌশল 2:

ফাইলের নাম: github.com/user/myfunc.go

package myfunc

পরীক্ষার ফাইলের নাম: github.com/user/myfunc_test.go

package myfunc_test

import (
    "github.com/user/myfunc"
)

উদাহরণস্বরূপ তারে দেখুন ।

কৌশল 3:

ফাইলের নাম: github.com/user/myfunc.go

package myfunc

পরীক্ষার ফাইলের নাম: github.com/user/myfunc_test.go

package myfunc_test

import (
    . "myfunc"
)

উদাহরণস্বরূপ স্ট্রিংগুলি দেখুন ।

গো স্ট্যান্ডার্ড লাইব্রেরিতে কৌশল 1 এবং 2 এর মিশ্রণটি ব্যবহার করা হয়েছে বলে মনে হচ্ছে আমার তিনটির মধ্যে কোনটি ব্যবহার করা উচিত? এটি package *_testআমার টেস্টিং প্যাকেজগুলিতে সংযুক্ত হওয়া একটি ব্যথা কারণ এর অর্থ আমি আমার প্যাকেজটির ব্যক্তিগত পদ্ধতিগুলি পরীক্ষা করতে পারছি না তবে এমন কোনও গোপন সুবিধা রয়েছে যা সম্পর্কে আমি অবগত নই?


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

4
কৌশল [2 ] এর [তার] ( github.com/btcsuite/btcd/blob/master/wire/msgtx_test.go ) উদাহরণটি এখন কৌশল 1
এরও

উত্তর:


137

আপনি তালিকাভুক্ত তিনটি কৌশলের মধ্যে মৌলিক পার্থক্য হ'ল পরীক্ষার কোডটি পরীক্ষার অধীনে থাকা কোডের মতোই প্যাকেজে রয়েছে কিনা। পরীক্ষার ফাইলটি ব্যবহার করার package myfuncবা সিদ্ধান্ত নেওয়ার সিদ্ধান্ত আপনি হোয়াইট-বক্সে বা ব্ল্যাক-বাক্স পরীক্ষা package myfunc_testকরতে চান কিনা তার উপর নির্ভর করে ।

একটি প্রকল্পে উভয় পদ্ধতি ব্যবহার করে ভুল নেই। উদাহরণস্বরূপ, আপনি থাকতে পারে myfunc_whitebox_test.goএবং myfunx_blackbox_test.go

পরীক্ষার কোড প্যাকেজ তুলনা

  • ব্ল্যাক-বাক্স পরীক্ষা: ব্যবহার করুন package myfunc_test, এটি নিশ্চিত করবে যে আপনি কেবল রফতানি শনাক্তকারী ব্যবহার করছেন ।
  • হোয়াইট-বক্স টেস্টিং: এমন ব্যবহার করুন package myfuncযাতে আপনার অ-রফতানি শনাক্তকারীদের অ্যাক্সেস থাকে। ইউনিট পরীক্ষার জন্য ভাল যা অ-রফতানি ভেরিয়েবল, ফাংশন এবং পদ্ধতিগুলির অ্যাক্সেসের প্রয়োজন।

প্রশ্নের তালিকাভুক্ত কৌশলগুলির তুলনা

  • কৌশল 1: ফাইলটি myfunc_test.goব্যবহার করে package myfunc- এক্ষেত্রে পরীক্ষার কোডটি পরীক্ষা করা কোডের myfunc_test.goমতোই প্যাকেজে থাকবে myfunc.goযা myfuncএই উদাহরণে।
  • কৌশল 2: ফাইলটি myfunc_test.goব্যবহার করে package myfunc_test- এক্ষেত্রে myfunc_test.go" পরীক্ষার কোডটি একটি পৃথক প্যাকেজ হিসাবে সংকলিত হবে, এবং তারপরে সংযুক্ত হয়ে মূল পরীক্ষার বাইনারি দিয়ে চালানো হবে।" [উত্স: টেস্ট.গো সোর্স কোডে লাইনগুলি 58–59 ]
  • স্ট্র্যাটেজি 3: ফাইল myfunc_test.goব্যবহার package myfunc_testকিন্তু আমদানির myfuncডট স্বরলিপি ব্যবহার - এই স্ট্র্যাটেজি 2 একটি বৈচিত্র হয় তবে আমদানি করতে ডট স্বরলিপি ব্যবহার myfunc

4
এটি লক্ষ করা উচিত যে কৌশল 1 ব্যবহার করার _test.goফলে প্যাকেজটি পরীক্ষা করা (স্ট্র্যাটেজি 2 এর মতো আচরণ) এর চেয়ে পৃথক পৃথক ফাইলও থাকবে । এটি github.com/golang/go/issues/15315
কেভিন দ্বীনানাথ

আমি স্ট্র্যাটেজি 3 এর শক্তিশালী প্যাকেজ ব্যবহার দেখেছি, তবে আমি বুঝতে পারছি না কী?
পিকবয়

4
আমি একটি প্যাকেজ কাঁটাচামচ করেছি এবং পরিবর্তন করেছি এবং এখন আমার পরীক্ষাগুলি সমস্তই আমার কাঁটাযুক্ত প্যাকেজের পরিবর্তে মূল রেপো আমদানির চেষ্টা করছে। কৌশল 3 এর সাথে, আমাকে "github.com/original/link" কে "github.com/my/fork" এ পরিবর্তন করতে হবে না, কারণ এটি কেবল 'রেফারেন্সিং' '' পরিবর্তে.
নামারলে

4
এই টুইটটি আমাকে অবাক করে দিয়েছে আমি ভেবেছিলাম যখন আমি কেবলমাত্র _test.goএকটি নন- _testপ্যাকেজ নামযুক্ত একটি পেয়েছি func init()যা পরীক্ষার জন্য কিছু গ্লোবাল প্যাকেজ ভেরিয়েবল পরিবর্তন করে। আমি ভৃল ছিলাম.
জিল

4
@nmarley দি .আপনার কাঁটাচামার সমস্যাটি সমাধান করে না। এটি কোনও আপেক্ষিক আমদানি নয়। এটি সনাক্তকারীদের "বর্তমান প্যাকেজের মধ্যে" আমদানি করে।
qaisjp

19

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

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


13

যখনই সম্ভব আপনার কৌশল 1 ব্যবহার করা উচিত। foo_testআমদানি চক্র এড়ানোর জন্য আপনি বিশেষ প্যাকেজ নামটি ব্যবহার করতে পারেন তবে বেশিরভাগ ক্ষেত্রেই তাই একই পদ্ধতি ব্যবহার করে স্ট্যান্ডার্ড লাইব্রেরিটি পরীক্ষা করা যায়। উদাহরণস্বরূপ, প্যাকেজ উপর নির্ভর করে stringsকৌশল 1 এর সাথে পরীক্ষা করা যায় না । যেমনটি আপনি বলেছেন, কৌশল 2 বা 3 এর সাথে আপনার প্যাকেজের ব্যক্তিগত শনাক্তকারীদের অ্যাক্সেস নেই, তাই আপনার প্রয়োজন না হলে এটি ব্যবহার না করা সাধারণত ভাল।testingstrings


12
পরীক্ষাগুলিতে ব্যক্তিগত সনাক্তকারীদের অ্যাক্সেস না থাকা কীভাবে পুণ্য নয়?
jub0bs

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

0

আমি গোলং কোডের পর্যালোচনা মন্তব্যগুলিimport . থেকে একটি গুরুত্বপূর্ণ নোট যুক্ত করতে চাই :

import .ফর্ম পরীক্ষার যে কারণে এ উপযোগী হতে পারে বৃত্তাকার নির্ভরতা, প্যাকেজের অংশ পরীক্ষা করা হচ্ছে তৈরি করা যাবে না:

package foo_test

import (
    "bar/testutil" // also imports "foo"
    . "foo"
)

এই ক্ষেত্রে, পরীক্ষা ফাইলটি প্যাকেজ ফুতে থাকতে পারে না কারণ এটি ব্যবহার করে bar/testutil, যা ফু আমদানি করে। সুতরাং আমরা 'আমদানি' ব্যবহার করি। ফাইলটি প্যাকেজ ফু-র অংশ হওয়ার ভান করতে দেয় যদিও তা না হলেও।

এই একটি কেস বাদে ব্যবহার করবেন না import . আপনার প্রোগ্রামগুলিতে । এটি প্রোগ্রামগুলি পড়ার পক্ষে আরও শক্ত করে তোলে কারণ এটি বর্তমানে অস্পষ্ট নয় যে কুইক্সের মতো কোনও নাম বর্তমান প্যাকেজে বা আমদানিকৃত প্যাকেজে শীর্ষ স্তরের সনাক্তকারী কিনা।

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