మాడ్యూల్ పాఠాలు (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-క్రియలతో ఉపయోగిస్తున్నారు.
// 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 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, ఇది ఒకే పరుగులో అన్ని వైఫల్యాలను చూడడానికి మిమ్మల్ని అనుమతిస్తుంది.
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
}వ్యాయామాలు
ఫార్మాట్ చేయబడిన సందేశంతో t.Errorfని ఉపయోగించి సమ్(2,3) == 5ని ధృవీకరించే TestSum ఫంక్షన్ని నిర్వచించండి.
3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది
TestDivలో, Div ఊహించని విలువను అందిస్తే వెంటనే పరీక్షను ఆపడానికి t.Fatalని ఉపయోగించండి.
3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది
t.Error మరియు t.Fatal మధ్య ప్రాథమిక వ్యత్యాసం ఏమిటి?
if err != nil {
t.???(err)
}