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?

Author: Dan, 2013-11-15

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żywa package myfunc - w tym przypadku kod testowy w myfunc_test.go będzie w tym samym pakiecie, co Kod testowany w myfunc.go, który w tym przykładzie jest myfunc.
  • Strategia 2: plik myfunc_test.go używa package myfunc_test - w tym przypadku kod testowy w myfunc_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żywa package myfunc_test, ale importuje myfunc używając notacji kropkowej - jest to wariant Strategia 2, ale używa notacji kropkowej do importowania myfunc.
 69
Author: Matthew Rankin,
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.

 15
Author: mdwhatcott,
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.

 14
Author: guelfey,
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