Właściwe nazewnictwo pakietów do testowania w języku Go
Widziałem kilka różnych strategii nazewnictwa pakietów testowych w Go i chciałem wiedzieć, jakie są plusy i minusy każdego z nich i którego z nich powinienem użyć.
Strategia 1:
Nazwa pliku: github.com/user/myfunc.go
package myfunc
Nazwa pliku testowego: github.com/user/myfunc_test.go
package myfunc
Zobaczbzip2 dla przykładu.
Strategia 2:
Nazwa pliku: github.com/user/myfunc.go
package myfunc
Nazwa pliku testowego: github.com/user/myfunc_test.go
package myfunc_test
import (
"github.com/user/myfunc"
)
Zobaczdrut dla przykładu.
Strategia 3:
Nazwa pliku: github.com/user/myfunc.go
package myfunc
Nazwa pliku testowego: github.com/user/myfunc_test.go
package myfunc_test
import (
. "myfunc"
)
Zobacz strings dla przykładu.
Biblioteka Standardowa Go wydaje się używać mieszanki strategii 1 i 2. Którego z tych trzech powinienem użyć? Jest to ból dodawania package *_test
do moich pakietów testowych, ponieważ oznacza to, że nie mogę przetestować mojego pakietu private metody, ale może jest ukryta przewaga, której nie jestem świadomy?
3 answers
Zasadnicza różnica między trzema strategiami, które wymieniłeś, polega na tym, czy kod testowy znajduje się w tym samym pakiecie, co Kod testowany. Decyzja o użyciu package myfunc
LUB package myfunc_test
w pliku testowym zależy od tego, czy chcesz wykonać test white-box czy black-box.
Nie ma nic złego w stosowaniu obu metod w projekcie. Na przykład, można mieć myfunc_whitebox_test.go
i myfunx_blackbox_test.go
.
Pakiet Kodu Testowego Porównanie
-
testowanie czarnej skrzynki: użyj
package myfunc_test
, co zapewni, że używasz tylko wyeksportowanych identyfikatorów . -
testowanie Białej skrzynki: użyj
package myfunc
, aby mieć dostęp do nieeksportowanych identyfikatorów. Dobre dla testów jednostkowych, które wymagają dostępu do nieeksportowanych zmiennych, funkcji i metod.
Porównanie strategii wymienionych w pytaniu
-
Strategia 1: plik
myfunc_test.go
używapackage myfunc
- w tym przypadku kod testowy wmyfunc_test.go
będzie w tym samym pakiecie, co Kod testowany wmyfunc.go
, który w tym przykładzie jestmyfunc
. -
Strategia 2: plik
myfunc_test.go
używapackage myfunc_test
- w tym przypadku kod testowy wmyfunc_test.go
"zostanie skompilowany jako oddzielny pakiet, a następnie połączony i uruchomiony z głównym testowym binarnym."[Źródło: linie 58-59 w teście .go source code] -
Strategia 3: plik
myfunc_test.go
używapackage myfunc_test
, ale importujemyfunc
używając notacji kropkowej - jest to wariant Strategia 2, ale używa notacji kropkowej do importowaniamyfunc
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-16 00:02:44
To zależy od zakresu Twoich testów. Testy na wysokim poziomie (integracja, akceptacja itp...) powinien być umieszczony w oddzielnym pakiecie, aby upewnić się, że korzystasz z pakietu za pośrednictwem eksportowanego interfejsu API.
Jeśli masz duży pakiet z wieloma wewnętrznymi elementami, które należy przetestować, użyj tego samego pakietu do testów. Ale to nie jest zaproszenie dla Twoich testów, aby uzyskać dostęp do jakiegokolwiek prywatnego stanu. To czyniłoby refaktoryzację koszmarem. kiedy piszę struktury w go często implementuję interfejsy. To są te metody interfejsu, które wywołuję z moich testów, a nie wszystkie metody/funkcje pomocnicze osobno.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-16 05:16:33
Powinieneś używać strategii 1, gdy tylko to możliwe. Możesz użyć specjalnej nazwy pakietu foo_test
, aby uniknąć cykli importowania, ale jest to głównie tam, więc biblioteka standardowa może być testowana z tym samym mechanizmem. Na przykład, strings
nie może być testowany ze strategy 1, ponieważ pakiet testing
zależy od strings
. Jak powiedziałeś, w strategii 2 lub 3 nie masz dostępu do prywatnych identyfikatorów pakietu, więc zazwyczaj lepiej nie używać go, chyba że musisz.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-15 10:37:58