محتويات الدورة

Go / المتوسط: الحزم والعمل المتزامن / الدرس 8

اختبار العقود والتشويش

اشتق فحوصا ذات معنى من وعود المجال واستخدم أدوات Go دون خلط التغطية بالبرهان.

وقت القراءة التقريبي: 4 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • تصميم اختبارات جدولية للحدود والفشل.
  • استخدام توقعات مستقلة وفشل محقون.
  • شرح التشويش والأمثلة وحدود كاشف السباق.

ابدأ بالوعد العام

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

مرجع التوقع المستقل أساسي. قد يكرر نسخ تعبير التنفيذ لكل توقع الخطأ نفسه. استخدم حالات بسيطة معروفة أو خصائص رياضية بمجال مبرر أو استراتيجية موثوقة مستقلة. سم الاختبارات بما يحدد الوعد المخرق عند الفشل.

الجدول يظهر سياسة الحدود

يعمل البرنامج الكامل كمشغل صغير يتحقق من نفسه. يفحص توقعات صريحة لعملية حصر ويطبع النجاح بعد اتفاق كل الحالات. في الحزمة المعتادة توضع الحالات في ملف ينتهي بـ_test.go داخل TestXxx تقبل *testing.T؛ وتبلغ t.Errorf التعارض مع سياقه.

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

go جدول حتمي لتوقعات الحدود
package main

import "fmt"

func clamp(n int) int {
	if n < 0 {
		return 0
	}
	if n > 100 {
		return 100
	}
	return n
}

func main() {
	cases := []struct{ input, want int }{{-1, 0}, {0, 0}, {100, 100}, {101, 100}}
	for _, test := range cases {
		if got := clamp(test.input); got != test.want {
			panic("clamp contract failed")
		}
	}
	fmt.Println("4 checks passed")
}
الناتج المتوقع
4 checks passed

تحدد أربعة أزواج مدخل ونتيجة مرجع هذا العرض المحدود.

اختبار مسار الفشل عمدا

تجعل الواجهات فشل الموارد قابلا للاختبار دون ملء القرص أو تعطيل خدمة. يقدم المثال الثاني كاتبا يعيد علامة خطأ دائما. يعيد المساعد الخطأ وتتحقق errors.Is من فئته. لا حاجة لإتلاف ملف أو خدمة خارجية.

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

go حقن فشل كاتب مضبوط
package main

import (
	"errors"
	"fmt"
	"io"
)

var errWrite = errors.New("synthetic write failure")

type failingWriter struct{}

func (failingWriter) Write(p []byte) (int, error) { return 0, errWrite }
func emit(w io.Writer) error                      { _, err := io.WriteString(w, "sample"); return err }

func main() {
	fmt.Println("expected failure", errors.Is(emit(failingWriter{}), errWrite))
}
الناتج المتوقع
expected failure true

تُفحص العلامة المعادة مباشرة بدلا من إحداث فشل مورد حقيقي.

تشويش خاصية محدودة

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

سبق دعم التشويش أساس Go 1.22. شغل هدفا محددا بمدة مقصودة في بيئة تطوير معزولة واحفظ حالة التراجع المصغرة. لا تستخدم المدخلات للاتصال بخدمات حقيقية أو كتابة مسارات غير مضبوطة. وتبقى الاختبارات الحتمية ضرورية لحدود المجال.

تفسير التقارير ضمن نطاقها

تشغل go test الاختبارات وتنفذ go vet فحوصا ساكنة مختارة ويضيف -race كشف سباقات للتنفيذ المدعوم. تبلغ التغطية بلوغ الشيفرة لا صحة المعنى. قد تجتمع تغطية مرتفعة مع تأكيدات ضعيفة وفشل مهمل وسباق في مسار غير منفذ. استخدم التقرير للتحقيق لا كعلامة جودة عامة.

تجنب اختبارات تزامن تنام وتأمل. نسق الروتينات بقنوات أو حواجز وانتظر اكتمالها. نظف الموارد ولا تشارك تجهيزات قابلة للتعديل بين اختبارات متوازية، وسجل متطلبات التوافق عند تبني مساعد اختبار أحدث من Go 1.22.

الأخطاء الشائعة وإصلاحها

ينجح اختبار رغم إعادة الخطأ الخطأ.

لماذا يحدث؟
يفحص err != nil فقط.
كيف تصلحه؟
أكد الفئة الموثقة وآثار الحالة.
كيف تتجنب تكراره؟
استخدم العلامات أو الأنواع حيث يعد العقد.

يفشل اختبار متزامن أحيانا فقط.

لماذا يحدث؟
يعتمد على النوم لا بروتوكول اكتمال.
كيف تصلحه؟
استخدم القنوات أو المزامنة لترتيب الأحداث.
كيف تتجنب تكراره؟
اجعل افتراضات الجدولة صريحة قابلة للإزالة.

يستنفد هدف تشويش الذاكرة.

لماذا يحدث؟
يؤدي نمو المدخل لتخصيص أو عمل غير محدود.
كيف تصلحه؟
حد الحجم واحتياجات الموارد.
كيف تتجنب تكراره؟
عامل التشويش كاختبار مدخل معاد ضمن نطاق معزول.

اختبر فهمك

1. اختر اختبارات لإلحاق يعد ببقاء المخزن المحدود الممتلئ دون تغيير.

اعرض الحل المشروح

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

2. لمحلل تغطية كاملة دون اختبار 12x. اشرح الفجوة واختبار التراجع.

اعرض الحل المشروح

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

أهم ما تعلمته

  • تحتاج الاختبارات توقعات مستقلة مرتبطة بالعقود.
  • احقن الفشل بدلا من إتلاف موارد حقيقية.
  • توفر التغطية والتشويش وvet وrace أدلة متكاملة بحدود صريحة.

المراجع الرسمية