ماڈیول اسباق (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-فعل کے ساتھ استعمال کرتے ہیں۔
// 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)
}
}اس کے ساتھ چلائیں:
go test ./... # all packages in the module
go test -v ./pkg # verbose: prints test names
go test -run TestSum # only tests matching the regext.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، جو آپ کو ایک ہی دوڑ میں تمام ناکامیوں کو دیکھنے دیتا ہے۔
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 استعمال کریں:
func TestDB(t *testing.T) {
db := newTestDB(t)
t.Cleanup(func() { db.Close() })
// ... test
}defer پر فائدہ: db تخلیق کرنے والا مددگار اندرونی طور پر کلین اپ کو رجسٹر کر سکتا ہے، لہذا کال کرنے والوں کو اسے یاد رکھنے کی ضرورت نہیں ہے۔
ٹیسٹ مددگار
t.Helper() طریقہ ایک فنکشن کو "مددگار" کے طور پر نشان زد کرتا ہے: جب کوئی ٹیسٹ ناکام ہوجاتا ہے، تو اسٹیک ٹریس مددگار فنکشن کو چھوڑ دیتا ہے اور براہ راست کالر کی طرف اشارہ کرتا ہے:
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
}مشقیں
TestSum فنکشن کی وضاحت کریں جو T.Errorf کا استعمال کرتے ہوئے Sum(2,3) == 5 کی تصدیق کرتا ہے۔
3 کوششوں کے بعد حل دستیاب ہے۔
TestDiv میں، ٹیسٹ کو فوری طور پر روکنے کے لیے t.Fatal کا استعمال کریں اگر Div غیر متوقع قدر لوٹاتا ہے۔
3 کوششوں کے بعد حل دستیاب ہے۔
t.Error اور t.Fatal کے درمیان بنیادی فرق کیا ہے؟
if err != nil {
t.???(err)
}