ओएसएस परियोजनाओं में एकीकरण परीक्षण - प्रमाणीकरण के साथ 3 पार्टियों को कैसे संभालना है?


10

मेरे (ओपन सोर्स) हॉबी प्रोजेक्ट्स में से एक एक बैकअप टूल है, जो GitHub, Bitbucket आदि से रिपॉजिटरी के ऑफ़लाइन बैकअप बनाता है।
यह होस्टर्स एपीआई को रिपॉजिटरी की सूची प्राप्त करने के लिए कॉल करता है, और फिर यह Git / Mercurial / जो भी क्लोन / का उपयोग करता है स्थानीय कंप्यूटर पर रिपॉजिटरी खींचो।

इसलिए मेरे पास एकीकरण परीक्षण हैं जहां मैं प्रमाणीकरण के साथ GitHub API को कॉल कर रहा हूं।
(और जब क्लोनिंग / पुलिंग सुविधा समाप्त हो जाती है, तो संभवतः ऐसे परीक्षण होंगे जो गिटहब से क्लोनिंग रिपॉजिटरी हैं, और साथ ही प्रमाणित करने की आवश्यकता है)

मैंने विशेष रूप से इन एकीकरण परीक्षणों में उपयोग के लिए एक उपयोगकर्ता और एक संगठन बनाया ।

समस्या: मैं स्रोत कोड में कहीं भी पासवर्ड को हार्ड-कोड नहीं कर सकता क्योंकि यह खुला स्रोत है, और कोड GitHub पर सार्वजनिक है।


अब मैं क्या कर रहा हूं

परीक्षणों में, मुझे पर्यावरण चर से सभी उपयोगकर्ता नाम, पासवर्ड और रिपॉजिटरी नाम मिल रहे हैं।
यहाँ एक उदाहरण है :

config.Name = TestHelper.EnvVar("GithubApiTests_Name");
config.Password = TestHelper.EnvVar("GithubApiTests_PW");

( TestHelper.EnvVarएक सहायक विधि है जो एक पर्यावरण चर का मान प्राप्त करती है और इसका कोई अपवाद नहीं है जब यह मौजूद नहीं है)

फिर, मेरे पास एक बैच फ़ाइल है जो उन पर्यावरण चर को सेट करती है।
वास्तविक एक ( environment-variables.bat) को मेरी बिल्ड स्क्रिप्ट में कहा जाता है और परीक्षणों को निष्पादित करने से पहले, लेकिन स्रोत नियंत्रण में अनदेखा किया जाता है, इसलिए यह वास्तव में मेरे भंडार में नहीं है।

स्रोत नियंत्रण में क्या हैenvironment-variables.bat.sample , जो समान पर्यावरण चर निर्धारित करता है, लेकिन नकली पासवर्ड के साथ:

rem copy/rename this file to environment-variables.bat

echo Setting environment variables for integration tests...

set GithubApiTests_Name=scm-backup-testuser
set GithubApiTests_OrgName=scm-backup-testorg
set GithubApiTests_PW=not-the-real-password
set GithubApiTests_Repo=scm-backup

इसलिए मैं अपनी मशीन पर रिपॉजिटरी को क्लोन कर सकता हूं, इस फाइल का नाम बदल सकता हूं, environment-variables.batनकली पासवर्ड को असली से बदलूंगा, और सभी एकीकरण परीक्षण काम करेंगे।

यह कंटीन्यूअस इंटीग्रेशन के साथ काम करता है - मैं AppVeyor का उपयोग कर रहा हूं, और वहां मैं इन परिवेश चर को वेब UI में सेट कर सकता हूं ।


मुझे इसके बारे में क्या पसंद नहीं है

मुझे लगता है कि यह ओएसएस परियोजना के लिए एक अच्छा समाधान नहीं है, और विशेष रूप से इस परियोजना के लिए नहीं :

सिद्धांत रूप में, मेरी परियोजना में योगदानकर्ता अभी तक एकीकरण परीक्षण चला सकेगा:

  • GitHub पर अपना स्वयं का परीक्षण उपयोगकर्ता और परीक्षण संगठन बनाना
  • कुछ परीक्षण रिपोजिटरी बना रहे हैं
  • environment-variables.batविभिन्न मूल्यों के साथ अपना स्वयं का संस्करण बनाना

समस्या यह है कि मेरा एप्लिकेशन कई स्रोत कोड होस्टर्स का बैकअप ले सकेगा।
अभी, यह केवल GitHub का समर्थन करता है, लेकिन कुछ होस्ट्स को जोड़कर अधिक होस्टर्स के लिए समर्थन जोड़ना आसान होगा जो सही इंटरफेस को लागू करते हैं।

इसलिए जब मैं बाद में अधिक होस्टरों के लिए समर्थन लागू करता हूं, तो पर्यावरण चर की संख्या बढ़ेगी। सभी एकीकरण परीक्षणों
को निष्पादित करने में सक्षम होने के लिए , एक संभावित योगदानकर्ता GitHub, Bitbucket, GitLab, में अपने स्वयं के उपयोगकर्ता, संगठन और परीक्षण रिपॉजिटरी बनाएगा .... और जो जानता है कि कितने और हैं, और उन सभी को अपने संस्करण में जोड़ते हैं । environment-variables.bat

क्या एक बेहतर समाधान है कि यह एक परियोजना पर कैसे करें जहां कोड सार्वजनिक है?

मुझे पता है कि अन्य परियोजनाएं जो मैं वर्तमान में कर रहा हूं, उसके समान है। उदाहरण के लिए,
ऑक्टोकिट.नेट के पास एकीकरण परीक्षण के लिए पर्यावरण चर स्थापित करने के लिए एक स्क्रिप्ट है जो गिटहब एपीआई कह रहे हैं। लेकिन उन्हें केवल एक उपयोगकर्ता और एक संगठन की आवश्यकता है, और मुझे बहुत अधिक की आवश्यकता होगी।

शायद मुझे ऐसे समाधान की आवश्यकता नहीं है जो योगदानकर्ता को वास्तव में सभी एकीकरण परीक्षण चलाने में सक्षम बनाता है ।
उदाहरण के लिए, यदि कोई मेरी परियोजना के GitHub समर्थन में योगदान करना चाहेगा, तो उसे केवल GitHub एकीकरण परीक्षण चलाने में सक्षम होने की आवश्यकता होगी।
इसलिए हो सकता है कि मुझे अपने एकीकरण परीक्षणों को "समूहों" (?) और फिर कहने के लिए अनंत संख्या में विभाजित करने में सक्षम होने के लिए एक समझदार तरीका चाहिए और अब उन सभी परीक्षणों को निष्पादित करें जो समूह 'जीथब' के हैं।

जवाबों:


2

मुझे लगता है कि आपका वर्तमान सेटअप ठीक है, लेकिन मैं कुछ समायोजन करूंगा।

सभी एकीकरण परीक्षणों को निष्पादित करने में सक्षम होने के लिए, एक संभावित योगदानकर्ता GitHub, Bitbucket, GitLab, में अपने स्वयं के उपयोगकर्ता, संगठन और परीक्षण रिपॉजिटरी बनाएगा .... और जो जानता है कि कितना अधिक है, और उन सभी को अपने पर्यावरण-चर में जोड़ता है .bat संस्करण

हां, यह सच है, लेकिन योगदानकर्ताओं को अपनी परियोजना पर पीआर बनाने से पहले सभी एकीकरण परीक्षणों को चलाने की आवश्यकता नहीं है। एक बार PR बन जाने के बाद, CI परीक्षण का पूरा सूट चलाएगा।

यह एक परीक्षण सूट है कि किसी भी तरह आसानी से चलाने के लिए संभव नहीं है आम है। कई संगठनों के लिए वे परीक्षण सूट बनाए रखते हैं जो चलाने के लिए दिन लगते हैं - इसलिए डेवलपर्स को चुनिंदा रूप से परीक्षण चलाने होंगे जो अधिक कठोर परीक्षण के लिए कोड को चलाने और आगे बढ़ाने के लिए आसान हैं। मैं उसी दृष्टिकोण का सुझाव दे रहा हूं।

नियमित / विश्वसनीय योगदानकर्ताओं के लिए, आप उन्हें अपनी परियोजना पर वास्तविक योगदानकर्ता बना सकते हैं, जो उन्हें पीआर बनाने से पहले अपनी शाखा पर CI चलाने की अनुमति दे ।

उस ने कहा, आप योगदानकर्ताओं को परीक्षणों के पूर्ण सुइट को चलाने से नहीं रोक रहे हैं । वे अपने स्वयं के GitHub क्रेडेंशियल प्रदान कर सकते हैं या अपने स्वयं के परीक्षण खाते बना सकते हैं, और नियमित योगदानकर्ता संभवतः ऐसा करेंगे।

मेरे द्वारा सुझाए गए समायोजन निम्नलिखित हैं:

सबसे पहले, अपने अधिकांश टेस्ट कवरेज यूनिट टेस्ट करें। ये आपके कोडबेस की सभी शाखाओं को कवर करना चाहिए।

दूसरा, एकीकरण परीक्षण लिखें जहां समापन बिंदु का मजाक उड़ाया गया हो। आप इन API की ट्रांसपोर्ट लेयर को मॉक कर सकते हैं और नकली GitHub रेस्ट सर्विस शुरू करके HTTP रिक्वेस्ट / रिस्पॉन्स फ्लो का अनुकरण कर सकते हैं। उदाहरण के लिए (छद्म कोड में):

// Test failed authentication to GitHub
val server = new WebServer("localhost", 9453, { request =>
    return Response(401, "unauthenticated")
})
server.start()
val backupService = new GitHubBackupService("http://localhost:9453")
backupService.backup must throw UnauthenticatedException()
server.stop()

ये परीक्षण अधिक जटिल होंगे, लेकिन आपको करने की अनुमति देंगे

  1. नकली अकाउंट और रिपॉजिटरी बनाए बिना टेस्ट करें
  2. वास्तविक GitHub के साथ अनुकरण करने के लिए कठिन परीक्षण की विफलता की स्थिति। उदाहरण के लिए 502 प्रतिक्रियाएं, कनेक्शन टाइमआउट, असामान्य / अप्राप्य प्रतिक्रिया बॉडी।

तीसरा, किसी भी परीक्षण को अक्षम करें जो एक सामान्य बिल्ड के तहत चलने से विशेष ज्ञान की आवश्यकता है। अधिकांश बिल्ड प्रबंधन टूल में एकीकरण परीक्षण, या टैग परीक्षण को अलग करने और उन्हें चुनिंदा तरीके से चलाने का एक तरीका है। योगदानकर्ताओं को बिना किसी पूर्व कॉन्फ़िगरेशन के सॉफ़्टवेयर का निर्माण और परीक्षण करने में सक्षम होना चाहिए । सीआई में प्रत्येक निर्माण के बाद पूर्ण परीक्षण सूट चलना चाहिए।

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

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