Shanraq.org Shanraq.org
Go-дағы алғашқы тест: go test және _test.go файлы
IT

Go тілі: нөлден өз блогыңызға дейін 10-сабақ (барлығы 50)

Go-дағы алғашқы тест: go test және _test.go файлы

Go курсының оныншы сабағы. Жазылып қалатын тексеру: код қасындағы _test.go файлы, TestXxx функциясы және go test пәрмені. Құлауды қалай оқу керек — тест аты, файл, жол, «алдық» пен «күттік», — t.Errorf пен t.Fatalf айырмасы және неге тізімнің ортасын емес, шетін тексереді.

Не үшін керек

Сіз count пен longer-ді жазып қойдыңыз. Олардың дұрыс екенін қайдан білесіз? Жібердіңіз, шыққанға қарадыңыз, басыңызды изедіңіз. Мұндай тексеру бір минут өмір сүреді: функцияны бір аптадан кейін түзетсеңіз, бәрін қайтадан қолмен тексеру керек, ал сіз оны істемейсіз.

Тест — сол тексерудің өзі, тек жазылып қойылғаны. Оны машина орындайды, әрі әр жолы орындайды.

Елестетіп көріңіз. Ұшар алдындағы ұшқыштың тексеру тізімі. Ол ұшқыш ұмытшақ болғаннан емес, есте сақтау қабілеті істің санымен бірге өспегендіктен. Тізім өседі.

Бірден тұтас

Жаңа қалта, go mod init sabaq09. Бұл жолы файл екеу болады. Бірінші — main.go, өткен сабақтағы таныс функция:

package main

import "fmt"

func count(tags []string) map[string]int {
	m := make(map[string]int)
	for _, t := range tags {
		m[t]++
	}
	return m
}

func main() {
	fmt.Println(count([]string{"go", "веб", "go"}))
}

Екінші — main_test.go, қасында, сол қалтада:

package main

import "testing"

func TestCount(t *testing.T) {
	got := count([]string{"go", "веб", "go"})

	if got["go"] != 2 {
		t.Errorf("go: алдық %d, күттік 2", got["go"])
	}
	if len(got) != 2 {
		t.Errorf("тег саны: алдық %d, күттік 2", len(got))
	}
}

Іске қоспас бұрын — төменге қарамай, go test не басып шығаратынын дауыстап айтыңыз. Содан кейін жіберіп, салыстырыңыз.

PASS
ok  	sabaq09

Үзінділерден іске қосу уақыты алынды: ол әркімде әртүрлі.

Соңғы сан — қанша уақыт кеткені; сізде өзгеше болады.

Талдау

Тест — бұл кодтың қасындағы файл

Аты міндетті түрде _test.go деп бітеді. Бұл ұқыптылық келісімі емес, тілдің ережесі: мұндай файлдарды Go тек go test кезінде жинайды және дайын бағдарламаға қоспайды. Тестті қалағаныңша, қалағаныңдай егжей-тегжейлі жазуға болады — адамдарға беретін бағдарламаның көлеміне олар әсер етпейді.

Елестетіп көріңіз. Құрылыс тіреуіші. Үй салынып жатқанда онымен күн сайын жүреді; дайын үйге ол кірмейді, оның жоқтығына ешкім таңғалмайды.

Пакет сол баяғы — package main, — сондықтан тест count-ты ешқандай қосусыз тікелей көреді.

Тест қалай көрінеді

func TestCount(t *testing.T) {

Үш талап, үшеуі де міндетті. Аты Test-тен басталады. Одан кейін бас әріп тұрады — Testcount емес, TestCount. Және жалғыз параметр — t *testing.T.

t — тест құлау туралы содан хабарлайды. Жұлдызшаны әзірге жазудың бір бөлігі деп оқи беріңіз; сілтегіштер туралы сабақта оның мәнін талдаймыз.

Функция ештеңе қайтармайды. Ештеңе айтпаған тест өткен болып саналады: мұндағы үнсіздік «бәрі сәйкес келді» дегенді білдіреді.

go test және go test -v

go test қорытындыны басады: PASS не FAIL. Тест көбейіп, әрқайсысын атымен көргіңіз келсе, -v қосыңыз:

=== RUN   TestCount
--- PASS: TestCount 
PASS
ok  	sabaq09

Құлау есеп ретінде оқылады

Әдейі бұзыңыз: бірінші салыстырудағы 2-ні 3-ке ауыстырып, хабар мәтінін де түзетіңіз. Жіберіңіз:

--- FAIL: TestCount 
    main_test.go:9: go: алдық 2, күттік 3
    main_test.go:12: тег саны: алдық 2, күттік 3
FAIL

Мұнда керектің бәрі бар: қай тест құлады, қай файлда, қай жолда, не алдық және нені күттік. Хабарда екі шаманы да сол себепті жазады. «Болмады» деген хабар ештеңе айтпайды және кодқа қолмен үңілуге мәжбүрлейді.

Қызыл FAIL — жаза емес, есеп. Жұмыс барысында сіз оны PASS-тан жүз есе жиі көресіз.

t.Errorf және t.Fatalf

t.Errorf құлауды жазып алады да, тестті жалғастырады — сондықтан сіз бірден екі жол көрдіңіз. t.Fatalf жазып алады да, оны тоқтатады: екінші тексеруге кезек келмейді.

Ережесі қарапайым. Fatalf — әрі қарай жүрудің мағынасы болмағанда: керек мән жоқ, келесі жол бәрібір құлайды. Errorf — қалған барлық жағдайда: бір жіберу неғұрлым көп айырма көрсетсе, соғұрлым аз жіберу керек болады.

Ең алдымен нені тексереді

Ортасын емес, шетін. Орта әдетте бәрінде де жұмыс істейді.

count үшін шеттері мынау: бос тізім, бір элемент, барлық элемент бірдей. Тілім сабағындағы longer үшін — бірде-бір тақырып келмейтін тізім және бәрі келетін тізім.

Елестетіп көріңіз. Жол. Көліктер жолақтың ортасында емес, шетінде шығып кетеді. Тексеру керегі — сол шет.

Шеттер әдетте үшеу-төртеу болады, әрі әрқайсысы үшін тұтас if жазып отырудан тез шаршайсыз. Олай істемейді де: жағдайларды бір тізімге салып, цикл арқылы өтеді, ал әрқайсысы есепте өз атын алады. Мұны кестелік тест деп атайды, әрі оны тест туралы екінші сабақта жазамыз — сізде мұндай тізім құралатын құрылымдар пайда болғанда. Әзірге бір функцияға бір тест деген үлгі емес, бастама екенін есте ұстаңыз.

Неге бұл екі есе жұмыс емес

Бір істі екі рет жазып жатқандай көрінеді. Шындығында — әртүрлі. count ішінде сіз қалай санауды сипаттайсыз. Тестте — не шығуы керегін. Тәсілдегі қате нәтиженің сипаттамасында қайталанбайды, сондықтан бірі екіншісін ұстап қалады.

Оның үстіне тест — шаршамайтын жалғыз тексеруші. Функцияны бір айдан кейін түзетесіз, жартысын ұмытасыз да, go test жібересіз — ол сіздің орныңызға есіне алады.

Сабақ картасы

Сабақ картасы: тест кодтың қасында тұрып, оны шақырады және екі жауаптың бірін береді

Өз сөзіңізбен айтыңыз

Қарамай, дауыстап немесе қағазға жазып жауап беріңіз. Жауаптары — сабақтың соңында.

  1. Тест файлының аты неге міндетті түрде _test.go деп бітеді? Оған не байланысты?
  2. Тест ештеңе баспады және ештеңе қайтармады. Ол өтті ме, жоқ па?
  3. Бір тестте төрт тексеру бар, екіншісі құлады. t.Errorf-пен қанша хабар көресіз, t.Fatalf-пен қанша?

Тапсырма

Міндетті. Тілім сабағындағы longer функциясын алып, оған тест жазыңыз. Екі жағдайды тексеріңіз: "Дала", "Шаңырақ", "Go", "Көш" тізімі n = 3 болғанда екі тақырып беруі керек, ал бос тізім кез келген n үшін бірде-бірін бермеуі керек. go test жіберіп, PASS-қа жетіңіз.

Қалауыңызша.

  • longer-ді әдейі бұзыңыз — мысалы, > орнына >= қойыңыз — де, тестің қызаратынына көз жеткізіңіз. Құлай алмайтын тексеру ештеңе тексермейді.
  • go test -v жіберіп, айырмасын қараңыз.
  • Тестіңіздегі t.Errorf-ті t.Fatalf-қа ауыстырып, екі тексеруді бірден бұзыңыз. Енді қанша жол көрінеді?

Блогта қайда тұрады

Функциялар сабағындағы readingTime-ды — оқу уақытын санайтынды — есіңізде ме? Ондағы қате үнсіз болар еді: тура 400 сөзде екінің орнына үш минут шығып кетуі оңай, ал оны отырып санамайынша ешкім байқамайды. Тест дәл осындай қатені ұстайды: ол 199, 200 және 201 сөзді бір секундта тексереді, әрі әр жолы.

Әрі қарай тестер сізбен бүкіл курс бойы жүреді. Тестілеу туралы толық сабақ — жағдайлар кестесімен және қамтумен — кейінірек, құрылымдар пайда болғанда болады. Бүгінгісі өз тапсырмаңызды өзіңіз тексеруге жетеді.

Өз блогыңызды жинаңыз. step-4 ішінде сол файлдарға main_test.go қосылды: тексерулер шеттерге қойылған — нөл сөз, тура екі жүз, екі жүз бір. Оқу уақыты сияқты формулалар дәл сол жерде сынады.

Жауаптар

Жауаптарды көрсету
  1. Себебі бұл әдет емес, тілдің ережесі. Осылай аяқталатын файлдарды тек go test пәрмені жинайды, олар дайын бағдарламаға кірмейді, сондықтан тестер адамдарға беретін нәрсенің көлемін ұлғайтпайды.
  2. Өтті. Тест тек құлау туралы хабарлайды — t.Errorf не t.Fatalf арқылы. Үнсіздік бәрі сәйкес келгенін білдіреді.
  3. t.Errorf-пен құлаған тексерулердің бәрі туралы хабар көресіз, себебі тест әрқайсысынан кейін жалғаса береді. t.Fatalf-пен — біреуін ғана, екіншісі туралы: тест сонда тоқтайды, үшінші мен төртінші орындалмайды.

Дереккөздер

Мәтінде қате не теру қатесі кездессе, бізге айтыңыз

Тапсырманы тексеру

Алдымен VS Code-та шешіп, іске қосыңыз — редактор қатені сол жерде көрсетеді. Дайын шешімді осында қойыңыз. Тексеретін — модель: ол қатені атап көрсетеді, бірақ дайын жауапты бермейді.

Тексеру үшін кіру керек. Кіру

Пікірлер (0)

Әзірге пікір жоқ. Бірінші болыңыз.