مرکزی مواد پر جائیں
ماڈیول 9 · سبق 1 از 5کورس میں 41/50~12 min
ماڈیول اسباق (1/5)

'ٹیسٹنگ' پیکیج

گو میں، ٹیسٹ stdlib کا حصہ ہیں: کوئی بیرونی لائبریری نہیں، ترتیب دینے کے لیے کوئی فریم ورک نہیں۔ آپ کو بس کوڈ کے آگے ایک *_test.go فائل، چند TestXxx فنکشنز، اور go test کمانڈ کی ضرورت ہے۔

بنیادی کنونشنز

  • ٹیسٹ فائلوں کا نام <something>_test.go رکھا گیا ہے اور اسی پیکیج میں رہتے ہیں جس کوڈ کی وہ جانچ کرتے ہیں (یا "بلیک باکس ٹیسٹس" کے لیے <name>_test پیکیج میں)۔
  • ٹیسٹ فنکشنز میں ** عین مطابق** دستخط ہوتے ہیں: func TestXxx(t *testing.T) جہاں Xxx ایک بڑے حروف سے شروع ہوتا ہے۔
  • آپ stdlib سے testing درآمد کرتے ہیں۔
  • نہیں assertEquals: آپ if got != want { t.Errorf(...) } کو fmt-فعل کے ساتھ استعمال کرتے ہیں۔
Go
// math.go
package math

func Sum(a, b int) int { return a + b }

// math_test.go
package math

import "testing"

func TestSum(t *testing.T) {
    got := Sum(2, 3)
    if got != 5 {
        t.Errorf("Sum(2,3) = %d; voglio %d", got, 5)
    }
}

اس کے ساتھ چلائیں:

Bash
go test ./...        # all packages in the module
go test -v ./pkg     # verbose: prints test names
go test -run TestSum  # only tests matching the regex

t.Error بمقابلہ t.Fatal

ناکامی کا اشارہ دینے کے لیے یہ دو بنیادی فعل ہیں:

طریقہاثر
t.Log(args...)لاگ ان ہوتا ہے لیکن ناکام نہیں ہوتا (صرف -v کے ساتھ یا ناکامی پر نظر آتا ہے)۔
t.Error(args...)لاگز، مارکس فیل، جاری ہے ٹیسٹ فنکشن۔
t.Errorf(fmt, ...)جیسے Error فارمیٹنگ کے ساتھ۔
t.Fatal(args...)لاگز، مارکس فیل، سٹاپ ٹیسٹ (runtime.Goexit پر کال کریں)۔
t.Fatalf(fmt, ...)جیسے Fatal فارمیٹنگ کے ساتھ۔

انگوٹھے کا اصول: Fatal استعمال کریں جب جاری رکھنا کوئی معنی نہیں رکھتا ہے (جیسے ناکام سیٹ اپ، آسنن نیل پوائنٹر ڈیریفرنس)؛ دوسری صورت میں Error، جو آپ کو ایک ہی دوڑ میں تمام ناکامیوں کو دیکھنے دیتا ہے۔

Go
func TestOpen(t *testing.T) {
    f, err := os.Open("fixtures/sample.txt")
    if err != nil {
        t.Fatal(err) // if it doesn't open, the next steps would fail on nil
    }
    defer f.Close()
    // ... assert on content with t.Errorf
}

t.Cleanup کے ساتھ سیٹ اپ اور ٹیر ڈاؤن

ٹیسٹ (یا ذیلی ٹیسٹ) کے اختتام پر وسائل جاری کرنے کے لیے، defer کی بجائے t.Cleanup استعمال کریں:

Go
func TestDB(t *testing.T) {
    db := newTestDB(t)
    t.Cleanup(func() { db.Close() })
    // ... test
}

defer پر فائدہ: db تخلیق کرنے والا مددگار اندرونی طور پر کلین اپ کو رجسٹر کر سکتا ہے، لہذا کال کرنے والوں کو اسے یاد رکھنے کی ضرورت نہیں ہے۔

ٹیسٹ مددگار

t.Helper() طریقہ ایک فنکشن کو "مددگار" کے طور پر نشان زد کرتا ہے: جب کوئی ٹیسٹ ناکام ہوجاتا ہے، تو اسٹیک ٹریس مددگار فنکشن کو چھوڑ دیتا ہے اور براہ راست کالر کی طرف اشارہ کرتا ہے:

Go
func mustParseInt(t *testing.T, s string) int {
    t.Helper()
    n, err := strconv.Atoi(s)
    if err != nil {
        t.Fatalf("parse %q: %v", s, err)
    }
    return n
}

مشقیں

ورزش#go.m9.l1.e1
کوششیں: 0لوڈ ہو رہا ہے…

TestSum فنکشن کی وضاحت کریں جو T.Errorf کا استعمال کرتے ہوئے Sum(2,3) == 5 کی تصدیق کرتا ہے۔

ایڈیٹر لوڈ ہو رہا ہے…

3 کوششوں کے بعد حل دستیاب ہے۔

ورزش#go.m9.l1.e2
کوششیں: 0لوڈ ہو رہا ہے…

TestDiv میں، ٹیسٹ کو فوری طور پر روکنے کے لیے t.Fatal کا استعمال کریں اگر Div غیر متوقع قدر لوٹاتا ہے۔

ایڈیٹر لوڈ ہو رہا ہے…

3 کوششوں کے بعد حل دستیاب ہے۔

Quiz#go.m9.l1.e3
تیار

t.Error اور t.Fatal کے درمیان بنیادی فرق کیا ہے؟

Go
if err != nil {
  t.???(err)
}
جواب کے اختیارات