Wprowadzenie do testowania w Go

testowanie jest niezwykle ważne w całym oprogramowaniu. Niezwykle ważna jest możliwość zapewnienia poprawności kodu i upewnienia się, że wszelkie wprowadzone zmiany nie doprowadzą do zniszczenia niczego innego w różnych częściach bazy kodu.

poświęcając czas na odpowiednie przetestowanie swoich programów go, pozwalasz sobie na szybszy rozwój z większym poczuciem pewności, że to, co rozwijasz, będzie nadal działać po wydaniu go do produkcji.

cele

pod koniec tego samouczka będziesz miał dobre zrozumienie testowania podstawowych funkcji i metod W Go przy użyciu standardowego pakietu "testing".

będziesz miał doświadczenie w pisaniu testów opartych na tabelach, a także zobaczysz, jak wygenerować więcej gadatliwych wyników z testów za pomocą różnych dostępnych znaczników.

samouczek wideo

ten samouczek można znaleźć w formacie wideo, jeśli wolisz:

wprowadzenie

w tym samouczku przyjrzymy się, jak możesz opracować i uruchomić testy dla Twojego kodu go za pomocą polecenia go test.

pliki testowe Go

jeśli wcześniej widziałeś projekty go, być może zauważyłeś, że większość, jeśli nie wszystkie pliki w projekcie, mają odpowiednik FILE_test.go w tym samym katalogu.

to nie przypadek. Są to pliki, które zawierają wszystkie testy jednostkowe dla projektu i testują cały kod w swoich odpowiednikach.

przykład struktury projektu
myproject/- calc.go- calc_test.go- main.go- main_test.go

prosty plik testowy

wyobraź sobie, że mieliśmy bardzo prosty program go, który składał się z jednego pliku i zawierał funkcję calculate(). Ta funkcja calculate() po prostu przyjmuje 1number i dodaje do niej 2. Ładnie i prosto:

main.idź

jeśli chcemy to przetestować, możemy utworzyć plik main_test.go w samedirectory i napisać następujący test:

main_test.idź.
package mainimport ( "testing")func TestCalculate(t *testing.T) { if Calculate(2) != 4 { t.Error("Expected 2 + 2 to equal 4") }}

uruchamianie naszych testów

teraz, gdy stworzyliśmy nasz pierwszy test go, nadszedł czas, aby go uruchomić i sprawdzić, czy nasz kod zachowuje się tak, jak tego oczekujemy. Nasze testy możemy wykonać uruchamiając:

$ go test

powinno to następnie wyświetlić coś podobnego do następującego:

$ go test
PASSok _/Users/elliot/Documents/Projects/tutorials/golang/go-testing-tutorial 0.007s

Table Driven Testing

teraz, gdy cieszymy się, że jedno obliczenie działa, powinniśmy poprawić pewność siebie, dodając kilka dodatkowych przypadków testowych do naszego kodu. Jeśli chcemy zbudować serię przypadków testowych, które są zawsze testowane, możemy użyć array takich testów:

tutaj deklarujemy strukturę, która zawiera zarówno dane wejściowe, jak i wartość oczekiwaną. Następnie przechodzimy przez listę testów za pomocą naszego for _, test := range testswywołania i sprawdzamy, czy nasza funkcja zawsze zwróci oczekiwane wyniki, niezależnie od danych wejściowych.

kiedy uruchamiamy teraz nasz pakiet testowy, powinniśmy zobaczyć ten sam wynik co wcześniej:

$ go test
PASSok _/Users/elliot/Documents/Projects/tutorials/golang/go-testing-tutorial 0.007s

Dane wyjściowe testu

czasami możesz chcieć zobaczyć dokładnie, jakie testy są uruchomione i jak długo trwają testy. Na szczęście, jest to dostępne, jeśli używasz flagi -v podczas uruchamiania yourtests w ten sposób:

$ go test-v

możesz zobaczyć, że zarówno nasz normalny test, jak i nasz test tabelkowy przebiegły i przeszły i nie osiągnęły wartości 0.00s do wykonania.

sprawdzanie pokrycia testu

pokrycie testu jest metryką, którą czasami nadużywają firmy. Przedsiębiorstwa te wyznaczają cele we wszystkich swoich systemach, takie jak: „baza kodu musi być co najmniej 75% objęta testami”.

ale tego rodzaju cele mogą prowadzić do złego zachowania i zespołów programistycznych „gry”systemu, aby spróbować trafić te cele. Widziałem ludzi w niektórych zespołachspend dni pisania testów jednostkowych, które testują podstawowe getters i setters w językach takich jak Java.

testowanie jest niezwykle ważne, ale musisz być pragmatyczny w tym, jak testujesz swoje systemy, aby testy, które piszesz, zapewniały Ci największą wartość.

dni spędzone na pisaniu testów w celu pokrycia nieistotnych części bazy kodu mogłyby być lepiej spędzone na pisaniu spraw testowych wokół krytycznej logiki biznesowej przyjętej w systemach i zapewnieniu większej liczby spraw brzegowych.

Korzystanie z flagi-cover

z ważną częścią z drogi, spójrzmy, jak można sprawdzić pokrycie systemu za pomocą polecenia go test:

w tym samym katalogu, co pliki main.go i main_test.go, uruchom następujące:

$ go test-cover
PASScoverage: 66.7% of statementsok github.com/TutorialEdge/an-intro-to-testing-in-go 0.006s

zobaczysz, że masz 66.7% całego kodu Go objętego testcases.

Wizualizacja pokrycia

podczas gdy ta wartość 66.7% może nam powiedzieć,ile naszego kodu przetestowaliśmy, nie pokazuje nam dokładnie, jakie ścieżki kodu przetestowaliśmy lub nie.

to jest, gdzie go test i go tool cover przyjść, aby pomóc nam rozwiązać ten szczególny problem.

możemy użyć narzędzia go test do wygenerowania coverprofile, które można następnie przekształcić w wizualizację HTML za pomocą polecenia go tool cover:

$ go test-coverprofile=coverage.
PASScoverage: 66.7% of statementsok github.com/TutorialEdge/an-intro-to-testing-in-go 0.008s

możesz następnie pobrać wygenerowany plik coverage.out i użyć go do wygenerowania strony HTML, która dokładnie pokazuje, jakie linie zostały pokryte w ten sposób:

$ go tool cover -html=coverage.out

otworzy to Stronę w wybranej przez Ciebie przeglądarce, która będzie wyglądać trochę tak:

jak widać, większość kodu w naszej funkcji Calculate jest testowana i obejmuje Green. Podczas gdy instrukcja print w funkcji main jest Red, ponieważ nie została objęta testami.

wnioski

mam nadzieję, że ten poradnik okazał się przydatny! Jeśli potrzebujesz dalszej pomocy thenproszę dać mi znać w sekcji komentarzy poniżej.