تغطية الكود بالاختبارات في Go: المقاييس والأدوات والأمثلة العملية

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

تغطية الكود بالاختبارات في Go: من "العلامة الخضراء" إلى الجودة الحقيقية

\n\n

في عالم تطوير Go، تبدو عبارة "لدي تغطية 95%" فخورة. لكن غالبًا ما تخفي هذه الأرقام فراغًا: تختبر الاختبارات المسار السعيد فقط، بينما تُترك الحالات الحدودية والأخطاء خارجًا. في هذه المقالة، سنفهم كيفية قياس تغطية الكود بالاختبارات في Go بشكل حقيقي، وما هي المقاييس المهمة حقًا، وما هي الأدوات التي ستساعد في تحويل الاختبار من إجراء شكلي إلى أداة قوية لمراقبة الجودة.

\n\n

لن نعيد سرد الوثائق. بدلاً من ذلك، سنقدم أمثلة حية، ومزالق، ونصائح عملية لمن يكتبون بلغة Go ويريدون النوم بسلام.

\n\n

لماذا مجرد 80% هو أمر سيء؟

\n\n

لنفترض أن لديك دالة:

\n\n
func 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\n

أدوات التغطية: من البسيط إلى المعقد

\n\n

1. الأداة المدمجة go test -cover

\n\n

أبسط طريقة لمعرفة تغطية الكود بالاختبارات في Go هي العلامة -cover:

\n\n
go test -cover ./...
\n\n

المخرجات:

\n
ok      myproject/orders    0.234s    coverage: 72.3% of statements
\n\n

لكن هذا مجرد رقم إجمالي. لرؤية أي الأسطر غير مغطاة، استخدم -coverprofile:

\n\n
go test -coverprofile=coverage.out ./...\ngo tool cover -html=coverage.out
\n\n

سيفتح المتصفح مع تمييز: الأخضر - مغطى، الأحمر - غير مغطى. هذه هي الخطوة الأولى لفهم مقاييس التغطية في Go.

\n\n

2. go tool cover: الأوضاع والفروق الدقيقة

\n\n

يدعم go tool cover ثلاثة أوضاع:

\n
    \n
  • set - هل تم تنفيذ السطر مرة واحدة على الأقل (الوضع الافتراضي)
  • \n
  • count - كم مرة تم تنفيذ كل سطر
  • \n
  • atomic - count، ولكن مع عدادات ذرية للاختبارات المتوازية
  • \n
\n\n

لـ تحليل تغطية الاختبارات في Golang في الكود متعدد الخيوط، استخدم atomic، وإلا فإنك تخاطر بالحصول على عدادات غير صحيحة بسبب حالة السباق.

\n\n
go test -covermode=atomic -coverprofile=coverage.out ./...
\n\n

3. كاشف السباق - التغطية المخفية

\n\n

سباقات البيانات هي واحدة من المشاكل الرئيسية في كود Go. حتى لو كانت تغطية الأسطر 100%، يمكن لكاشف السباق العثور على أخطاء لم تلاحظها الاختبارات. قم بتشغيل الاختبارات مع العلامة -race:

\n\n
go test -race -cover ./...
\n\n

هام: يبطئ كاشف السباق الاختبارات بمقدار 2-20 مرة، لكنه ممارسة إلزامية للوحدات الحرجة. قم بتضمينه في CI للحزم الرئيسية.

\n\n

المقاييس التي تهم حقًا

\n\n

نسبة تغطية الأسطر هي مجرد قمة جبل الجليد. إليك ما يجب تتبعه:

\n\n

1. تغطية الفروع (branch coverage)

\n\n

يحسب go test -cover القياسي الأسطر وليس الفروع. لـ تغطية الكود بالاختبارات في Go على مستوى الفروع، استخدم gocov أو go-test-coverage. مثال:

\n\n
go get github.com/axw/gocov/gocov\ngocov test ./... | gocov report
\n\n

سترى ليس فقط الأسطر، ولكن أيضًا عدد الشروط غير المغطاة. على سبيل المثال، لدالة تحتوي على اثنين من if - 4 فروع، منها 2 مغطاة.

\n\n

2. تغطية الطفرات (mutation testing)

\n\n

الطريقة الأكثر صدقًا لتقييم جودة الاختبارات هي

المدونات

توصيات الكتب