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.
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:
jeśli chcemy to przetestować, możemy utworzyć plik main_test.go
w samedirectory i napisać następujący test:
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:
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 tests
wywoł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:
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:
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:
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
:
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.