गो भाषा के साथ परीक्षण के लिए उचित पैकेज का नामकरण


102

मैंने गो के भीतर कई अलग-अलग टेस्ट पैकेज नामकरण रणनीतियों को देखा है और जानना चाहता है कि प्रत्येक के पेशेवरों और विपक्ष क्या हैं और मुझे कौन सा उपयोग करना चाहिए।

रणनीति 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
यह प्रश्न केवल अलग-अलग राय देने वाला है, लेकिन मैं खदान में फेंक दूंगा। आपको अपने निजी तरीकों का परीक्षण करने की आवश्यकता नहीं है। आप अपने पैकेज के इंटरफ़ेस का परीक्षण करना चाहते हैं जो अन्य डेवलपर्स उपभोग करेंगे। यदि परीक्षण विफल हो जाते हैं तो आप जानते हैं कि आपके निजी तरीकों पर एक नज़र डालने की आवश्यकता है।
ब्रेंडेन

2
रणनीति 2 के लिए [वायर] ( github.com/btcsuite/btcd/blob/master/wire/msgtx_test.go ) उदाहरण, वास्तव में अब रणनीति 1 का भी उदाहरण है ...
durp

जवाबों:


130

आपके द्वारा सूचीबद्ध तीन रणनीतियों के बीच मूलभूत अंतर परीक्षण कोड के तहत कोड के समान ही है या नहीं। परीक्षण फ़ाइल में उपयोग करने 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

1
यह ध्यान दिया जाना चाहिए कि रणनीति 1 का उपयोग _test.goपैकेज के परीक्षण से अलग फाइलों के साथ भी किया जाएगा (रणनीति 2 के समान व्यवहार)। यह प्रति github.com/golang/go/issues/15315 प्रलेखित नहीं लगता है
केविन दीनानाथ

मैंने स्ट्रॉन्ग पैकेज 3 स्ट्रेटजी का उपयोग देखा, लेकिन मैं समझ नहीं पा रहा हूं कि क्या बात है?
पिकबॉय

1
मैंने एक पैकेज को कांटा और बदलाव किए, और अब मेरे परीक्षण सभी मेरे कांटेक्ट पैकेज के बजाय मूल रेपो आयात करने की कोशिश कर रहे हैं। रणनीति 3 के साथ, मुझे "github.com/original/link" को "github.com/my/fork" में बदलना नहीं है, क्योंकि यह केवल संदर्भित है '।' बजाय।
निमर्ली

1
@KevinDeenanauth यह सिर्फ मुझे हैरान कर दिया। मैंने सोचा था कि मुझे एक नुकसान हुआ था जब मुझे सिर्फ _test.goएक गैर- _testपैकेज नाम मिला, जिसमें func init()परीक्षण के लिए कुछ वैश्विक पैकेज चर थे। मैं गलत था।
Zyl

1
@nmarley .अपने कांटे के मुद्दे को हल नहीं करता है। यह एक रिश्तेदार आयात नहीं है। यह पहचानकर्ताओं को "वर्तमान पैकेज में" आयात करता है।
qaisjp

19

यह आपके परीक्षणों के दायरे पर निर्भर करता है। उच्च स्तरीय परीक्षण (एकीकरण, स्वीकृति, आदि ...) को संभवतः एक अलग पैकेज में रखा जाना चाहिए ताकि यह सुनिश्चित हो सके कि आप निर्यात किए गए एपीआई के माध्यम से पैकेज का उपयोग कर रहे हैं।

यदि आपके पास बहुत सारे इंटर्नल के साथ एक बड़ा पैकेज है जिसे परीक्षण के तहत रखने की आवश्यकता है तो अपने परीक्षणों के लिए उसी पैकेज का उपयोग करें। लेकिन यह किसी भी निजी राज्य तक पहुँचने के लिए आपके परीक्षणों का निमंत्रण नहीं है। यह एक बुरा सपना refactoring होगा। जब मैं जाने में संरचना लिखता हूं तो मैं अक्सर इंटरफेस लागू कर रहा हूं। यह उन इंटरफ़ेस विधियाँ हैं जो मैं अपने परीक्षणों से आमंत्रित करता हूँ, सभी सहायक विधियों / कार्यों के लिए नहीं।


13

जब भी संभव हो आप रणनीति 1 का उपयोग करें। आप foo_testआयात चक्र से बचने के लिए विशेष पैकेज के नाम का उपयोग कर सकते हैं , लेकिन यह ज्यादातर वहां है इसलिए मानक पुस्तकालय को एक ही तंत्र के साथ परीक्षण किया जा सकता है। उदाहरण के लिए, stringsरणनीति 1 के साथ परीक्षण नहीं किया जा सकता क्योंकि testingपैकेज निर्भर करता है strings। जैसा कि आपने कहा, रणनीति 2 या 3 के साथ आपके पास पैकेज के निजी पहचानकर्ताओं तक पहुंच नहीं है, इसलिए आमतौर पर इसका उपयोग न करना बेहतर है जब तक कि आप इसे न करें।


10
परीक्षणों में निजी पहचानकर्ताओं तक पहुंच कैसे नहीं है, एक गुण नहीं है?
जुबंस

3
अच्छी परीक्षण प्रथाओं के अनुसार, आप एक कोड विरूपण साक्ष्य के लिए आंतरिक कार्यान्वयन विवरण का परीक्षण नहीं करते हैं; बेटा कर रहा है, एक कोड गंध है
Gerardo Lima

0

एक महत्वपूर्ण नोट जो मैं गोलंग कोडरव्यूकॉमेंट्सimport . से जोड़ना चाहूंगा :

import .रूप वाली परीक्षाओं कि, की वजह से में उपयोगी हो सकता परिपत्र निर्भरता, पैकेज का हिस्सा परीक्षण किया जा रहा नहीं बनाया जा सकता:

package foo_test

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

इस मामले में, परीक्षण फ़ाइल पैकेज फू में नहीं हो सकती क्योंकि यह उपयोग करता है bar/testutil, जो फू आयात करता है । इसलिए हम 'आयात' का उपयोग करते हैं। फ़ाइल को पैकेज फ़ू का हिस्सा होने का दिखावा करने दें, भले ही ऐसा न हो।

इस एक मामले को छोड़कर,import . अपने कार्यक्रमों में उपयोग न करें । यह कार्यक्रमों को पढ़ने के लिए बहुत कठिन बनाता है क्योंकि यह स्पष्ट नहीं है कि क्वक्स जैसा नाम वर्तमान पैकेज में एक शीर्ष-स्तरीय पहचानकर्ता है या एक आयातित पैकेज में।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.