মূল কন্টেন্টে যান
মডিউল 9 · 1-এর পাঠ 5কোর্সে 41/50~12 min
মডিউল পাঠ (1/5)

'পরীক্ষা' প্যাকেজ

Go-তে, পরীক্ষাগুলি stdlib-এর অংশ: কোনও বাহ্যিক লাইব্রেরি নেই, কনফিগার করার জন্য কোনও কাঠামো নেই৷ আপনার যা দরকার তা হল কোডের পাশে একটি *_test.go ফাইল, কয়েকটি TestXxx ফাংশন এবং go test কমান্ড।

মৌলিক নিয়মাবলী

  • টেস্ট ফাইলের নাম দেওয়া হয়েছে <something>_test.go এবং একই প্যাকেজ-এ থাকে যা তারা পরীক্ষা করে (অথবা "ব্ল্যাক-বক্স টেস্ট" এর জন্য একটি <name>_test প্যাকেজে)।
  • পরীক্ষার ফাংশনগুলির একটি সঠিক স্বাক্ষর থাকে: func TestXxx(t *testing.T) যেখানে Xxx একটি বড় হাতের অক্ষর দিয়ে শুরু হয়৷
  • আপনি stdlib থেকে testing আমদানি করেন।
  • না assertEquals: আপনি fmt-ক্রিয়াপদের সাথে if got != want { t.Errorf(...) } ব্যবহার করেন।
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লোড হচ্ছে...

টেস্টসাম ফাংশনটি সংজ্ঞায়িত করুন যা একটি ফর্ম্যাট করা বার্তা সহ t.Errorf ব্যবহার করে Sum(2,3) == 5 যাচাই করে।

সম্পাদক লোড হচ্ছে...

সমাধান 3 প্রচেষ্টার পরে উপলব্ধ

ব্যায়াম#go.m9.l1.e2
প্রচেষ্টা: 0লোড হচ্ছে...

TestDiv-এ, Div একটি অপ্রত্যাশিত মান ফেরত দিলে পরীক্ষা অবিলম্বে বন্ধ করতে t.Fatal ব্যবহার করুন।

সম্পাদক লোড হচ্ছে...

সমাধান 3 প্রচেষ্টার পরে উপলব্ধ

Quiz#go.m9.l1.e3
প্রস্তুত

t.Error এবং t.Fatal এর মধ্যে মৌলিক পার্থক্য কি?

Go
if err != nil {
  t.???(err)
}
উত্তরের বিকল্প