2013-09-05 12 views
13

Jestem używany do testowania napędu mojego kodu. Teraz, gdy jestem nowy w Go, staram się jak najszybciej to naprawić. Korzystam z pakietu testowego w standardowej bibliotece, który wydaje się być wystarczająco dobry. (Podoba mi się również, że nie jest to kolejna zewnętrzna zależność. Obecnie jesteśmy na 2 zależnościach - w porównaniu do jakiegokolwiek projektu Java lub Ruby .....) W każdym razie - wygląda na to, że assert w golangu wygląda tak:Testowanie jednostek - rejestracja, a następnie niepowodzenie?

func TestSomething(t *testing.T) { 
    something := false 
    if something { 
    t.Log("Oh noes - something is false") 
    t.Fail()  
    } 
} 

znajdę ten rozwlekły i chciałbym zrobić to w jednym wierszu zamiast:

Assert(something, "Oh noes - something is false") 

lub coś podobnego. Mam nadzieję, że przegapiłem coś oczywistego tutaj. Jaki jest najlepszy/idiomatyczny sposób na zrobienie tego?

UPDATE: tylko w celu wyjaśnienia. Gdybym miał zrobić coś takiego:

func AssertTrue(t *testing.T, value bool, message string) { 
    if value { 
    t.Log(message) 
    t.Fail() 
    } 
} 

a następnie napisać mój test jak ten

func TestSomething(t *testing.T) { 
    something := false 
    AssertTrue(t, something, "Oh noes - something is false") 
} 

wtedy nie byłoby sposobu iść to zrobić?

+0

przetestować kod Java bez żadnych zależności? Junit nie jest częścią JDK btw. – Woot4Moo

+0

oczywiście, że nie. W porównaniu z Javą podoba mi się, że istnieje biblioteka testów jednostkowych w standardowej bibliotece. W Ruby jest też jeden, chociaż i tak ludzie używają rspec. Nie mam pewności co do najlepszych praktyk ... – froderik

+0

Musiałem błędnie odczytać twoje oryginalne oświadczenie. – Woot4Moo

Odpowiedz

16

Dostępne są pakiety zewnętrzne, które można zintegrować z ramowym systemem testowania.

Jeden z nich napisałem dawno temu, gocheck, był przeznaczony do sortowania tego rodzaju przypadków użycia.

Dzięki niemu, przypadek testowy wygląda tak, na przykład:

func (s *Suite) TestFoo(c *gocheck.C) { 
    // If this succeeds the world is doomed. 
    c.Assert("line 1\nline 2", gocheck.Equals, "line 3") 
} 

Byłbyś prowadzonym że jak zwykle, z go test, a niepowodzenie w tej kontroli będzie opisana jako:

---------------------------------------------------------------------- 
FAIL: foo_test.go:34: Suite.TestFoo 

all_test.go:34: 
    // If this succeeds the world is doomed. 
    c.Assert("line 1\nline 2", gocheck.Equals, "line 3") 
... obtained string = "" + 
...  "line 1\n" + 
...  "line 2" 
... expected string = "line 3" 

Zobacz, jak komentarz tuż nad kodem został uwzględniony w zgłoszonej usterce.

Dostępnych jest również wiele innych typowych funkcji, takich jak konfiguracja i odradzanie programów związanych z pakietami i testami, i tak dalej. Więcej informacji na stronie internetowej.

Jest dobrze utrzymany, ponieważ ja i inni ludzie używamy go w wielu aktywnych projektach, więc zachęcamy do przyłączenia się na pokładzie lub do sprawdzenia innych podobnych projektów, które bardziej pasują do Twojego gustu.

Przykłady użycia gocheck, proszę spojrzeć na opakowaniach takich jak mgo, goyaml, goamz, pipe, vclock, juju (masywna podstawa kod), lpad, gozk, goetveld, tomb itp Również gocheck, udaje się przetestuj się. Załadowanie tego było całkiem zabawne.

+0

Czy zgadzasz się z innymi odbierającymi, że używanie takiego pakietu nie jest metodą ** na wynos? – froderik

+0

i fajnie! to sprawdzę! – froderik

+1

Nie, to tylko osobisty wybór głośno mówiony. Opracowałem gocheck lata temu i wiele razy nad niestabilną fazą implementacji języka rozmawiałem z programistami, aby zachować niezbędne funkcje do kontynuacji pracy gocheck. Nie używają go, ponieważ wolą coś innego, ale nigdy nie poprosili mnie, żebym przestał go używać. –

-1

Sposób idiomatyczny to sposób, w jaki jesteś powyżej. Nie musisz też logować żadnej wiadomości, jeśli nie chcesz.

Zgodnie z definicją GO FAQ:

Dlaczego nie ma ochotę twierdzeń?

Go nie zapewnia asercji. Są niezaprzeczalnie wygodne, ale naszym doświadczeniem jest to, że programiści używają ich jako kuli, aby uniknąć myślenia o prawidłowej obsłudze błędów i raportowaniu. Właściwy błąd oznacza, że ​​serwery kontynuują działanie po niepowodzeniu błędów zamiast awarii. Prawidłowe zgłaszanie błędów oznacza, że ​​błędy są bezpośrednio i do punktu, zapisując programistę z interpretacji dużego śladu po awariach w trybie . Dokładne błędy są szczególnie ważne, gdy programista widzący błędy nie jest zaznajomiony z kodem.

Rozumiemy, że jest to kwestia sporna. Istnieje wiele rzeczy w języku Go i bibliotekach, które różnią się od współczesnych praktyk , po prostu dlatego, że czasami warto wypróbować inne podejście.

UPDATE
podstawie aktualizacją, że nie jest idiomatyczne Go. To, co robisz, to w istocie projektowanie frameworka rozszerzeń testowych, aby odzwierciedlić to, co dostajesz w frameworkach XUnit. Chociaż z punktu widzenia inżynierii nie ma niczego zasadniczo złego, rodzi to pytania o wartość + koszt utrzymania tej biblioteki rozszerzeń. Dodatkowo tworzysz wewnętrzny standard, który potencjalnie będzie burzyć pióra. Największą zaletą Go jest to, że nie jest to C ani Java, C++ ani Python, a rzeczy powinny być wykonane tak, jak konstruuje się język.

+0

zobacz zaktualizowane pytanie – froderik

+0

@froderik zaktualizowano dla Ciebie :) – Woot4Moo

+7

Chociaż zdecydowanie zgadzam się, że standardowa biblioteka jest doskonałym odnośnikiem do dobrego kodu i zgadza się z wieloma zasadami stosowanymi przez zespół główny pod względem testowania, to nie jest Prawdą jest, że po prostu integrując pakiet pomocniczy do testowania, odchodzisz od idiomów Go. Jest to bezproduktywny poziom puryzmu i wielbienia. –

0

Odradzam pisania testu w sposób, w jaki wydaje się, że pragniesz. To nie przypadek, że cały stdlib używa, jak to nazwałeś, "gadatliwego" sposobu.

To jest niezaprzeczalnie więcej linii, ale jest kilka zalet tego podejścia.

Jeśli czytasz Why does Go not have assertions? i s/error handling/test failure reporting/g można uzyskać obraz dlaczego kilka „dochodzić” pakiety dla testowania Go nie są dobrym pomysłem w użyciu,

Po raz kolejny dowód jest ogromna baza kod stdlib.

+0

patrz zaktualizowane pytanie – froderik

+0

@froderik: Zespół Go, który napisał stdlib _nie używaj żadnych bibliotek assert/test. Powód był już omówiony. Niektórzy uważają stdlib za nieformalny przewodnik po stylu. Ci ludzie, tak jak i ja, uważają używanie bibliotek aser/test za zły styl, IOW, a nie Go. – zzzz

+6

Nie wydaje mi się, aby wpis w FAQ dotyczył funkcji assert, o której tu mowa. O tym, o czym najczęściej mówi się w FAQ, stanowią asercje kodu (produkcyjnego), które weryfikują coś w środowisku wykonawczym programu. Pytanie jednak dotyczy wykorzystania funkcji do potwierdzania wyników testu. – Kissaki

0

ale przy próbie zapisu testu jak wujek Martin, z jednej assert w nazwach testowych i długo funkcyjnych, to prosta biblioteka assert, jak http://github.com/stretchr/testify/assert może zrobić to znacznie szybciej i łatwiej

+2

"Ale" ?? Co pan myśli? Kim jest wujek martin? Co jest szybsze - kodowanie lub wykonanie? Jak to jest łatwiej? Aby pisać, czytać, rozumieć? – Kissaki