اختبار البنية التحتية كرمز مع Pulumi. الجزء 2

أهلاً بكم. واليوم نشارككم الجزء الأخير من المقال. "اختبار البنية التحتية كرمز مع Pulumi"والتي تم إعداد ترجمتها خصيصًا لطلاب الدورة "ممارسات وأدوات DevOps".

اختبار البنية التحتية كرمز مع Pulumi. الجزء 2

اختبار النشر

يعد هذا النمط من الاختبار أسلوبًا قويًا، فهو يسمح لنا بإجراء اختبار المربع الأبيض للتحقق من الأجزاء الداخلية لكيفية عمل كود البنية التحتية لدينا. ومع ذلك، فهو يحد إلى حد ما مما يمكننا اختباره. يتم إجراء الاختبارات بناءً على خطة النشر في الذاكرة التي أنشأتها Pulumi قبل النشر الفعلي، وبالتالي لا يمكن اختبار النشر نفسه. في مثل هذه الحالات، لدى Pulumi إطار اختبار التكامل. وهذان النهجان يعملان معًا بشكل رائع!

تمت كتابة إطار اختبار تكامل Pulumi باللغة Go، ومن خلاله نختبر معظم التعليمات البرمجية الداخلية لدينا. إذا كان نهج اختبار الوحدة الذي تمت مناقشته سابقًا أشبه باختبار الصندوق الأبيض، فإن اختبار التكامل هو الصندوق الأسود. (توجد أيضًا خيارات للاختبار الداخلي المكثف.) تم إنشاء هذا الإطار لاستخدام برنامج Pulumi كاملًا وتنفيذ عمليات دورة الحياة المختلفة عليه، مثل نشر مكدس جديد من البداية، وتحديثه بأشكال مختلفة، وحذفه، ربما عدة مرات . نقوم بإجرائها بانتظام (على سبيل المثال، في الليل) وكاختبارات إجهاد.

(نحن أعمل عليهبحيث تتوفر إمكانات اختبار التكامل المماثلة في SDK باللغات الأصلية. يمكنك استخدام إطار اختبار تكامل Go بغض النظر عن اللغة التي تمت كتابة برنامج Pulumi بها).

وبتشغيل البرنامج بهذا الإطار يمكنك التحقق مما يلي:

  • رمز المشروع الخاص بك صحيح من الناحية النحوية ويعمل بدون أخطاء.
  • تعمل إعدادات تكوين المكدس والأسرار ويتم تفسيرها بشكل صحيح.
  • يمكن نشر مشروعك بنجاح إلى موفر السحابة الذي تختاره.
  • يمكن ترقية مشروعك بنجاح من الحالة الأولية إلى N حالات أخرى.
  • يمكن تدمير مشروعك وإزالته بنجاح من مزود السحابة الخاص بك.

وكما سنرى قريبًا، يمكن أيضًا استخدام إطار العمل هذا لإجراء التحقق من صحة وقت التشغيل.

اختبار التكامل البسيط

ولرؤية ذلك عمليًا، سنلقي نظرة على المستودع pulumi/examples، حيث يستخدمه فريقنا ومجتمع Pulumi لاختبار طلبات السحب والالتزامات والإنشاءات الليلية الخاصة بهم.

وفيما يلي اختبار مبسط لدينا مثال يقوم بتوفير مجموعة S3 وبعض الكائنات الأخرى:

example_test.go:

package test
 
import (
    "os"
    "path"
    "testing"
 
    "github.com/pulumi/pulumi/pkg/testing/integration"
)
 
func TestExamples(t *testing.T) {
    awsRegion := os.Getenv("AWS_REGION")
    if awsRegion == "" {
        awsRegion = "us-west-1"
    }
    cwd, _ := os.Getwd()
    integration.ProgramTest(t, &integration.ProgramTestOptions{
        Quick:       true,
        SkipRefresh: true,
        Dir:         path.Join(cwd, "..", "..", "aws-js-s3-folder"),
        Config: map[string]string{
            "aws:region": awsRegion,
        },
    })
}

يمر هذا الاختبار عبر دورة الحياة الأساسية لإنشاء مكدس المجلد وتعديله وتدميره aws-js-s3-folder. سيستغرق الإبلاغ عن الاختبار الذي تم اجتيازه حوالي دقيقة:

$ go test .
PASS
ok      ... 43.993s

هناك العديد من الخيارات لتخصيص سلوك هذه الاختبارات. انظر القائمة الكاملة للخيارات. في الهيكل ProgramTestOptions. على سبيل المثال، يمكنك تكوين نقطة نهاية Jaeger للتتبع (Tracing)، تشير إلى أنك تتوقع فشل الاختبار أثناء الاختبار السلبي (ExpectFailure)، قم بتطبيق سلسلة من "التعديلات" على برنامج التحولات المتعاقبة للحالة (EditDirs) وأكثر بكثير. دعونا نرى كيفية استخدامها لاختبار نشر التطبيق.

التحقق من خصائص الموارد

يضمن التكامل الذي تمت مناقشته أعلاه أن برنامجنا "يعمل" - ولا يتعطل. ولكن ماذا لو أردنا التحقق من خصائص المكدس الناتج؟ على سبيل المثال، أن أنواعًا معينة من الموارد تم إعدادها (أو لم يتم إعدادها) وأن لها سمات معينة.

المعلمة ExtraRuntimeValidation إلى ProgramTestOptions يسمح لنا بإلقاء نظرة على حالة Pulumi بعد النشر حتى نتمكن من إجراء فحوصات إضافية. يتضمن ذلك لقطة كاملة للمكدس الناتج، بما في ذلك التكوين وقيم المخرجات المصدرة وجميع الموارد وقيم خصائصها وأي تبعيات بين الموارد.

لرؤية مثال أساسي على ذلك، دعونا نتحقق من أن برنامجنا يقوم بإنشاء واحد دلو S3:

  integration.ProgramTest(t, &integration.ProgramTestOptions{
        // as before...
        ExtraRuntimeValidation: func(t *testing.T, stack integration.RuntimeValidationStackInfo) {
            var foundBuckets int
            for _, res := range stack.Deployment.Resources {
                if res.Type == "aws:s3/bucket:Bucket" {
                    foundBuckets++
                }
            }
            assert.Equal(t, 1, foundBuckets, "Expected to find a single AWS S3 Bucket")
        },
    })

الآن، عندما نقوم بتشغيل اختبار go، فلن يمر عبر مجموعة اختبارات دورة الحياة فحسب، بل أيضًا، بعد نشر المكدس بنجاح، سيتم إجراء فحوصات إضافية على الحالة الناتجة.

اختبارات وقت التشغيل

حتى الآن، كانت جميع الاختبارات تتعلق فقط بسلوك النشر ونموذج الموارد الخاص ببولومي. ماذا لو كنت تريد التحقق من أن البنية الأساسية المتوفرة لديك تعمل بالفعل؟ على سبيل المثال، إذا كان الجهاز الظاهري قيد التشغيل، فإن حاوية S3 تحتوي على ما نتوقعه، وما إلى ذلك.

ربما تكون قد خمنت بالفعل كيفية القيام بذلك: الخيار ExtraRuntimeValidation إلى ProgramTestOptions هي فرصة عظيمة للقيام بذلك. في هذه المرحلة، يمكنك إجراء اختبار Go عشوائيًا مع إمكانية الوصول إلى الحالة الكاملة لموارد برنامجك. تتضمن هذه الحالة معلومات مثل عناوين IP للجهاز الظاهري وعناوين URL وأي شيء آخر مطلوب للتفاعل الفعلي مع التطبيقات السحابية والبنية التحتية الناتجة.

على سبيل المثال، يقوم برنامج الاختبار الخاص بنا بتصدير الخاصية webEndpoint دلو يسمى websiteUrl، وهو عنوان URL الكامل حيث يمكننا الحصول على التهيئة index document. على الرغم من أنه يمكننا البحث في ملف الحالة للعثور عليه bucket وقراءة هذه الخاصية مباشرة، ولكن في كثير من الحالات، ستقوم مكدساتنا بتصدير خصائص مفيدة مثل هذه التي نشعر بالراحة عند استخدامها للتحقق من الصحة:

integration.ProgramTest(t, &integration.ProgramTestOptions{
            // as before ...
        ExtraRuntimeValidation: func(t *testing.T, stack integration.RuntimeValidationStackInfo) {
            url := "http://" + stack.Outputs["websiteUrl"].(string)
            resp, err := http.Get(url)
            if !assert.NoError(t, err) {
                return
            }
            if !assert.Equal(t, 200, resp.StatusCode) {
                return
            }
            defer resp.Body.Close()
            body, err := ioutil.ReadAll(resp.Body)
            if !assert.NoError(t, err) {
                return
            }
            assert.Contains(t, string(body), "Hello, Pulumi!")
        },
    })

كما هو الحال مع فحوصات وقت التشغيل السابقة، سيتم تنفيذ هذا التحقق فورًا بعد رفع المكدس، كل ذلك استجابة لاستدعاء بسيط go test. وهذا مجرد غيض من فيض - جميع ميزات اختبار Go التي يمكنك كتابتها في التعليمات البرمجية متوفرة.

التكامل المستمر للبنية التحتية

من الجيد أن تكون قادرًا على إجراء الاختبارات على جهاز كمبيوتر محمول عند إجراء الكثير من التغييرات على البنية التحتية، للتحقق من صحتها قبل إرسالها لمراجعة التعليمات البرمجية. لكننا والعديد من عملائنا نختبر البنية التحتية في مراحل مختلفة من دورة حياة التطوير:

  • في كل طلب سحب مفتوح لاختبار ما قبل الدمج.
  • ردًا على كل التزام، للتحقق مرة أخرى من أن الدمج قد تم بشكل صحيح.
  • بشكل دوري، مثلًا في الليل أو أسبوعيًا لإجراء اختبارات إضافية.
  • كجزء من اختبار الأداء أو اختبار التحمل الذي يتم إجراؤه عادةً على مدى فترة طويلة من الوقت وإجراء الاختبارات بالتوازي و/أو نشر نفس البرنامج عدة مرات.

لكل واحد منهم، يدعم Pulumi التكامل مع نظام التكامل المستمر المفضل لديك. ومن خلال التكامل المستمر، يمنحك هذا نفس تغطية الاختبار للبنية الأساسية الخاصة بك كما هو الحال بالنسبة لبرامج التطبيقات الخاصة بك.

يتمتع Pulumi بدعم أنظمة CI الشائعة. وهنا بعض منهم:

لمزيد من المعلومات، يرجى الرجوع إلى وثائق التسليم المستمر.

بيئات سريعة الزوال

الميزة القوية جدًا التي يتم فتحها هي القدرة على نشر بيئات سريعة الزوال فقط لغرض اختبار القبول. مفهوم المشاريع والمداخن تم تصميم Pulumi لنشر البيئات المعزولة والمستقلة تمامًا وتدميرها بسهولة، كل ذلك باستخدام عدد قليل من أوامر CLI البسيطة أو باستخدام إطار عمل اختبار التكامل.

إذا كنت تستخدم GitHub، يقترح عليك Pulumi تطبيق جيثب، مما سيساعدك على ربط اختبار القبول بسحب الطلبات ضمن مسار CI الخاص بك. ما عليك سوى تثبيت التطبيق في مستودع GitHub، وسيقوم Pulumi بإضافة معلومات حول معاينة البنية التحتية والتحديثات ونتائج الاختبار إلى CI الخاص بك ومجموعة الطلبات:

اختبار البنية التحتية كرمز مع Pulumi. الجزء 2

عند استخدام Pulumi لاختبارات القبول الأساسية، سيكون لديك خيارات أتمتة جديدة من شأنها تحسين إنتاجية الفريق وتمنحك الثقة في جودة تغييراتك.

مجموع

لقد رأينا في هذه المقالة أنه عند استخدام لغات البرمجة ذات الأغراض العامة، تصبح العديد من تقنيات تطوير البرمجيات متاحة لنا، والتي كانت مفيدة في تطوير تطبيقاتنا. وهي تشمل اختبار الوحدة، واختبار التكامل، بالإضافة إلى تفاعلها لإجراء اختبار وقت التشغيل الشامل. من السهل إجراء الاختبارات عند الطلب أو على نظام CI الخاص بك.

بولومي - برنامج مفتوح المصدر، وهو مجاني للاستخدام ويعمل مع لغات البرمجة والسحابات المفضلة لديك - جربه اليوم!

الجزء الأول

المصدر: www.habr.com

إضافة تعليق