تغطية الكود بالاختبارات في Go: من "العلامة الخضراء" إلى الجودة الحقيقية
\n\nفي عالم تطوير Go، تبدو عبارة "لدي تغطية 95%" فخورة. لكن غالبًا ما تخفي هذه الأرقام فراغًا: تختبر الاختبارات المسار السعيد فقط، بينما تُترك الحالات الحدودية والأخطاء خارجًا. في هذه المقالة، سنفهم كيفية قياس تغطية الكود بالاختبارات في Go بشكل حقيقي، وما هي المقاييس المهمة حقًا، وما هي الأدوات التي ستساعد في تحويل الاختبار من إجراء شكلي إلى أداة قوية لمراقبة الجودة.
\n\nلن نعيد سرد الوثائق. بدلاً من ذلك، سنقدم أمثلة حية، ومزالق، ونصائح عملية لمن يكتبون بلغة Go ويريدون النوم بسلام.
\n\nلماذا مجرد 80% هو أمر سيء؟
\n\nلنفترض أن لديك دالة:
\n\nfunc ProcessOrder(amount float64, discount bool) (float64, error) {\n if amount <= 0 {\n return 0, errors.New("amount must be positive")\n }\n if discount {\n amount *= 0.9\n }\n return amount, nil\n}\n\nلقد كتبت اختبارًا واحدًا: ProcessOrder(100, true) → 90, nil. التغطية؟ 100% من الأسطر. لكنك لم تتحقق من حالة amount <= 0 والحالة بدون خصم. رسميًا - التغطية ممتازة. واقعيًا - الأخطاء مضمونة. لهذا السبب يجب النظر إلى مقاييس تغطية الكود بالاختبارات في Go بالتزامن مع مؤشرات أخرى.
أدوات التغطية: من البسيط إلى المعقد
\n\n1. الأداة المدمجة go test -cover
\n\nأبسط طريقة لمعرفة تغطية الكود بالاختبارات في Go هي العلامة -cover:
go test -cover ./...\n\nالمخرجات:
\nok myproject/orders 0.234s coverage: 72.3% of statements\n\nلكن هذا مجرد رقم إجمالي. لرؤية أي الأسطر غير مغطاة، استخدم -coverprofile:
go test -coverprofile=coverage.out ./...\ngo tool cover -html=coverage.out\n\nسيفتح المتصفح مع تمييز: الأخضر - مغطى، الأحمر - غير مغطى. هذه هي الخطوة الأولى لفهم مقاييس التغطية في Go.
\n\n2. go tool cover: الأوضاع والفروق الدقيقة
\n\nيدعم go tool cover ثلاثة أوضاع:
- \n
- set - هل تم تنفيذ السطر مرة واحدة على الأقل (الوضع الافتراضي) \n
- count - كم مرة تم تنفيذ كل سطر \n
- atomic - count، ولكن مع عدادات ذرية للاختبارات المتوازية \n
لـ تحليل تغطية الاختبارات في Golang في الكود متعدد الخيوط، استخدم atomic، وإلا فإنك تخاطر بالحصول على عدادات غير صحيحة بسبب حالة السباق.
\n\ngo test -covermode=atomic -coverprofile=coverage.out ./...\n\n3. كاشف السباق - التغطية المخفية
\n\nسباقات البيانات هي واحدة من المشاكل الرئيسية في كود Go. حتى لو كانت تغطية الأسطر 100%، يمكن لكاشف السباق العثور على أخطاء لم تلاحظها الاختبارات. قم بتشغيل الاختبارات مع العلامة -race:
go test -race -cover ./...\n\nهام: يبطئ كاشف السباق الاختبارات بمقدار 2-20 مرة، لكنه ممارسة إلزامية للوحدات الحرجة. قم بتضمينه في CI للحزم الرئيسية.
\n\nالمقاييس التي تهم حقًا
\n\nنسبة تغطية الأسطر هي مجرد قمة جبل الجليد. إليك ما يجب تتبعه:
\n\n1. تغطية الفروع (branch coverage)
\n\nيحسب go test -cover القياسي الأسطر وليس الفروع. لـ تغطية الكود بالاختبارات في Go على مستوى الفروع، استخدم gocov أو go-test-coverage. مثال:
go get github.com/axw/gocov/gocov\ngocov test ./... | gocov report\n\nسترى ليس فقط الأسطر، ولكن أيضًا عدد الشروط غير المغطاة. على سبيل المثال، لدالة تحتوي على اثنين من if - 4 فروع، منها 2 مغطاة.
\n\n2. تغطية الطفرات (mutation testing)
\n\nالطريقة الأكثر صدقًا لتقييم جودة الاختبارات هي