Wenn ich eine Schnittstelle schreibe, ist es oft bequem, meine Tests im selben Paket wie die Schnittstelle zu definieren und dann mehrere Pakete zu definieren, die die Schnittstellengruppe implementieren, z.Wie kann ich eine gemeinsame Testsuite für mehrere Pakete in go haben?
package/
package/impl/x <-- Implementation X
package/impl/y <-- Implementation Y
Gibt es einen einfachen Weg, um die gleiche Testsuite (in diesem Fall befindet sich im Paket/* _ test.go) in den Unterpakete laufen?
Die beste Lösung, die ich mit so weit kommen habe, ist ein Testpaket hinzuzufügen:
package/tests/
, die die Test-Suite implementiert, und einen Test in jedem der Implementierungen die Tests laufen, aber dies zwei Nachteile hat:
1) die Tests in Paket/Tests sind nicht in _test.go Dateien, und einen Teil der tatsächlichen Bibliothek am Ende werden durch godoc dokumentiert usw.
2) die Tests in Paket/tests werden von einem benutzerdefinierten Test-Runner ausgeführt, der im Grunde alle duplizieren muss Funktionalität von 'go test', um nach Go-Tests zu suchen und sie auszuführen.
Scheint wie eine ziemlich klebrige Lösung.
Gibt es einen besseren Weg, dies zu tun?
Ja, das ist ziemlich genau das, was ich tue (mit var args, um die Impl liefern eine Setup-und Teardown-Funktion, wenn es will); Wie ich schon sagte, es ist ein bisschen nervig, dass die Funktionen in generierten go doc Ausgaben auftauchen, und einen 'Megatest' zu haben, der alle Untertests ausführt, lässt 'Test gehen' ewig auf diesem einen Gegenstand hängen (stimme zu all deine anderen Punkte tho). – Doug
@Doug Ich bevorzuge es, eine Struktur für Hilfsfunktionen und Daten zu verwenden; es ist viel sauberer und Sie können Null (der Standardwert für Zeiger) liefern, wenn es keine solche Funktion gibt. Möglicherweise möchten Sie auch einige Tests streichen, wenn [test.Short()] (http://golang.org/pkg/testing/#Short) festgelegt ist, und einige Testfälle entfernen, wenn dies der Fall ist. – fuz
@Doug BTW, was ist der Punkt, dass die Testfunktionen in der Dokumentation angezeigt werden? Sie können sie in ein anderes Paket verschieben (wie ich es vorgeschlagen habe), wenn sie die Dokumentation überladen. – fuz