2015-07-11 2 views
12

Ich möchte einige Funktionen testen, die in meinem Hauptpaket enthalten sind, aber meine Tests scheinen nicht auf diese Funktionen zugreifen zu können.Wie testen Sie die wichtigsten Paketfunktionen in Golang?

Meine Probe main.go Datei wie folgt aussieht:

package main 

import (
    "log" 
) 

func main() { 
    log.Printf(foo()) 
} 

func foo() string { 
    return "Foo" 
} 

und meine main_test.go Datei wie folgt aussieht:

package main 

import (
    "testing" 
) 

func Foo(t testing.T) { 
    t.Error(foo()) 
} 

wenn ich go test main_test.go betreibe ich

# command-line-arguments 
.\main_test.go:8: undefined: foo 
FAIL command-line-arguments [build failed] 

Wie bekommen Ich verstehe, auch wenn ich die Testdatei an anderer Stelle verschoben und versucht habe, aus der main.go-Datei zu importieren, konnte ich nicht importieren es ist, da es package main ist.

Wie ist die korrekte Strukturierung solcher Tests? Sollte ich einfach alles aus dem main Paket entfernen, als eine einfache Hauptfunktion, um alles auszuführen und dann die Funktionen in ihrem eigenen Paket zu testen, oder gibt es eine Möglichkeit für mich, diese Funktionen während des Testens aus der Hauptdatei aufzurufen?

+0

Es gibt eine gute Video-Einführung in das Testpaket in diesem Video (bei 3m30s Start) [https://youtu.be/XCsL89YtqCs?t=3m30s] (https://youtu.be/XCsL89YtqCs?t=3m30s) – Aaron

+0

Ihre main() -Funktion (und idealerweise Ihr Pakethaupt als Ganzes) sollte nicht getestet werden: Es sollte ein "dummer" Endpunkt für eine Bibliothek oder Bibliotheken sein . Testen Sie diese. – elithrar

Antwort

6

Unit-Tests gehen nur so weit. Irgendwann müssen Sie das Programm tatsächlich ausführen. Dann testen Sie, dass es mit echten Inputs aus echten Quellen arbeitet und echte Outputs an echte Ziele liefert. Wirklich.

Wenn Sie eine Einheit testen möchten, verschieben Sie es aus dem Haupt().

10

, wenn Sie Dateien auf der Kommandozeile angeben, müssen Sie alle von ihnen angeben

Hier ist mein Lauf:

$ ls 
main.go  main_test.go 
$ go test *.go 
ok  command-line-arguments 0.003s 

Notiz, in meiner Version, lief ich sowohl mit main.go und main_test .go auf der Kommandozeile

auch Ihre _test Datei nicht ganz richtig ist, müssen Sie Ihre Testfunktion aufgerufen werden testXXX und nehmen einen Zeiger auf testing.T

Hier t er verändert verison:

package main 

import (
    "testing" 
) 

func TestFoo(t *testing.T) { 
    t.Error(foo()) 
} 

und die modifizierte Ausgabe:

$ go test *.go 
--- FAIL: TestFoo (0.00s) 
    main_test.go:8: Foo 
FAIL 
FAIL command-line-arguments 0.003s 
+5

Warum geben Sie überhaupt irgendwelche Dateien an, um sie zu testen? Nicht. –

+0

wahr, aber ich dachte mir, dass die Frage nach der Person ein wenig kämpft, und ich wollte das Problem nicht mit der Einstellung von GOPATH oder etwas Ähnlichem verwechseln. Mach "go test". würde funktionieren? (habe das vorher nicht außerhalb von GOPATH versucht) –

+0

Sie möchten nicht, dass Ihre Testdatei im Hauptpaket enthalten ist. Sie werden am Ende mit viel Code und Flaggen enden, die Sie nicht wollten, wenn Sie das tun. – CVVS

-1

ändern Paketnamen von Haupt zu foobar in beiden Quellen. Quelldateien unter src/foobar verschieben.

mkdir -p src/foobar 
mv main.go main_test.go src/foobar/ 

Stellen Sie sicher, dass GOPATH auf den Ordner festgelegt ist, in dem sich src/foobar befindet.

export GOPATH=`pwd -P` 

-Test mit

go test foobar 
+0

Die Antwort beantwortet die Frage nicht wirklich. Es ist nur ein kompliziertes Äquivalent zum Aufrufen von 'go test' ohne Angabe von Dateien. –

Verwandte Themen