Go بالأمثلة: الاختبارات والمقاييس

تعتبر اختبارات الوحدة جزءاً أساسياً من كتابة كود Go بمستوى إنتاجي. توفر حزمة testing الأدوات اللازمة لكتابة الاختبارات، وأداة go test تقوم بتشغيلها.

package main

import (
    "fmt"
    "testing"
)

سنقوم باختبار هذه الدالة البسيطة التي تحسب الحد الأدنى لرقمين. عادةً ما يكون الكود الذي نختبره في ملف مثل intutils.go وملف الاختبار المقابل له يكون intutils_test.go.

func IntMin(a, b int) int {
    if a < b {
        return a
    }
    return b
}

يتم كتابة الاختبار بإنشاء دالة تبدأ بكلمة Test.

func TestIntMinBasic(t *testing.T) {
    ans := IntMin(2, -2)
    if ans != -2 {

t.Errorf تبلغ عن فشل الاختبار ولكنها تستمر في التنفيذ.

        t.Errorf("IntMin(2, -2) = %d; want -2", ans)
    }
}

غالباً ما يتم كتابة الاختبارات باستخدام “الجدول” (Table-driven tests) لتجنب التكرار.

func TestIntMinTableDriven(t *testing.T) {
    var tests = []struct {
        a, b int
        want int
    }{
        {0, 1, 0},
        {1, 0, 0},
        {2, -2, -2},
        {0, -1, -1},
        {-1, 0, -1},
    }

    for _, tt := range tests {

t.Run تسمح بتشغيل “اختبارات فرعية” (subtests).

        testName := fmt.Sprintf("%d,%d", tt.a, tt.b)
        t.Run(testName, func(t *testing.T) {
            ans := IntMin(tt.a, tt.b)
            if ans != tt.want {
                t.Errorf("got %d, want %d", ans, tt.want)
            }
        })
    }
}

اختبارات الأداء (Benchmark tests) تبدأ بـ Benchmark وتستخدم testing.B.

func BenchmarkIntMin(b *testing.B) {

أداة الاختبار ستنفذ متن الدالة b.N مرة.

    for i := 0; i < b.N; i++ {
        IntMin(1, 2)
    }
}

لتشغيل الاختبارات: go test -v

لتشغيل مقاييس الأداء: go test -bench=.

المثال التالي: معاملات سطر الأوامر.