{"id":80770,"date":"2021-09-01T18:38:26","date_gmt":"2021-09-01T16:38:26","guid":{"rendered":"https:\/\/jfrog.com\/?p=80770"},"modified":"2021-09-01T18:38:26","modified_gmt":"2021-09-01T16:38:26","slug":"top-go-modules-writing-unit-tests-with-testify","status":"publish","type":"post","link":"https:\/\/jfrog.com\/de\/blog\/top-go-modules-writing-unit-tests-with-testify\/","title":{"rendered":"Top Go-Module: Schreiben von Unit-Tests mit Testify"},"content":{"rendered":"<p><img decoding=\"async\" class=\"alignnone size-full wp-image-64438\" src=\"https:\/\/media.jfrog.com\/wp-content\/uploads\/2020\/09\/22144542\/TestifyBlog-03.png\" alt=\"\" width=\"863\" height=\"301\" srcset=\"https:\/\/speedmedia2.jfrog.com\/08612fe1-9391-4cf3-ac1a-6dd49c36b276\/media.jfrog.com\/wp-content\/uploads\/2020\/09\/22144542\/TestifyBlog-03.png?speedsize=w_863 863w, https:\/\/speedmedia2.jfrog.com\/08612fe1-9391-4cf3-ac1a-6dd49c36b276\/media.jfrog.com\/wp-content\/uploads\/2020\/09\/22144542\/TestifyBlog-03.png?speedsize=w_300 300w, https:\/\/speedmedia2.jfrog.com\/08612fe1-9391-4cf3-ac1a-6dd49c36b276\/media.jfrog.com\/wp-content\/uploads\/2020\/09\/22144542\/TestifyBlog-03.png?speedsize=w_768 768w\" sizes=\"(max-width: 863px) 100vw, 863px\" \/><\/p>\n<p><span data-sheets-value=\"{&quot;1&quot;:2,&quot;2&quot;:&quot;UPDATE: As of May 1, 2021 - GoCenter central repository has been sunset and all features will be deprecated. For more information on the sunsetting of the centers read the deprecation blog post&quot;}\" data-sheets-userformat=\"{&quot;2&quot;:1049089,&quot;3&quot;:{&quot;1&quot;:0},&quot;12&quot;:0,&quot;23&quot;:1}\" data-sheets-textstyleruns=\"{&quot;1&quot;:0}\uee10{&quot;1&quot;:171,&quot;2&quot;:{&quot;2&quot;:{&quot;1&quot;:2,&quot;2&quot;:1136076},&quot;9&quot;:1}}\" data-sheets-hyperlinkruns=\"{&quot;1&quot;:171,&quot;2&quot;:&quot;https:\/\/jfrog.com\/de\/blog\/into-the-sunset-bintray-jcenter-gocenter-and-chartcenter\/&quot;}\uee10{&quot;1&quot;:193}\">UPDATE: Am 1. Mai 2021 wird das zentrale Repository von GoCenter einschlie\u00dflich aller Funktionen eingestellt. Weitere Informationen zur Einstellung der Center finden Sie im<a class=\"in-cell-link\" href=\"https:\/\/jfrog.com\/de\/blog\/into-the-sunset-bintray-jcenter-gocenter-and-chartcenter\/\" target=\"_blank\" rel=\"noopener noreferrer\"> Blog-Beitrag zur Einstellung<\/a><\/span><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #808080\"><b>Jeden Monat verleiht GoCenter den leistungsst\u00e4rksten Modulen ein <\/b><a style=\"color: #808080\" href=\"https:\/\/jfrog.com\/de\/blog\/gocenter-badges-honor-amazing-go-modules\/\" target=\"_blank\" rel=\"noopener noreferrer\"><b>Gopher Badge<\/b><\/a><b> als Auszeichnung f\u00fcr ihre Leistung. Wir schreiben \u00fcber einige dieser <\/b><a style=\"color: #808080\" href=\"https:\/\/github.com\/jfrog\/gocenter\/wiki\/Go-Badge-Awards\" target=\"_blank\" rel=\"noopener noreferrer\"><b>Top-Module<\/b><\/a><b> und wie sie in Go verwendet werden.<\/b><\/span><\/p>\n<p><span style=\"font-weight: 400\">Jeder Entwickler hat sie schon gesehen, selbst in gut strukturierten Golang-Programmen: Kommentare, die vorschlagen, dass man sich von Codezeilen fernhalten sollte, da diese auf magische Weise zu funktionieren scheinen. Diese Warnungen machen uns \u00e4ngstlich, weil wir glauben, wir k\u00f6nnten etwas kaputt machen. Aber Anwendungen m\u00fcssen sich \u00e4ndern, um besser zu werden und innovativ zu sein.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Deshalb sind Unit-Tests ein wichtiger Bestandteil der Softwareentwicklung. Sie helfen den Entwicklern zu wissen, ob die kleinen Teile ihrer Software ihre vorgesehene Funktion korrekt erf\u00fcllen. Mit dem richtigen Umfang an Unit-Tests f\u00fchlen sich Entwickler sicherer, ihre Implementierungen zu \u00e4ndern und sogar von Grund auf neu zu refaktorisieren. Sie wissen dann n\u00e4mlich, dass sie leicht \u00fcberpr\u00fcfen k\u00f6nnen, ob die neue Version immer noch wie vorgesehen funktioniert.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Je komplexer die Software wird, desto wichtiger werden Unit-Tests, ebenso wie ein solider Satz von daf\u00fcr vorgesehenen Tools in der gleichen Sprache. Und da Testcode mit guter Abdeckung sehr umfangreich sein kann, muss er genauso lesbar und wartbar sein wie der Produktcode, damit Entwickler ihn verwenden und seine Vorteile nutzen.<\/span><\/p>\n<p><span style=\"font-weight: 400\">F\u00fcr unsere Go-Community-Projekte wie GoCenter nutzen wir ausgiebig das beliebte <\/span><span style=\"font-weight: 400\">Testify<\/span><span style=\"font-weight: 400\">-Modul, das eine Reihe von Golang-Paketen f\u00fcr die Durchf\u00fchrung wichtiger Unit-Test-Funktionen bereitstellt.<\/span><\/p>\n<p><span style=\"font-weight: 400\">In diesem Artikel erfahren Sie, wie Sie die wichtigsten Funktionen von Testify nutzen k\u00f6nnen, um Unit-Tests in Go zu schreiben, die einfach zu lesen und zu warten sind. Der Artikel beschreibt, wie Unit-Tests bei der Verwendung von reinem Go aussehen w\u00fcrden, wobei die Pakete von Testify vorgestellt werden, die bei der zu erledigenden Aufgabe helfen k\u00f6nnen. Anschlie\u00dfend sehen Sie den Code, der sich nach der Anwendung von Testify ergibt. Wir zeigen einige Best Practices, wie man Assertions durchf\u00fchrt und Mocks f\u00fcr Abh\u00e4ngigkeiten schreibt.<\/span><\/p>\n<h2><span style=\"font-weight: 400\">Testify: Ein Top-Gopher<\/span><\/h2>\n<p><b>Testify<\/b><span style=\"font-weight: 400\"> ist ein entwicklerfreundlicher Satz von Paketen mit \u00fcber 11.000 Sternen auf GitHub und gro\u00dfer Unterst\u00fctzung durch die Community. Testify erweitert das schlanke <code>Test<\/code> -Framework von Go, um Assertions und Mock-Abh\u00e4ngigkeiten durchzuf\u00fchren.<\/span><\/p>\n<div class=\"container\">\n<div class=\"row row-cols-1 row-cols-md-2\">\n<div class=\"col-sm\">\n<p><span style=\"font-weight: 400\">Diese Funktionen sowie das t\u00e4gliche Vertrauen unseres Go-Community-Teams darauf sind ein gro\u00dfer Teil der Gr\u00fcnde, warum das Testify-Modul als <\/span><a href=\"https:\/\/jfrog.com\/de\/blog\/gocenter-badges-honor-amazing-go-modules\/\" target=\"_blank\" rel=\"noopener noreferrer\"><span style=\"font-weight: 400\">&quot;Top-Gopher&quot; im GoCenter ausgezeichnet wurde<\/span><\/a><span style=\"font-weight: 400\">. Wenn Sie sich die umfangreichen Metadaten von GoCenter f\u00fcr das Testify-Modul ansehen, <\/span>wissen Sie, warum:<\/p>\n<\/div>\n<div class=\"col-sm\"><img decoding=\"async\" class=\"alignnone size-full wp-image-63885\" src=\"https:\/\/media.jfrog.com\/wp-content\/uploads\/2020\/09\/03205610\/Go-Badge.png\" alt=\"\" width=\"200\" height=\"60\" \/><\/div>\n<\/div>\n<\/div>\n<ul>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Die <\/span><b>ReadMe <\/b><span style=\"font-weight: 400\">des Moduls verweist Sie auf eine umfangreiche Dokumentation. Mehr Details \u00fcber den Code des Moduls erfahren wir \u00fcber die <\/span><a href=\"https:\/\/jfrog.com\/de\/blog\/godoc-in-gocenter\/\" target=\"_blank\" rel=\"noopener noreferrer\"><b>GoDoc<\/b><span style=\"font-weight: 400\">-Registerkarte<\/span><\/a><span style=\"font-weight: 400\"><span style=\"font-weight: 400\">, die eine automatisch generierte Dokumentation von Funktionen und mehr zeigt.<\/span><\/span><\/li>\n<li style=\"font-weight: 400\">Die <a href=\"https:\/\/jfrog.com\/de\/blog\/gocenter-connects-go-modules-authors-with-consumers\/\" target=\"_blank\" rel=\"noopener noreferrer\"><b>Used By<\/b>&#8211; und <b>Metrics<\/b>-Registerkarten<\/a> von GoCenter zeigen, dass dieses Modul angesichts vieler Downloads, Forks, Mitwirkenden und der Verwendung durch andere <a href=\"https:\/\/jfrog.com\/de\/blog\/go-modules-are-awesome-but-there-is-one-tiny-problem\/\">Go-Module<\/a> beliebt und weithin vertrauensw\u00fcrdig ist.<br \/>\n<img decoding=\"async\" class=\"alignnone size-large wp-image-64439\" src=\"https:\/\/media.jfrog.com\/wp-content\/uploads\/2020\/09\/22144634\/Testify-Metrics-1024x457.png\" alt=\"\" width=\"1024\" height=\"457\" srcset=\"https:\/\/speedmedia2.jfrog.com\/08612fe1-9391-4cf3-ac1a-6dd49c36b276\/media.jfrog.com\/wp-content\/uploads\/2020\/09\/22144634\/Testify-Metrics.png?speedsize=w_1024 1024w, https:\/\/speedmedia2.jfrog.com\/08612fe1-9391-4cf3-ac1a-6dd49c36b276\/media.jfrog.com\/wp-content\/uploads\/2020\/09\/22144634\/Testify-Metrics.png?speedsize=w_300 300w, https:\/\/speedmedia2.jfrog.com\/08612fe1-9391-4cf3-ac1a-6dd49c36b276\/media.jfrog.com\/wp-content\/uploads\/2020\/09\/22144634\/Testify-Metrics.png?speedsize=w_768 768w, https:\/\/speedmedia2.jfrog.com\/08612fe1-9391-4cf3-ac1a-6dd49c36b276\/media.jfrog.com\/wp-content\/uploads\/2020\/09\/22144634\/Testify-Metrics.png?speedsize=w_1454 1454w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/li>\n<li><span style=\"font-weight: 400\">Die <\/span><a href=\"https:\/\/jfrog.com\/de\/blog\/gocenter-reveals-go-module-vulnerabilities-with-xray\/\" target=\"_blank\" rel=\"noopener noreferrer\"><b>Security-Registerkarte<\/b><\/a><span style=\"font-weight: 400\"> von GoCenter zeigt auch, dass die aktuelle Version dieses Moduls und seiner Abh\u00e4ngigkeiten keine bekannten NVD-Schwachstellen aufweisen, was durch einen <\/span><a href=\"https:\/\/jfrog.com\/de\/xray-gocenter\/\" target=\"_blank\" rel=\"noopener noreferrer\"><span style=\"font-weight: 400\">JFrog Xray-Tiefenscan<\/span><\/a><span style=\"font-weight: 400\"> best\u00e4tigt wird.<br \/>\n<img decoding=\"async\" class=\"alignnone size-large wp-image-64440\" src=\"https:\/\/media.jfrog.com\/wp-content\/uploads\/2020\/09\/22144725\/Testify-Security-1024x210.png\" alt=\"\" width=\"1024\" height=\"210\" srcset=\"https:\/\/speedmedia2.jfrog.com\/08612fe1-9391-4cf3-ac1a-6dd49c36b276\/media.jfrog.com\/wp-content\/uploads\/2020\/09\/22144725\/Testify-Security.png?speedsize=w_1024 1024w, https:\/\/speedmedia2.jfrog.com\/08612fe1-9391-4cf3-ac1a-6dd49c36b276\/media.jfrog.com\/wp-content\/uploads\/2020\/09\/22144725\/Testify-Security.png?speedsize=w_300 300w, https:\/\/speedmedia2.jfrog.com\/08612fe1-9391-4cf3-ac1a-6dd49c36b276\/media.jfrog.com\/wp-content\/uploads\/2020\/09\/22144725\/Testify-Security.png?speedsize=w_768 768w, https:\/\/speedmedia2.jfrog.com\/08612fe1-9391-4cf3-ac1a-6dd49c36b276\/media.jfrog.com\/wp-content\/uploads\/2020\/09\/22144725\/Testify-Security.png?speedsize=w_1471 1471w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><br \/>\n<\/span><\/li>\n<\/ul>\n<h2><span style=\"font-weight: 400\">Eine einfache GoLang-Unit<\/span><\/h2>\n<p><span style=\"font-weight: 400\">Um mit dem Schreiben der Unit-Tests zu beginnen, ben\u00f6tigen wir zun\u00e4chst eine zu pr\u00fcfende Komponente. F\u00fcr diese \u00dcbung werden wir die folgende Dienstdefinition verwenden:<\/span><\/p>\n<div style=\"background: #272b33;overflow: auto;width: auto;border: solid gray;border-width: .1em .1em .1em .8em;padding: .2em .6em\">\n<pre style=\"margin: 0;line-height: 125%\"><span style=\"color: #999999\">type ProductService interface {\r\n\tIsProductReservable(id int) (bool, error)\r\n}<\/span><\/pre>\n<\/div>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400\">F\u00fcr diese Dienstdefinition haben wir eine Implementierung und wir wollen diese zu testen. Die Implementierung verf\u00fcgt \u00fcber einige Business-Logik, um zu bestimmen, ob ein Produkt reservierbar ist oder nicht. Die Implementierung h\u00e4ngt auch von einer Data Access Object-Komponente ab, um Informationen \u00fcber die Produkte bereitzustellen. Die Implementierung muss die folgenden vereinfachten Testf\u00e4lle bestehen:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Die Dienstimplementierung muss die Dienstdefinition beachten<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Produkte, die vor mehr als 1 Jahr in den Katalog aufgenommen wurden, sind reservierbar<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Andere Produkte sind nicht reservierbar<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Produkte, die nicht im Katalog enthalten sind, sollten einen&quot;Produkt nicht gefunden&quot;-Fehler verursachen<\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400\">Die Dienstimplementierung sieht wie folgt aus:<\/span><\/p>\n<div style=\"background: #272b33;overflow: auto;width: auto;border: solid gray;border-width: .1em .1em .1em .8em;padding: .2em .6em\">\n<pre style=\"margin: 0;line-height: 125%\"><span style=\"color: #999999\">type ProductServiceImpl struct {\r\n\tproductDAO persist.ProductDAO\r\n}\r\n\r\n\/\/ Constructor\r\nfunc NewProductServiceImpl(dao persist.ProductDAO) *ProductServiceImpl {\r\n\treturn &amp;ProductServiceImpl{\r\n\t\tproductDAO: dao,\r\n\t}\r\n}\r\n\r\nfunc (s *ProductServiceImpl) IsProductReservable(id int) (bool, error) {\r\n\t\/\/ Produktinformation aus Datenbank holen\r\n\tproduct, err := s.productDAO.GetProduct(id)\r\n\tif err != nil {\r\n\t\treturn false, fmt.Errorf(&quot;failed to get product details: %w&quot;, err)\r\n\t}\r\n\r\n\tif product == nil {\r\n\t\treturn false, fmt.Errorf(&quot;product not found for id %v&quot;, id)\r\n\t}\r\n\r\n\t\/\/ Nur Produkte, die vor mehr als 1 Jahr in den Katalog aufgenommen wurden, k\u00f6nnen reserviert werden\r\n\treturn product.CreatedAt.Before(time.Now().AddDate(-1, 0, 0)), nil\r\n}<\/span><\/pre>\n<\/div>\n<h2><span style=\"font-weight: 400\">Testify verwenden<\/span><\/h2>\n<p><span style=\"font-weight: 400\">Da wir nun einen einfachen Dienst haben, k\u00f6nnen wir mit Testify Unit-Tests erstellen, die gew\u00e4hrleisten, dass er wie vorgesehen funktioniert.<\/span><\/p>\n<h3><span style=\"font-weight: 400\">Assertions ausf\u00fchren<\/span><\/h3>\n<p><span style=\"font-weight: 400\">Die grundlegendsten Aufgaben, die von Unit-Tests ausgef\u00fchrt werden, sind Assertions. Assertions werden in der Regel verwendet, um zu \u00fcberpr\u00fcfen, ob die vom Test durchgef\u00fchrten Aktionen unter Verwendung bestimmter Eingaben das erwartete Ergebnis erzeugen. Sie k\u00f6nnen auch verwendet werden, um zu pr\u00fcfen, ob die Komponenten den gew\u00fcnschten Designregeln entsprechen. <\/span><\/p>\n<p><span style=\"font-weight: 400\">Wenn wir mit reinem Go die Assertions ausf\u00fchren, die ben\u00f6tigt werden, um zu pr\u00fcfen, ob der erste Testfall anerkannt und unsere Dienstimplementierung richtig initialisiert wird, erhalten wir den folgenden Code:<\/span><\/p>\n<div style=\"background: #272b33;overflow: auto;width: auto;border: solid gray;border-width: .1em .1em .1em .8em;padding: .2em .6em\">\n<pre style=\"margin: 0;line-height: 125%\"><span style=\"color: #999999\">import (\t\r\n\t&quot;service&quot;\r\n\t&quot;testing&quot;\r\n)\r\n\r\nfunc TestNewProductServiceImpl(t *testing.T) {\r\n\tproductDaoMock := ProductDaoMock{} \/\/ Mock vorerst ignorieren\r\n\tproductServiceImpl := NewProductServiceImpl(&amp;productDaoMock)\r\n\r\n\t\/\/ Sichert ProductServiceImpl zu implementiert ProductService. Bricht den Compiler ab, wenn er es nicht tut.\r\n\tvar _ service.ProductService = productServiceImpl\r\n\r\n\tif productServiceImpl == nil {\r\n\t\tt.Fatal(&quot;Produktdienst nicht initialisiert&quot;)\r\n\t}\r\n\r\n\tif productServiceImpl.productDAO == nil {\r\n\t\tt.Fatal(&quot;Produktdienst-Abh\u00e4ngigkeit nicht initialisiert&quot;)\r\n\t}\r\n}<\/span><\/pre>\n<\/div>\n<p><span style=\"font-weight: 400\">Als Hilfe f\u00fcr die Assertions enth\u00e4lt Testify das Paket <\/span><code>github.com\/stretchr\/testify\/assert<\/code><span style=\"font-weight: 400\">. Dieses Paket bietet mehrere Methoden, die helfen k\u00f6nnen, Werte mit erwarteten Ergebnissen zu vergleichen. Wenn wir unsere Vergleiche durch diese Methoden ersetzen, erhalten wir folgendes:<\/span><\/p>\n<div style=\"background: #272b33;overflow: auto;width: auto;border: solid gray;border-width: .1em .1em .1em .8em;padding: .2em .6em\">\n<pre style=\"margin: 0;line-height: 125%\"><span style=\"color: #999999\">import (\r\n\t&quot;github.com\/stretchr\/testify\/assert&quot;\r\n\t&quot;service&quot;\r\n\t&quot;testing&quot;\r\n)\r\n\r\nfunc TestNewProductServiceImpl(t *testing.T) {\r\n\tassertions := assert.New(t)\r\n\tproductDaoMock := ProductDaoMock{} \/\/ Mock vorerst ignorieren\r\n\tproductServiceImpl := NewProductServiceImpl(&amp;productDaoMock)\r\n\r\n\tif !assertions.Implements((*service.ProductService)(nil), new(ProductServiceImpl)) {\r\n\t\tt.Fatal(&quot;Produktdienst-Implementierung beachtet Dienstdefinition nicht&quot;)\r\n\t}\r\n\r\n\tif !assertions.NotNil(productServiceImpl, &quot;Produktdienst nicht initialisiert&quot;) {\r\n\t\tt.Fatal(&quot;Produktdienst nicht initialisiert&quot;)\r\n\t}\r\n\r\n\tif !assertions.NotNil(productServiceImpl.productDAO, &quot;Produktdienst-Abh\u00e4ngigkeit nicht initialisiert&quot;) {\r\n\t\tt.Fatal(&quot;Produktdienst-Abh\u00e4ngigkeit nicht initialisiert&quot;)\r\n\t}\r\n}<\/span><\/pre>\n<\/div>\n<p><span style=\"font-weight: 400\">Neben der Hilfe bei den Assertions bieten die Testify-Pakete auch eine bessere Benachrichtigung, wenn eine dieser Operationen fehlschl\u00e4gt. Wenn wir zum Beispiel vergessen haben, das productDAO-Feld im Konstruktor der Dienstimplementierung zu setzen, w\u00fcrden wir den folgenden Testfehler erhalten:<\/span><\/p>\n<pre style=\"background: #e0e0e0;padding-left: 20px\">=== RUN   TestNewProductServiceImpl\r\n    TestNewProductServiceImpl: product_service_impl_test.go:22:\r\n        \tError Trace:\tproduct_service_impl_test.go:22\r\n        \tError:      \tErwarteter Wert darf nicht Null sein.\r\n        \tTest:       \tTestNewProductServiceImpl\r\n        \tMeldungen:   \tProduktdienst-Abh\u00e4ngigkeit nicht initialisiert\r\n    TestNewProductServiceImpl: product_service_impl_test.go:23: Produktdienst-Abh\u00e4ngigkeit nicht initialisiert\r\n--- FAIL: TestNewProductServiceImpl (0.00s)<\/pre>\n<p><span style=\"font-weight: 400\">Bisher konnten wir trotz besserem Messaging und bequemerer Methoden zur Ausf\u00fchrung der Assertions den Umfang unseres Tests nicht reduzieren. Wir haben immer noch ein sich wiederholendes Muster von &quot;if-not-assertion-break&quot;, das es schwieriger machen kann, unseren Testcode zu lesen. Um dabei zu helfen, enth\u00e4lt Testify das Paket <\/span><code>github.com\/stretchr\/testify\/require<\/code><span style=\"font-weight: 400\">. Dieses Paket verf\u00fcgt \u00fcber die gleichen Assertion-Methoden wie das assert-Paket, bricht aber den Test sofort ab, wenn eine Assertion fehlschl\u00e4gt. Wenn wir dieses Paket einf\u00fchren, erhalten wir den folgenden k\u00fcrzeren und leichter zu lesenden Testcode:<\/span><\/p>\n<div style=\"background: #272b33;overflow: auto;width: auto;border: solid gray;border-width: .1em .1em .1em .8em;padding: .2em .6em\">\n<pre style=\"margin: 0;line-height: 125%\"><span style=\"color: #999999\">import (\r\n\t&quot;github.com\/stretchr\/testify\/require&quot;\r\n\t&quot;service&quot;\r\n\t&quot;testing&quot;\r\n)\r\n\r\nfunc TestNewProductServiceImpl(t *testing.T) {\r\n\tassertions := require.New(t)\r\n\r\n\tproductDaoMock := ProductDaoMock{} \/\/ Mock vorerst ignorieren\r\n\tproductServiceImpl := NewProductServiceImpl(&amp;productDaoMock)\r\n\r\n\tassertions.Implements((*service.ProductService)(nil), new(ProductServiceImpl), &quot;Produktdienst-Implementierung beachtet Dienstdefinition nicht&quot;)\r\n\tassertions.NotNil(productServiceImpl, &quot;Produktdienst nicht initialisiert&quot;)\r\n\tassertions.NotNil(productServiceImpl.productDAO, &quot;Produktdienst-Abh\u00e4ngigkeit nicht initialisiert&quot;)\r\n}<\/span><\/pre>\n<\/div>\n<p>&nbsp;<\/p>\n<h3><span style=\"font-weight: 400\">Mocking-Abh\u00e4ngigkeiten<\/span><\/h3>\n<p><span style=\"font-weight: 400\">Wenn wir eine Komponente testen, wollen wir sie im Idealfall vollst\u00e4ndig isolieren, um zu vermeiden, dass Fehler an anderer Stelle unsere Tests beeintr\u00e4chtigen. Dies ist besonders schwierig, wenn die Komponente, die wir testen wollen, Abh\u00e4ngigkeiten zu anderen Komponenten aus verschiedenen Schichten unserer Software hat. In dem hier verwendeten Szenario h\u00e4ngt unsere Dienstimplementierung von einer Komponente aus der Data Access Object (DAO)-Schicht ab, um auf Informationen \u00fcber die Produkte zuzugreifen.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Um die gew\u00fcnschte Isolation zu f\u00f6rdern, ist es \u00fcblich, dass Entwickler unechte, vereinfachte Implementierungen dieser Abh\u00e4ngigkeiten schreiben, die w\u00e4hrend der Tests verwendet werden. Diese unechten Implementierungen werden Mocks genannt.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Wir k\u00f6nnen eine Mock-Implementierung des ProductDAO erstellen, die in die Dienstimplementierung f\u00fcr die Testausf\u00fchrung injiziert wird. Die ProductDAO-Schnittstelle, die unser Mock implementieren muss, sieht wie folgt aus:<\/span><\/p>\n<div style=\"background: #272b33;overflow: auto;width: auto;border: solid gray;border-width: .1em .1em .1em .8em;padding: .2em .6em\">\n<pre style=\"margin: 0;line-height: 125%\"><span style=\"color: #999999\">type ProductDAO interface {\r\n\tGetProduct(id int) (*model.Product, error)\r\n}<\/span><\/pre>\n<\/div>\n<p><span style=\"font-weight: 400\">Um die Testausf\u00fchrung zu erm\u00f6glichen, ist es notwendig, dass der Mock ein Verhalten zeigt, das mit allen Testf\u00e4llen, die wir validieren wollen, kompatibel ist, da wir sonst nicht die gew\u00fcnschte Testabdeckung erreichen k\u00f6nnen. Mit reinem Go w\u00fcrde unser Testfall mit dem Mock wie folgt aussehen:<\/span><\/p>\n<div style=\"background: #272b33;overflow: auto;width: auto;border: solid gray;border-width: .1em .1em .1em .8em;padding: .2em .6em\">\n<pre style=\"margin: 0;line-height: 125%\"><span style=\"color: #999999\">import (\r\n\t&quot;errors&quot;\r\n\t&quot;model&quot;\r\n\t&quot;persist&quot;\r\n\t&quot;testing&quot;\r\n\t&quot;time&quot;\r\n)\r\n\r\ntype ProductDaoMock struct {\r\n}\r\n\r\nfunc (m *ProductDaoMock) GetProduct(id int) (*model.Product, error) {\r\n\tswitch id {\r\n\tcase 1:\r\n\t\treturn &amp;model.Product{\r\n\t\t\tId:          1,\r\n\t\t\tDescription: &quot;Produkt wurde vor 2 Jahren erstellt&quot;,\r\n\t\t\tCreatedAt:   time.Now().AddDate(-2, 0, 0),\r\n\t\t}, nil\r\n\tcase 2:\r\n\t\treturn &amp;model.Product{\r\n\t\t\tId:          2,\r\n\t\t\tDescription: &quot;Produkt k\u00fcrzlich erstellt&quot;,\r\n\t\t\tCreatedAt:   time.Now(),\r\n\t\t}, nil\r\n\tcase 999:\r\n\t\treturn nil, persist.ErrProductNotFound\r\n\t}\r\n\treturn nil, nil\r\n}\r\n\r\nfunc TestProductServiceImpl_IsProductReservable(t *testing.T) {\r\n\ttestDataSet := map[int]bool {\r\n\t\t1: true,\r\n\t\t2: false,\r\n\t}\r\n\r\n\tproductDaoMock := ProductDaoMock{}\r\n\tproductServiceImpl := NewProductServiceImpl(&amp;productDaoMock)\r\n\r\n\tfor productId, expectedResult := range testDataSet {\r\n\t\treservable, err := productServiceImpl.IsProductReservable(productId)\r\n\t\tif err != nil {\r\n\t\t\tt.Fatalf(&quot;Es konnte nicht gepr\u00fcft werden, ob Produkt %v reservierbar ist: %s&quot;, productId, err)\r\n\t\t}\r\n\r\n\t\tif reservable != expectedResult {\r\n\t\t\tt.Fatalf(&quot;Falsche Reservierungsinfo f\u00fcr Produkt-ID erhalten %v. Expected: %v. Got: %v&quot;, productId, expectedResult, reservable)\r\n\t\t}\r\n\t}\r\n}\r\n\r\nfunc TestProductServiceImpl_IsProductReservable_NotFound(t *testing.T) {\r\n\tproductDaoMock := ProductDaoMock{}\r\n\tproductServiceImpl := NewProductServiceImpl(&amp;productDaoMock)\r\n\r\n\t_, err := productServiceImpl.IsProductReservable(999)\r\n\tif !errors.Is(err, persist.ErrProductNotFound) {\r\n\t\tt.Fatalf(&quot;Unerwartetes Fehlerergebnis erhalten: %s&quot;, err)\r\n\t}\r\n}<\/span><\/pre>\n<\/div>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400\">Das Hauptproblem mit dem obigen Ansatz ist, dass unsere Testfalllogik nun verteilt ist. Ein Teil davon ist im Testfall selbst implementiert, wo wir Ereignisse an die getestete Komponente senden und Assertions mit den Ergebnissen ausf\u00fchren, w\u00e4hrend der andere Teil im Mock implementiert ist. Dieser wiederum muss ein Verhalten bereitstellen, das mit dem des Testfalls kompatibel ist. Es ist leicht zu erkennen, wie unser Testfall jetzt abgebrochen werden k\u00f6nnte, und zwar nicht wegen eines Problems im Test selbst, sondern weil der Mock nicht die erforderlichen Daten zur\u00fcckgibt. <\/span><\/p>\n<p><span style=\"font-weight: 400\">Ein weiteres Problem, das die Sache noch frustrierender machen kann, ist die Tatsache, dass wir den Mock auf mehrere Testf\u00e4lle verteilen. Es ist m\u00f6glich, dass \u00c4nderungen, die am Mock vorgenommen werden, um die Erfordernisse eines Testfalls zu erf\u00fcllen, andere Testf\u00e4lle zerst\u00f6ren. In unserem Szenario haben wir nur 3 Testf\u00e4lle, um die wir uns k\u00fcmmern. Sie k\u00f6nnen sich aber vorstellen, wie un\u00fcbersichtlich es werden k\u00f6nnte, wenn wir komplexere Testf\u00e4lle h\u00e4tten. Eine Aufteilung des Mocks in mehrere w\u00fcrde nicht unbedingt helfen, sondern k\u00f6nnte die Komplexit\u00e4t sogar noch erh\u00f6hen. Wenn sich unsere gemockte Schnittstelle \u00e4ndert, m\u00fcssten wir au\u00dferdem mehrere Mocks aktualisieren, um sie kompatibel zu halten.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Was wir brauchen, ist, dass die Testfalllogik zentralisiert und unabh\u00e4ngig bleibt. Um dabei zu helfen, enth\u00e4lt Testify das Paket <\/span><code>github.com\/stretchr\/testify\/mock<\/code><span style=\"font-weight: 400\">. Dieses Paket stellt Tools zur Verf\u00fcgung, um Mocks zu erstellen, die es erm\u00f6glichen, das Verhalten zur Laufzeit zu injizieren. Dabei sorgt der Testfall selbst daf\u00fcr, dass die gemockte Logik nahe an der Testlogik bleibt.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Durch die Verwendung des Testify-Mock-Pakets zur Erstellung unseres DAO-Mocks und das Verschieben der Initialisierung des Mock-Verhaltens in die Testf\u00e4lle sowie das Hinzuf\u00fcgen des Testify-Require-Pakets zur Ausf\u00fchrung unserer Assertions sieht unser Testcode wie folgt aus:<\/span><\/p>\n<div style=\"background: #272b33;overflow: auto;width: auto;border: solid gray;border-width: .1em .1em .1em .8em;padding: .2em .6em\">\n<pre style=\"margin: 0;line-height: 125%\"><span style=\"color: #999999\">import (\r\n      &quot;github.com\/stretchr\/testify\/require&quot;\r\n      &quot;github.com\/stretchr\/testify\/mock&quot;\r\n\t&quot;errors&quot;\r\n\t&quot;model&quot;\r\n\t&quot;persist&quot;\t\r\n\t&quot;testing&quot;\r\n\t&quot;time&quot;\r\n)\r\n\r\ntype ProductDaoTestifyMock struct {\r\n\tmock.Mock\r\n}\r\n\r\nfunc (m *ProductDaoTestifyMock) GetProduct(id int) (*model.Product, error) {\r\n\targs := m.Called(id)\r\n\treturn args.Get(0).(*model.Product), args.Error(1)\r\n}\r\n\r\nfunc TestProductServiceImpl_IsProductReservable(t *testing.T) {\r\n\tassertions := require.New(t)\r\n\r\n\t\/\/ Register test mocks\r\n\tproductDaoMock := ProductDaoTestifyMock{}\r\n\tproductDaoMock.On(&quot;GetProduct&quot;, 1).Return(&amp;model.Product{\r\n\t\tId:          1,\r\n\t\tDescription: &quot;Produkt wurde vor 2 Jahren erstellt&quot;,\r\n\t\tCreatedAt:   time.Now().AddDate(-2, 0, 0),\t\t\r\n\t}, nil)\r\n\tproductDaoMock.On(&quot;GetProduct&quot;, 2).Return(&amp;model.Product{\r\n\t\tId:          2,\r\n\t\tDescription: &quot;Produkt k\u00fcrzlich erstellt&quot;,\r\n\t\tCreatedAt:   time.Now(),\r\n\t}, nil)\r\n\r\n\ttestDataSet := map[int]bool {\r\n\t\t1: true,\r\n\t\t2: false,\r\n\t}\r\n\r\n\tproductServiceImpl := NewProductServiceImpl(&amp;productDaoMock)\r\n\r\n\tfor productId, expectedResult := range testDataSet {\r\n\t\treservable, err := productServiceImpl.IsProductReservable(productId)\r\n\t\tassertions.NoErrorf(err, &quot;Konnte nicht pr\u00fcfen, ob Produkt %v reservierbar ist: %s&quot;, productId, err)\r\n\t\tassertions.Equalf(expectedResult, reservable, &quot;Falsche Reservierungsinfo f\u00fcr Produkt-ID erhalten %v&quot;, productId)\r\n\t}\r\n}\r\n\r\nfunc TestProductServiceImpl_IsProductReservable_NotFound(t *testing.T) {\r\n\tassertions := require.New(t)\r\n\r\n\t\/\/ Register test mocks\r\n\tproductDaoMock := ProductDaoTestifyMock{}\r\n\tproductDaoMock.On(&quot;GetProduct&quot;, 1).Return((*model.Product)(nil), persist.ErrProductNotFound)\r\n\r\n\tproductServiceImpl := NewProductServiceImpl(&amp;productDaoMock)\r\n\r\n\t_, err := productServiceImpl.IsProductReservable(1)\r\n\r\n\tif !errors.Is(err, persist.ErrProductNotFound) {\r\n\t\tassertions.Failf(&quot;Got unexpected error result&quot;, &quot;Unerwartetes Fehlerergebnis erhalten: %s&quot;, err)\r\n\t}\r\n}<\/span><\/pre>\n<\/div>\n<p><span style=\"font-weight: 400\">In der obigen Implementierung sehen Sie, wie das Mock-Verhalten und die Testlogik innerhalb des Testfalls zentralisiert sind. Beachten Sie auch, dass das erfasste Scheinverhalten ausschlie\u00dflich f\u00fcr den Testfall gilt, in dem es platziert ist, da es zu einer einzelnen Mock-Instanz geh\u00f6rt, die nicht von mehreren Tests gemeinsam genutzt wird. Die Tests erfassen ohne jegliche Probleme sogar unterschiedliche Verhaltensweisen f\u00fcr die Produkt-ID 1. ProductDaoTestifyMock kann sicher zwischen mehreren Testf\u00e4llen wiederverwendet werden, da es kein Verhalten hat.<\/span><\/p>\n<h2><span style=\"font-weight: 400\">Fazit<\/span><\/h2>\n<p><span style=\"font-weight: 400\">Ich hoffe, Sie haben n\u00fctzliche Informationen in diesem Artikel gefunden und ich hoffe, dass er Ihnen helfen kann, bessere Unit-Tests in Ihren Projekten zu schreiben. Um Testify mit Go-Modulen zu Ihrem Projekt hinzuzuf\u00fcgen und damit zu spielen, f\u00fchren Sie einfach die folgenden Befehle aus:<\/span><\/p>\n<pre style=\"background: #e0e0e0;padding-left: 20px\">$ export GOPROXY=https:\/\/gocenter.io\r\n$ go get github.com\/stretchr\/testify<\/pre>\n<p><span style=\"font-weight: 400\">Sehen Sie sich Testify auf GoCenter an<\/span><span style=\"font-weight: 400\"> oder suchen Sie, um noch mehr tolle Go-Module zu entdecken.<\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>UPDATE: Am 1. Mai 2021 wird das zentrale Repository von GoCenter einschlie\u00dflich aller Funktionen eingestellt. Weitere Informationen zur Einstellung der Center finden Sie im Blog-Beitrag zur Einstellung &nbsp; &nbsp; Jeden Monat verleiht GoCenter den leistungsst\u00e4rksten Modulen ein Gopher Badge als Auszeichnung f\u00fcr ihre Leistung. Wir schreiben \u00fcber einige dieser Top-Module und wie sie in Go &hellip;<\/p>\n","protected":false},"author":140,"featured_media":64448,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[9969,9436],"tags":[9439,9437,9438],"class_list":["post-80770","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-artefakt-management","category-go-de","tag-go-de","tag-go-module","tag-gocenter-de"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v22.6 (Yoast SEO v22.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Das Testify Go-Modul f\u00fcr Unit-Tests in Golang verwenden | JFrog GoCenter<\/title>\n<meta name=\"description\" content=\"Lernen Sie, wie Sie mit Testify Unit-Tests in Golang schreiben k\u00f6nnen, die einfach zu lesen und zu warten sind. Wir zeigen einige Best Practices, wie man Assertions durchf\u00fchrt und Mocks f\u00fcr Abh\u00e4ngigkeiten schreibt.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/jfrog.com\/de\/wp-json\/wp\/v2\/posts\/80770\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Testify zum Schreiben von Unit-Tests in Go verwenden\" \/>\n<meta property=\"og:description\" content=\"Vorhang auf f\u00fcr einige der Top-Gopher-Preistr\u00e4ger im JFrog GoCenter! Wie man Testify verwendet, um Unit-Tests in Go zu schreiben.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/jfrog.com\/de\/blog\/top-go-modules-writing-unit-tests-with-testify\/\" \/>\n<meta property=\"og:site_name\" content=\"JFrog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/artifrog\" \/>\n<meta property=\"article:published_time\" content=\"2021-09-01T16:38:26+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/media.jfrog.com\/wp-content\/uploads\/2020\/09\/22153736\/TestifyBlog-01.png\" \/>\n<meta name=\"author\" content=\"giannit\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:title\" content=\"Top Go-Module: Schreiben von Unit-Tests mit Testify\" \/>\n<meta name=\"twitter:description\" content=\"Vorhang auf f\u00fcr einige der Top-Gopher-Preistr\u00e4ger im JFrog GoCenter! Wie man Testify verwendet, um Unit-Tests in Go zu schreiben.\" \/>\n<meta name=\"twitter:creator\" content=\"@jfrog\" \/>\n<meta name=\"twitter:site\" content=\"@jfrog\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"giannit\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/jfrog.com\/de\/blog\/top-go-modules-writing-unit-tests-with-testify\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/jfrog.com\/de\/blog\/top-go-modules-writing-unit-tests-with-testify\/\"},\"author\":{\"name\":\"giannit\",\"@id\":\"https:\/\/jfrog.com\/de\/#\/schema\/person\/b554ace14b37da5eed75bbfc7dd1c1af\"},\"headline\":\"Top Go-Module: Schreiben von Unit-Tests mit Testify\",\"datePublished\":\"2021-09-01T16:38:26+00:00\",\"dateModified\":\"2021-09-01T16:38:26+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/jfrog.com\/de\/blog\/top-go-modules-writing-unit-tests-with-testify\/\"},\"wordCount\":1586,\"publisher\":{\"@id\":\"https:\/\/jfrog.com\/de\/#organization\"},\"image\":{\"@id\":\"https:\/\/jfrog.com\/de\/blog\/top-go-modules-writing-unit-tests-with-testify\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/speedmedia2.jfrog.com\/08612fe1-9391-4cf3-ac1a-6dd49c36b276\/media.jfrog.com\/wp-content\/uploads\/2020\/09\/22153713\/TestifyBlog-04.png\",\"keywords\":[\"Go\",\"Go-Module\",\"gocenter\"],\"articleSection\":[\"Artefakt-Management\",\"Go\"],\"inLanguage\":\"de-DE\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/jfrog.com\/de\/blog\/top-go-modules-writing-unit-tests-with-testify\/\",\"url\":\"https:\/\/jfrog.com\/de\/blog\/top-go-modules-writing-unit-tests-with-testify\/\",\"name\":\"Das Testify Go-Modul f\u00fcr Unit-Tests in Golang verwenden | JFrog GoCenter\",\"isPartOf\":{\"@id\":\"https:\/\/jfrog.com\/de\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/jfrog.com\/de\/blog\/top-go-modules-writing-unit-tests-with-testify\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/jfrog.com\/de\/blog\/top-go-modules-writing-unit-tests-with-testify\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/speedmedia2.jfrog.com\/08612fe1-9391-4cf3-ac1a-6dd49c36b276\/media.jfrog.com\/wp-content\/uploads\/2020\/09\/22153713\/TestifyBlog-04.png\",\"datePublished\":\"2021-09-01T16:38:26+00:00\",\"dateModified\":\"2021-09-01T16:38:26+00:00\",\"description\":\"Lernen Sie, wie Sie mit Testify Unit-Tests in Golang schreiben k\u00f6nnen, die einfach zu lesen und zu warten sind. Wir zeigen einige Best Practices, wie man Assertions durchf\u00fchrt und Mocks f\u00fcr Abh\u00e4ngigkeiten schreibt.\",\"breadcrumb\":{\"@id\":\"https:\/\/jfrog.com\/de\/blog\/top-go-modules-writing-unit-tests-with-testify\/#breadcrumb\"},\"inLanguage\":\"de-DE\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/jfrog.com\/de\/blog\/top-go-modules-writing-unit-tests-with-testify\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de-DE\",\"@id\":\"https:\/\/jfrog.com\/de\/blog\/top-go-modules-writing-unit-tests-with-testify\/#primaryimage\",\"url\":\"https:\/\/speedmedia2.jfrog.com\/08612fe1-9391-4cf3-ac1a-6dd49c36b276\/media.jfrog.com\/wp-content\/uploads\/2020\/09\/22153713\/TestifyBlog-04.png\",\"contentUrl\":\"https:\/\/speedmedia2.jfrog.com\/08612fe1-9391-4cf3-ac1a-6dd49c36b276\/media.jfrog.com\/wp-content\/uploads\/2020\/09\/22153713\/TestifyBlog-04.png\",\"width\":204,\"height\":148,\"caption\":\"blog\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/jfrog.com\/de\/blog\/top-go-modules-writing-unit-tests-with-testify\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/jfrog.com\/de\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Top Go-Module: Schreiben von Unit-Tests mit Testify\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/jfrog.com\/de\/#website\",\"url\":\"https:\/\/jfrog.com\/de\/\",\"name\":\"JFrog\",\"description\":\"Deliver Trusted Software Releases at Speed and Scale\",\"publisher\":{\"@id\":\"https:\/\/jfrog.com\/de\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/jfrog.com\/de\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"de-DE\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/jfrog.com\/de\/#organization\",\"name\":\"JFrog\",\"url\":\"https:\/\/jfrog.com\/de\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de-DE\",\"@id\":\"https:\/\/jfrog.com\/de\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/speedmedia2.jfrog.com\/08612fe1-9391-4cf3-ac1a-6dd49c36b276\/media.jfrog.com\/wp-content\/uploads\/2025\/05\/27095207\/Logo.svg\",\"contentUrl\":\"https:\/\/speedmedia2.jfrog.com\/08612fe1-9391-4cf3-ac1a-6dd49c36b276\/media.jfrog.com\/wp-content\/uploads\/2025\/05\/27095207\/Logo.svg\",\"width\":74,\"height\":73,\"caption\":\"JFrog\"},\"image\":{\"@id\":\"https:\/\/jfrog.com\/de\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/artifrog\",\"https:\/\/x.com\/jfrog\",\"https:\/\/www.linkedin.com\/company\/455737\",\"https:\/\/www.youtube.com\/channel\/UCh2hNg76zo3d1qQqTWIQxDg\",\"https:\/\/www.wikidata.org\/wiki\/Q98608948\"],\"description\":\"We set out on our Liquid Software journey in 2008, with the mission to transform the way enterprises manage and release software updates. The world expects software to update continuously, securely, non-intrusively and without user intervention. This hyper-connected experience can only be enabled by automation with an end-to-end DevOps platform and a binary-centric focus. With this in mind, we\u2019ve developed the JFrog Platform, ushering in a new era of DevOps and DevSecOps standards that power continuous updates. More than a decade after our founding, with thousands of customers and millions of users globally, JFrog has become the \u201cDatabase of DevOps\u201d and the de-facto standard in release and update management.\",\"legalName\":\"Jfrog, Inc.\",\"numberOfEmployees\":{\"@type\":\"QuantitativeValue\",\"minValue\":\"1001\",\"maxValue\":\"5000\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/jfrog.com\/de\/#\/schema\/person\/b554ace14b37da5eed75bbfc7dd1c1af\",\"name\":\"giannit\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de-DE\",\"@id\":\"https:\/\/jfrog.com\/de\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/fca3c188acf34ea94b72429eb16d496a8d0b50af476289bb5f51c8283e5c5b1c?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/fca3c188acf34ea94b72429eb16d496a8d0b50af476289bb5f51c8283e5c5b1c?s=96&d=mm&r=g\",\"caption\":\"giannit\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Das Testify Go-Modul f\u00fcr Unit-Tests in Golang verwenden | JFrog GoCenter","description":"Lernen Sie, wie Sie mit Testify Unit-Tests in Golang schreiben k\u00f6nnen, die einfach zu lesen und zu warten sind. Wir zeigen einige Best Practices, wie man Assertions durchf\u00fchrt und Mocks f\u00fcr Abh\u00e4ngigkeiten schreibt.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/jfrog.com\/de\/wp-json\/wp\/v2\/posts\/80770","og_locale":"de_DE","og_type":"article","og_title":"Testify zum Schreiben von Unit-Tests in Go verwenden","og_description":"Vorhang auf f\u00fcr einige der Top-Gopher-Preistr\u00e4ger im JFrog GoCenter! Wie man Testify verwendet, um Unit-Tests in Go zu schreiben.","og_url":"https:\/\/jfrog.com\/de\/blog\/top-go-modules-writing-unit-tests-with-testify\/","og_site_name":"JFrog","article_publisher":"https:\/\/www.facebook.com\/artifrog","article_published_time":"2021-09-01T16:38:26+00:00","og_image":[{"url":"https:\/\/media.jfrog.com\/wp-content\/uploads\/2020\/09\/22153736\/TestifyBlog-01.png"}],"author":"giannit","twitter_card":"summary_large_image","twitter_title":"Top Go-Module: Schreiben von Unit-Tests mit Testify","twitter_description":"Vorhang auf f\u00fcr einige der Top-Gopher-Preistr\u00e4ger im JFrog GoCenter! Wie man Testify verwendet, um Unit-Tests in Go zu schreiben.","twitter_creator":"@jfrog","twitter_site":"@jfrog","twitter_misc":{"Written by":"giannit","Est. reading time":"12 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/jfrog.com\/de\/blog\/top-go-modules-writing-unit-tests-with-testify\/#article","isPartOf":{"@id":"https:\/\/jfrog.com\/de\/blog\/top-go-modules-writing-unit-tests-with-testify\/"},"author":{"name":"giannit","@id":"https:\/\/jfrog.com\/de\/#\/schema\/person\/b554ace14b37da5eed75bbfc7dd1c1af"},"headline":"Top Go-Module: Schreiben von Unit-Tests mit Testify","datePublished":"2021-09-01T16:38:26+00:00","dateModified":"2021-09-01T16:38:26+00:00","mainEntityOfPage":{"@id":"https:\/\/jfrog.com\/de\/blog\/top-go-modules-writing-unit-tests-with-testify\/"},"wordCount":1586,"publisher":{"@id":"https:\/\/jfrog.com\/de\/#organization"},"image":{"@id":"https:\/\/jfrog.com\/de\/blog\/top-go-modules-writing-unit-tests-with-testify\/#primaryimage"},"thumbnailUrl":"https:\/\/speedmedia2.jfrog.com\/08612fe1-9391-4cf3-ac1a-6dd49c36b276\/media.jfrog.com\/wp-content\/uploads\/2020\/09\/22153713\/TestifyBlog-04.png","keywords":["Go","Go-Module","gocenter"],"articleSection":["Artefakt-Management","Go"],"inLanguage":"de-DE"},{"@type":"WebPage","@id":"https:\/\/jfrog.com\/de\/blog\/top-go-modules-writing-unit-tests-with-testify\/","url":"https:\/\/jfrog.com\/de\/blog\/top-go-modules-writing-unit-tests-with-testify\/","name":"Das Testify Go-Modul f\u00fcr Unit-Tests in Golang verwenden | JFrog GoCenter","isPartOf":{"@id":"https:\/\/jfrog.com\/de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/jfrog.com\/de\/blog\/top-go-modules-writing-unit-tests-with-testify\/#primaryimage"},"image":{"@id":"https:\/\/jfrog.com\/de\/blog\/top-go-modules-writing-unit-tests-with-testify\/#primaryimage"},"thumbnailUrl":"https:\/\/speedmedia2.jfrog.com\/08612fe1-9391-4cf3-ac1a-6dd49c36b276\/media.jfrog.com\/wp-content\/uploads\/2020\/09\/22153713\/TestifyBlog-04.png","datePublished":"2021-09-01T16:38:26+00:00","dateModified":"2021-09-01T16:38:26+00:00","description":"Lernen Sie, wie Sie mit Testify Unit-Tests in Golang schreiben k\u00f6nnen, die einfach zu lesen und zu warten sind. Wir zeigen einige Best Practices, wie man Assertions durchf\u00fchrt und Mocks f\u00fcr Abh\u00e4ngigkeiten schreibt.","breadcrumb":{"@id":"https:\/\/jfrog.com\/de\/blog\/top-go-modules-writing-unit-tests-with-testify\/#breadcrumb"},"inLanguage":"de-DE","potentialAction":[{"@type":"ReadAction","target":["https:\/\/jfrog.com\/de\/blog\/top-go-modules-writing-unit-tests-with-testify\/"]}]},{"@type":"ImageObject","inLanguage":"de-DE","@id":"https:\/\/jfrog.com\/de\/blog\/top-go-modules-writing-unit-tests-with-testify\/#primaryimage","url":"https:\/\/speedmedia2.jfrog.com\/08612fe1-9391-4cf3-ac1a-6dd49c36b276\/media.jfrog.com\/wp-content\/uploads\/2020\/09\/22153713\/TestifyBlog-04.png","contentUrl":"https:\/\/speedmedia2.jfrog.com\/08612fe1-9391-4cf3-ac1a-6dd49c36b276\/media.jfrog.com\/wp-content\/uploads\/2020\/09\/22153713\/TestifyBlog-04.png","width":204,"height":148,"caption":"blog"},{"@type":"BreadcrumbList","@id":"https:\/\/jfrog.com\/de\/blog\/top-go-modules-writing-unit-tests-with-testify\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/jfrog.com\/de\/"},{"@type":"ListItem","position":2,"name":"Top Go-Module: Schreiben von Unit-Tests mit Testify"}]},{"@type":"WebSite","@id":"https:\/\/jfrog.com\/de\/#website","url":"https:\/\/jfrog.com\/de\/","name":"JFrog","description":"Deliver Trusted Software Releases at Speed and Scale","publisher":{"@id":"https:\/\/jfrog.com\/de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/jfrog.com\/de\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"de-DE"},{"@type":"Organization","@id":"https:\/\/jfrog.com\/de\/#organization","name":"JFrog","url":"https:\/\/jfrog.com\/de\/","logo":{"@type":"ImageObject","inLanguage":"de-DE","@id":"https:\/\/jfrog.com\/de\/#\/schema\/logo\/image\/","url":"https:\/\/speedmedia2.jfrog.com\/08612fe1-9391-4cf3-ac1a-6dd49c36b276\/media.jfrog.com\/wp-content\/uploads\/2025\/05\/27095207\/Logo.svg","contentUrl":"https:\/\/speedmedia2.jfrog.com\/08612fe1-9391-4cf3-ac1a-6dd49c36b276\/media.jfrog.com\/wp-content\/uploads\/2025\/05\/27095207\/Logo.svg","width":74,"height":73,"caption":"JFrog"},"image":{"@id":"https:\/\/jfrog.com\/de\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/artifrog","https:\/\/x.com\/jfrog","https:\/\/www.linkedin.com\/company\/455737","https:\/\/www.youtube.com\/channel\/UCh2hNg76zo3d1qQqTWIQxDg","https:\/\/www.wikidata.org\/wiki\/Q98608948"],"description":"We set out on our Liquid Software journey in 2008, with the mission to transform the way enterprises manage and release software updates. The world expects software to update continuously, securely, non-intrusively and without user intervention. This hyper-connected experience can only be enabled by automation with an end-to-end DevOps platform and a binary-centric focus. With this in mind, we\u2019ve developed the JFrog Platform, ushering in a new era of DevOps and DevSecOps standards that power continuous updates. More than a decade after our founding, with thousands of customers and millions of users globally, JFrog has become the \u201cDatabase of DevOps\u201d and the de-facto standard in release and update management.","legalName":"Jfrog, Inc.","numberOfEmployees":{"@type":"QuantitativeValue","minValue":"1001","maxValue":"5000"}},{"@type":"Person","@id":"https:\/\/jfrog.com\/de\/#\/schema\/person\/b554ace14b37da5eed75bbfc7dd1c1af","name":"giannit","image":{"@type":"ImageObject","inLanguage":"de-DE","@id":"https:\/\/jfrog.com\/de\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/fca3c188acf34ea94b72429eb16d496a8d0b50af476289bb5f51c8283e5c5b1c?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/fca3c188acf34ea94b72429eb16d496a8d0b50af476289bb5f51c8283e5c5b1c?s=96&d=mm&r=g","caption":"giannit"}}]}},"_links":{"self":[{"href":"https:\/\/jfrog.com\/de\/wp-json\/wp\/v2\/posts\/80770","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jfrog.com\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jfrog.com\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jfrog.com\/de\/wp-json\/wp\/v2\/users\/140"}],"replies":[{"embeddable":true,"href":"https:\/\/jfrog.com\/de\/wp-json\/wp\/v2\/comments?post=80770"}],"version-history":[{"count":1,"href":"https:\/\/jfrog.com\/de\/wp-json\/wp\/v2\/posts\/80770\/revisions"}],"predecessor-version":[{"id":80773,"href":"https:\/\/jfrog.com\/de\/wp-json\/wp\/v2\/posts\/80770\/revisions\/80773"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/jfrog.com\/de\/wp-json\/wp\/v2\/media\/64448"}],"wp:attachment":[{"href":"https:\/\/jfrog.com\/de\/wp-json\/wp\/v2\/media?parent=80770"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jfrog.com\/de\/wp-json\/wp\/v2\/categories?post=80770"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jfrog.com\/de\/wp-json\/wp\/v2\/tags?post=80770"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}