ప్రధాన కంటెంట్‌కు వెళ్లండి
మాడ్యూల్ 9 · 5లో పాఠం 1కోర్సులో 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: మీరు 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 vs 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ని ఉపయోగించి సమ్(2,3) == 5ని ధృవీకరించే TestSum ఫంక్షన్‌ని నిర్వచించండి.

ఎడిటర్ లోడ్ అవుతోంది…

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)
}
సమాధాన ఎంపికలు