{"id":80093,"date":"2021-08-16T11:21:18","date_gmt":"2021-08-16T09:21:18","guid":{"rendered":"https:\/\/jfrog.com\/?p=80093"},"modified":"2021-08-16T11:22:52","modified_gmt":"2021-08-16T09:22:52","slug":"top-go-modules-writing-unit-tests-with-testify","status":"publish","type":"post","link":"https:\/\/jfrog.com\/fr\/blog\/top-go-modules-writing-unit-tests-with-testify\/","title":{"rendered":"Principaux modules Go\u00a0: \u00c9criture de tests unitaires avec 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\/blog\/into-the-sunset-bintray-jcenter-gocenter-and-chartcenter\/&quot;}\uee10{&quot;1&quot;:193}\">MISE \u00c0 JOUR\u00a0: \u00c0 compter du 1er\u00a0mai\u00a02021, le d\u00e9p\u00f4t central GoCenter a \u00e9t\u00e9 mis hors service et toutes ses fonctionnalit\u00e9s seront obsol\u00e8tes. Pour en savoir plus sur la mise hors service des centres, lisez<a class=\"in-cell-link\" href=\"https:\/\/jfrog.com\/blog\/into-the-sunset-bintray-jcenter-gocenter-and-chartcenter\/\" target=\"_blank\" rel=\"noopener noreferrer\"> l&apos;article de blog sur la d\u00e9pr\u00e9ciation<\/a><\/span><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #808080\"><b>Chaque mois, GoCenter d\u00e9cerne aux modules les plus performants un <\/b><a style=\"color: #808080\" href=\"https:\/\/jfrog.com\/blog\/gocenter-badges-honor-amazing-go-modules\/\" target=\"_blank\" rel=\"noopener noreferrer\"><b>badge Gopher<\/b><\/a><b> qui reconna\u00eet leur r\u00e9ussite. Cet article mentionne quelques-uns de ces <\/b><a style=\"color: #808080\" href=\"https:\/\/github.com\/jfrog\/gocenter\/wiki\/Go-Badge-Awards\" target=\"_blank\" rel=\"noopener noreferrer\"><b>meilleurs modules<\/b><\/a><b> et leur utilisation dans Go.<\/b><\/span><\/p>\n<p><span style=\"font-weight: 400\">Tous les d\u00e9veloppeurs en ont vu, m\u00eame dans des programmes Golang bien structur\u00e9s\u00a0: des commentaires qui vous sugg\u00e8rent de ne pas toucher aux lignes de code, vu qu&apos;elles semblent fonctionner par magie. Ces avertissements nous rendent timides, car nous craignons de casser quelque chose. Mais les applications doivent changer, s\u2019am\u00e9liorer et innover.<\/span><\/p>\n<p><span style=\"font-weight: 400\">C\u2019est pour cela que les tests unitaires sont une partie essentielle du d\u00e9veloppement de logiciels. Ils aident les d\u00e9veloppeurs \u00e0 d\u00e9terminer si les petites parties de leur logiciel remplissent correctement la fonction pr\u00e9vue. Avec la quantit\u00e9 adapt\u00e9e de couverture de tests unitaires en place, les d\u00e9veloppeurs se sentent plus en confiance pour modifier leurs impl\u00e9mentations, et m\u00eame la r\u00e9usiner \u00e0 partir de z\u00e9ro. Ils savent en effet qu\u2019ils peuvent facilement v\u00e9rifier si la nouvelle version fonctionne toujours comme pr\u00e9vu.<\/span><\/p>\n<p><span style=\"font-weight: 400\">L\u2019importance des tests unitaires et d\u2019un ensemble solide d\u2019outils dans le m\u00eame langage augmente parall\u00e8lement \u00e0 la complexit\u00e9 des logiciels. Un code de test offrant une bonne couverture pouvant \u00eatre volumineux, il doit \u00eatre aussi lisible et facile \u00e0 maintenir que le code du produit, afin d&apos;encourager les d\u00e9veloppeurs \u00e0 l\u2019utiliser et \u00e0 en tirer parti.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Pour nos projets de communaut\u00e9 Go tels que GoCenter, nous utilisons beaucoup le module <\/span><span style=\"font-weight: 400\"><\/span>Testify<span style=\"font-weight: 400\">, tr\u00e8s appr\u00e9ci\u00e9. Il fournit un ensemble de packages Golang pour r\u00e9aliser des fonctions de test unitaire essentielles.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400\">Cet article vous montre comment vous pouvez utiliser les principales fonctionnalit\u00e9s de Testify pour \u00e9crire des tests unitaires dans Go, faciles \u00e0 lire et \u00e0 maintenir. Vous verrez \u00e0 quoi ressembleraient les tests unitaires avec l\u2019utilisation de Go uniquement, d\u00e9couvrirez les packages de Testify qui peuvent vous aider concernant la t\u00e2che effectu\u00e9e, puis le code r\u00e9sultant apr\u00e8s l\u2019adoption de Testify. Nous allons vous montrer quelques meilleures pratiques pour effectuer des assertions et \u00e9crire des mocks pour les d\u00e9pendances.<\/span><\/p>\n<h2><span style=\"font-weight: 400\">Testify\u00a0: Un \u00ab\u00a0Top Gopher\u00a0\u00bb<\/span><\/h2>\n<p><b>Testify<\/b><span style=\"font-weight: 400\"> est un ensemble de packages convivial pour les d\u00e9veloppeurs. Il poss\u00e8de plus de 11\u00a0000\u00a0\u00e9toiles sur GitHub et b\u00e9n\u00e9ficie d\u2019un excellent support communautaire. Testify \u00e9tend le cadre <code>de tests<\/code> l\u00e9ger de Go pour effectuer des assertions et des d\u00e9pendances fictives.<\/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\">Ces fonctionnalit\u00e9s, en plus de la confiance quotidienne de notre \u00e9quipe communautaire Go, expliquent en grande partie pourquoi le module Testify est reconnu en tant que <\/span><a href=\"https:\/\/jfrog.com\/blog\/gocenter-badges-honor-amazing-go-modules\/\" target=\"_blank\" rel=\"noopener noreferrer\"><span style=\"font-weight: 400\">\u00ab\u00a0Top Gopher\u00a0\u00bb dans GoCenter<\/span><\/a><span style=\"font-weight: 400\">. Si vous consultez les m\u00e9tadonn\u00e9es compl\u00e8tes de GoCenter sur le module Testify, <\/span>vous comprendrez pourquoi\u00a0:<\/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\">Le fichier <\/span><b>ReadMe <\/b><span style=\"font-weight: 400\">du module vous dirige vers une documentation compl\u00e8te. Nous pouvons en savoir plus sur le code du module via <\/span><a href=\"https:\/\/jfrog.com\/blog\/godoc-in-gocenter\/\" target=\"_blank\" rel=\"noopener noreferrer\"><b>l\u2019onglet GoDoc<\/b><span style=\"font-weight: 400\">, <\/span><\/a><span style=\"font-weight: 400\"><span style=\"font-weight: 400\">qui affiche la documentation g\u00e9n\u00e9r\u00e9e automatiquement sur les fonctions et plus encore.<\/span><\/span><\/li>\n<li style=\"font-weight: 400\">Les onglets <a href=\"https:\/\/jfrog.com\/blog\/gocenter-connects-go-modules-authors-with-consumers\/\" target=\"_blank\" rel=\"noopener noreferrer\"><b>Used By<\/b> et <b>Metrics<\/b> de GoCenter<\/a> montrent que ce module est tr\u00e8s appr\u00e9ci\u00e9 et fiable, avec de nombreux t\u00e9l\u00e9chargements, forks, contributeurs et utilisations par d\u2019autres <a href=\"https:\/\/jfrog.com\/blog\/go-modules-are-awesome-but-there-is-one-tiny-problem\/\">modules Go<\/a>.<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\">L&apos;<\/span><a href=\"https:\/\/jfrog.com\/blog\/gocenter-reveals-go-module-vulnerabilities-with-xray\/\" target=\"_blank\" rel=\"noopener noreferrer\"><b>onglet Security<\/b><\/a><span style=\"font-weight: 400\"> de GoCenter r\u00e9v\u00e8le \u00e9galement que la version actuelle de ce module et ses d\u00e9pendances ne pr\u00e9sentent pas de vuln\u00e9rabilit\u00e9 NVD connue, comme le confirme une <\/span><a href=\"https:\/\/jfrog.com\/xray-gocenter\/\" target=\"_blank\" rel=\"noopener noreferrer\"><span style=\"font-weight: 400\">analyse approfondie JFrog Xray<\/span><\/a><span style=\"font-weight: 400\">.<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\">Une Unit\u00e9 GoLang Simple<\/span><\/h2>\n<p><span style=\"font-weight: 400\">Pour commencer \u00e0 \u00e9crire les tests unitaires, nous avons tout d&apos;abord besoin d\u2019un composant \u00e0 tester. Pour cet exercice, nous allons utiliser la d\u00e9finition de service suivante\u00a0:<\/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\">Pour cette d\u00e9finition de service, nous avons une impl\u00e9mentation que nous souhaitons tester. L\u2019impl\u00e9mentation ob\u00e9it \u00e0 une logique m\u00e9tier pour d\u00e9terminer si un produit est r\u00e9servable ou non. L\u2019impl\u00e9mentation s&apos;appuie \u00e9galement sur un composant Objet d\u2019acc\u00e8s aux donn\u00e9es pour fournir des informations sur les produits. L\u2019impl\u00e9mentation doit r\u00e9ussir les cas de test simplifi\u00e9s suivants\u00a0:<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">L\u2019impl\u00e9mentation de service doit respecter la d\u00e9finition de service<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Les produits ajout\u00e9s au catalogue il y a plus de 1\u00a0an sont r\u00e9servables<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Les autres produits ne sont pas r\u00e9servables<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Les produits ne figurant pas dans le catalogue doivent provoquer une erreur de produit introuvable<\/span><\/li>\n<\/ul>\n<p><span style=\"font-weight: 400\">L\u2019impl\u00e9mentation du service ressemble \u00e0 ce qui suit\u00a0:<\/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\/\/ Get product information from database\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\/\/ Only products added more than 1 year ago to the catalog can be reserved\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\">Utilisation de Testify<\/span><\/h2>\n<p><span style=\"font-weight: 400\">Maintenant que nous disposons d\u2019un service simple, nous pouvons utiliser Testify pour cr\u00e9er des tests unitaires qui garantissent qu\u2019il fonctionne comme pr\u00e9vu.<\/span><\/p>\n<h3><span style=\"font-weight: 400\">Ex\u00e9cution d\u2019Assertions<\/span><\/h3>\n<p><span style=\"font-weight: 400\">Les t\u00e2ches les plus \u00e9l\u00e9mentaires effectu\u00e9es par les tests unitaires sont des assertions. Les assertions permettent g\u00e9n\u00e9ralement de v\u00e9rifier si les actions effectu\u00e9es par le test \u00e0 l\u2019aide d\u2019une entr\u00e9e d\u00e9termin\u00e9e produisent la sortie attendue. Elles peuvent \u00e9galement \u00eatre utilis\u00e9es pour v\u00e9rifier si les composants suivent les r\u00e8gles de conception souhait\u00e9es.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400\">En utilisant Go uniquement pour ex\u00e9cuter les assertions n\u00e9cessaires pour v\u00e9rifier si le premier cas de test est respect\u00e9 et si notre impl\u00e9mentation de service est initialis\u00e9e correctement, nous obtenons le code suivant\u00a0:<\/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{} \/\/ Ignorer le mock pour l&apos;instant\r\n\tproductServiceImpl := NewProductServiceImpl(&amp;productDaoMock)\r\n\r\n\t\/\/ Asserts ProductServiceImpl implements ProductService. Will break the compiler if it does not.\r\n\tvar _ service.ProductService = productServiceImpl\r\n\r\n\tif productServiceImpl == nil {\r\n\t\tt.Fatal(&quot;Product Service not initialized&quot;)\r\n\t}\r\n\r\n\tif productServiceImpl.productDAO == nil {\r\n\t\tt.Fatal(&quot;Product Service dependency not initialized&quot;)\r\n\t}\r\n}<\/span><\/pre>\n<\/div>\n<p><span style=\"font-weight: 400\">Pour aider avec les assertions, Testify fournit un package\u00a0 <\/span><code>github.com\/stretchr\/testify\/assert<\/code><span style=\"font-weight: 400\">. Ce package poss\u00e8de plusieurs m\u00e9thodes qui peuvent aider \u00e0 comparer les valeurs par rapport aux r\u00e9sultats attendus. Si nous rempla\u00e7ons nos comparaisons par ces m\u00e9thodes, nous obtenons le r\u00e9sultat suivant\u00a0:<\/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{} \/\/ Ignorer le mock pour l&apos;instant\r\n\tproductServiceImpl := NewProductServiceImpl(&amp;productDaoMock)\r\n\r\n\tif !assertions.Implements((*service.ProductService)(nil), new(ProductServiceImpl)) {\r\n\t\tt.Fatal(&quot;Product Service Implementation does not honor service definition&quot;)\r\n\t}\r\n\r\n\tif !assertions.NotNil(productServiceImpl, &quot;Product Service not initialized&quot;) {\r\n\t\tt.Fatal(&quot;Product Service not initialized&quot;)\r\n\t}\r\n\r\n\tif !assertions.NotNil(productServiceImpl.productDAO, &quot;Product Service dependency not initialized&quot;) {\r\n\t\tt.Fatal(&quot;Product Service dependency not initialized&quot;)\r\n\t}\r\n}<\/span><\/pre>\n<\/div>\n<p><span style=\"font-weight: 400\">En plus d\u2019aider avec les assertions, les packages Testify fournissent \u00e9galement une meilleure information lorsque l\u2019une de ces op\u00e9rations \u00e9choue. Par exemple, si nous avons oubli\u00e9 de d\u00e9finir le champ productDAO dans le constructeur d\u2019impl\u00e9mentation de service, nous obtenons l\u2019\u00e9chec de test suivant\u00a0:<\/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:      \tExpected value not to be nil.\r\n        \tTest:       \tTestNewProductServiceImpl\r\n        \tMessages:   \tProduct Service dependency not initialized\r\n    TestNewProductServiceImpl: product_service_impl_test.go:23: Product Service dependency not initialized\r\n--- FAIL: TestNewProductServiceImpl (0.00s)<\/pre>\n<p><span style=\"font-weight: 400\">Jusqu\u2019\u00e0 pr\u00e9sent, m\u00eame si nous disposons d\u2019une meilleure information et de m\u00e9thodes plus pratiques pour ex\u00e9cuter les assertions, nous ne pouvions pas r\u00e9duire la taille de notre test. Nous avons toujours un mod\u00e8le r\u00e9p\u00e9titif if-not-assertion-break, qui peut rendre plus difficile la lecture de notre code de test. Testify fournit un package pour faciliter ce point <\/span><code>github.com\/stretchr\/testify\/require<\/code><span style=\"font-weight: 400\">. Ce package poss\u00e8de les m\u00eames m\u00e9thodes d\u2019assertion fournies par le package d\u2019assertion, mais il interrompt le test imm\u00e9diatement lorsqu\u2019une assertion \u00e9choue. En introduisant ce package, nous obtenons le code de test suivant, plus court et plus facile \u00e0 lire\u00a0:<\/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{} \/\/ Ignorer le mock pour l&apos;instant\r\n\tproductServiceImpl := NewProductServiceImpl(&amp;productDaoMock)\r\n\r\n\tassertions.Implements((*service.ProductService)(nil), new(ProductServiceImpl), &quot;Product Service Implementation does not honor service definition&quot;)\r\n\tassertions.NotNil(productServiceImpl, &quot;Product Service not initialized&quot;)\r\n\tassertions.NotNil(productServiceImpl.productDAO, &quot;Product Service dependency not initialized&quot;)\r\n}<\/span><\/pre>\n<\/div>\n<p>&nbsp;<\/p>\n<h3><span style=\"font-weight: 400\">Mocking de D\u00e9pendances<\/span><\/h3>\n<p><span style=\"font-weight: 400\">Lors du test d\u2019un composant, nous devons id\u00e9alement l\u2019isoler compl\u00e8tement pour \u00e9viter d\u2019avoir des \u00e9checs ailleurs qui compromettraient nos tests. Cela est particuli\u00e8rement difficile lorsque le composant que nous voulons tester a des d\u00e9pendances sur d\u2019autres composants depuis diff\u00e9rentes couches de notre logiciel. Dans le sc\u00e9nario que nous utilisons ici, notre impl\u00e9mentation de service repose sur un composant de la couche DAO (Data Access Object, Objet d&apos;acc\u00e8s aux donn\u00e9es) pour acc\u00e9der aux informations sur les produits.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Pour promouvoir l\u2019isolation souhait\u00e9e, il est courant que les d\u00e9veloppeurs \u00e9crivent de fausses impl\u00e9mentations simplifi\u00e9es de ces d\u00e9pendances, \u00e0 utiliser pendant les tests. Ces fausses impl\u00e9mentations sont nomm\u00e9es mocks.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Nous pouvons cr\u00e9er une impl\u00e9mentation fictives du ProductDAO \u00e0 injecter dans l\u2019impl\u00e9mentation du service pour l\u2019ex\u00e9cution du test. L\u2019interface ProductDAO que notre mock doit impl\u00e9menter ressemble \u00e0 ce qui suit\u00a0:<\/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\">Pour permettre l\u2019ex\u00e9cution du test, il est n\u00e9cessaire que le mock fournisse un comportement compatible avec tous les cas de test que nous voulons valider. Sinon, nous ne pouvons pas atteindre la couverture de test souhait\u00e9e. En utilisant Go uniquement, notre cas de test avec le mock ressemblerait \u00e0 ce qui suit\u00a0:<\/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;Product created 2 years ago&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;Product recently created&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;Failed to check if product %v is reservable: %s&quot;, productId, err)\r\n\t\t}\r\n\r\n\t\tif reservable != expectedResult {\r\n\t\t\tt.Fatalf(&quot;Got wrong reservable info for product id %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;Got unexpected error result: %s&quot;, err)\r\n\t}\r\n}<\/span><\/pre>\n<\/div>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400\">Le principal probl\u00e8me avec l\u2019approche ci-dessus est que notre logique de cas de test est d\u00e9sormais distribu\u00e9e. Une partie de celle-ci est impl\u00e9ment\u00e9e dans le cas de test lui-m\u00eame, o\u00f9 nous envoyons des \u00e9v\u00e9nements au composant test\u00e9 et ex\u00e9cutons des assertions avec les r\u00e9sultats. L\u2019autre partie est impl\u00e9ment\u00e9e dans le mock, qui doit fournir un comportement compatible avec les tests r\u00e9alis\u00e9s par le cas de test. Il est facile de voir comment notre cas de test pourrait s\u2019interrompre, non pas en raison d\u2019un probl\u00e8me dans le test lui-m\u00eame, mais parce que le mock ne retourne pas les donn\u00e9es requises.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400\">Un autre probl\u00e8me qui peut le rendre encore plus frustrant est que nous partageons \u00e9galement le mock entre plusieurs cas de test. Il est possible que les modifications appliqu\u00e9es au mock pour qu&apos;il satisfasse un cas de test en interrompent d\u2019autres. Dans notre sc\u00e9nario, seuls 3\u00a0cas de test qui nous int\u00e9ressent, mais vous pouvez imaginer \u00e0 quel point cela pourrait devenir compliqu\u00e9 si nous avions des cas de test plus complexes. Diviser le mock en plusieurs mocks ne serait pas non plus forc\u00e9ment utile, et pourrait potentiellement aggraver la situation en r\u00e9pandant encore davantage la complexit\u00e9. De plus, si notre interface fictive change, nous devons mettre \u00e0 jour plusieurs mocks pour qu&apos;ils restent compatibles.<\/span><\/p>\n<p><span style=\"font-weight: 400\">Nous devons garder la logique du cas de test centralis\u00e9e et ind\u00e9pendante. Testify fournit un package pour faciliter ce point <\/span><code>github.com\/stretchr\/testify\/mock<\/code><span style=\"font-weight: 400\">. Ce package fournit des outils pour cr\u00e9er des mocks qui permettent d\u2019injecter le comportement dans l\u2019ex\u00e9cution, ce qui permet au cas de test de le faire. La logique fictive reste ainsi proche de la logique du test.<\/span><\/p>\n<p><span style=\"font-weight: 400\">En utilisant le package fictif Testify pour cr\u00e9er notre mock DAO et en d\u00e9pla\u00e7ant l\u2019initialisation du comportement fictif vers les cas de test, ainsi qu\u2019en ajoutant le package Testify requis pour ex\u00e9cuter nos assertions, notre code de test ressemble \u00e0 ce qui suit\u00a0:<\/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;Product created 2 years ago&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;Product recently created&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;Failed to check if product %v is reservable: %s&quot;, productId, err)\r\n\t\tassertions.Equalf(expectedResult, reservable,&quot;Got wrong reservable info for product id %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;Got unexpected error result: %s&quot;, err)\r\n\t}\r\n}<\/span><\/pre>\n<\/div>\n<p><span style=\"font-weight: 400\">Dans l\u2019impl\u00e9mentation ci-dessus, notez comment le comportement fictif et la logique de test sont tous deux centralis\u00e9s dans le cas de test. Notez \u00e9galement comment le comportement fictif enregistr\u00e9 est exclusif au cas de test o\u00f9 il est plac\u00e9, car il appartient \u00e0 une instance fictive unique qui n\u2019est pas partag\u00e9e entre plusieurs tests. Les tests enregistrent m\u00eame des comportements diff\u00e9rents pour l\u2019ID de produit\u00a01 sans aucun probl\u00e8me. ProductDaoTestifyMock peut \u00eatre r\u00e9utilis\u00e9 en toute s\u00e9curit\u00e9 entre plusieurs cas de test, car il n\u2019a aucun comportement.<\/span><\/p>\n<h2><span style=\"font-weight: 400\">Conclusion<\/span><\/h2>\n<p><span style=\"font-weight: 400\">J\u2019esp\u00e8re que vous avez trouv\u00e9 des informations utiles dans cet article et qu\u2019il pourra vous aider \u00e0 cr\u00e9er de meilleurs tests unitaires dans vos projets. Pour ajouter Testify \u00e0 votre projet \u00e0 l\u2019aide des modules Go et commencer \u00e0 vous amuser avec, ex\u00e9cutez simplement les commandes suivantes\u00a0:<\/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\">Consultez Testify sur GoCenter<\/span><span style=\"font-weight: 400\"> ou faites des recherches pour d\u00e9couvrir encore plus de modules Go tr\u00e8s int\u00e9ressants.<\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>MISE \u00c0 JOUR\u00a0: \u00c0 compter du 1er\u00a0mai\u00a02021, le d\u00e9p\u00f4t central GoCenter a \u00e9t\u00e9 mis hors service et toutes ses fonctionnalit\u00e9s seront obsol\u00e8tes. Pour en savoir plus sur la mise hors service des centres, lisez l&apos;article de blog sur la d\u00e9pr\u00e9ciation &nbsp; &nbsp; Chaque mois, GoCenter d\u00e9cerne aux modules les plus performants un badge Gopher qui &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":[9960,9397],"tags":[9402,9398,9399],"class_list":["post-80093","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-gestion-des-artefacts","category-go","tag-go-fr","tag-modules-go","tag-gocenter-fr"],"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>Utilisation du module Testify\u00a0Go pour les Tests Unitaires dans Golang | JFrog\u00a0GoCenter<\/title>\n<meta name=\"description\" content=\"D\u00e9couvrez comment utiliser Testify pour \u00e9crire des tests unitaires dans Golang faciles \u00e0 lire et \u00e0 g\u00e9rer. Nous allons vous montrer quelques meilleures pratiques pour effectuer des assertions et \u00e9crire des mocks pour les d\u00e9pendances.\" \/>\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\/fr\/wp-json\/wp\/v2\/posts\/80093\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Utilisation de Testify pour \u00e9crire des tests unitaires dans Go\" \/>\n<meta property=\"og:description\" content=\"Pleins feux sur quelques-uns des laur\u00e9ats Top Gopher dans JFrog GoCenter\u00a0! Comment utiliser Testify pour \u00e9crire des tests unitaires dans Go.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/jfrog.com\/fr\/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-08-16T09:21:18+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-08-16T09:22:52+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=\"Principaux modules Go\u00a0: \u00c9criture de tests unitaires avec Testify\" \/>\n<meta name=\"twitter:description\" content=\"Pleins feux sur quelques-uns des laur\u00e9ats Top Gopher dans JFrog GoCenter\u00a0! Comment utiliser Testify pour \u00e9crire des tests unitaires dans Go.\" \/>\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=\"13 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/jfrog.com\/fr\/blog\/top-go-modules-writing-unit-tests-with-testify\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/jfrog.com\/fr\/blog\/top-go-modules-writing-unit-tests-with-testify\/\"},\"author\":{\"name\":\"giannit\",\"@id\":\"https:\/\/jfrog.com\/fr\/#\/schema\/person\/b554ace14b37da5eed75bbfc7dd1c1af\"},\"headline\":\"Principaux modules Go\u00a0: \u00c9criture de tests unitaires avec Testify\",\"datePublished\":\"2021-08-16T09:21:18+00:00\",\"dateModified\":\"2021-08-16T09:22:52+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/jfrog.com\/fr\/blog\/top-go-modules-writing-unit-tests-with-testify\/\"},\"wordCount\":1881,\"publisher\":{\"@id\":\"https:\/\/jfrog.com\/fr\/#organization\"},\"image\":{\"@id\":\"https:\/\/jfrog.com\/fr\/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\",\"Modules Go\",\"gocenter\"],\"articleSection\":[\"Gestion des Artefacts\",\"Go\"],\"inLanguage\":\"fr-FR\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/jfrog.com\/fr\/blog\/top-go-modules-writing-unit-tests-with-testify\/\",\"url\":\"https:\/\/jfrog.com\/fr\/blog\/top-go-modules-writing-unit-tests-with-testify\/\",\"name\":\"Utilisation du module Testify\u00a0Go pour les Tests Unitaires dans Golang | JFrog\u00a0GoCenter\",\"isPartOf\":{\"@id\":\"https:\/\/jfrog.com\/fr\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/jfrog.com\/fr\/blog\/top-go-modules-writing-unit-tests-with-testify\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/jfrog.com\/fr\/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-08-16T09:21:18+00:00\",\"dateModified\":\"2021-08-16T09:22:52+00:00\",\"description\":\"D\u00e9couvrez comment utiliser Testify pour \u00e9crire des tests unitaires dans Golang faciles \u00e0 lire et \u00e0 g\u00e9rer. Nous allons vous montrer quelques meilleures pratiques pour effectuer des assertions et \u00e9crire des mocks pour les d\u00e9pendances.\",\"breadcrumb\":{\"@id\":\"https:\/\/jfrog.com\/fr\/blog\/top-go-modules-writing-unit-tests-with-testify\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/jfrog.com\/fr\/blog\/top-go-modules-writing-unit-tests-with-testify\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/jfrog.com\/fr\/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\/fr\/blog\/top-go-modules-writing-unit-tests-with-testify\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/jfrog.com\/fr\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Principaux modules Go\u00a0: \u00c9criture de tests unitaires avec Testify\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/jfrog.com\/fr\/#website\",\"url\":\"https:\/\/jfrog.com\/fr\/\",\"name\":\"JFrog\",\"description\":\"Deliver Trusted Software Releases at Speed and Scale\",\"publisher\":{\"@id\":\"https:\/\/jfrog.com\/fr\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/jfrog.com\/fr\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/jfrog.com\/fr\/#organization\",\"name\":\"JFrog\",\"url\":\"https:\/\/jfrog.com\/fr\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/jfrog.com\/fr\/#\/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\/fr\/#\/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\/fr\/#\/schema\/person\/b554ace14b37da5eed75bbfc7dd1c1af\",\"name\":\"giannit\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/jfrog.com\/fr\/#\/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":"Utilisation du module Testify\u00a0Go pour les Tests Unitaires dans Golang | JFrog\u00a0GoCenter","description":"D\u00e9couvrez comment utiliser Testify pour \u00e9crire des tests unitaires dans Golang faciles \u00e0 lire et \u00e0 g\u00e9rer. Nous allons vous montrer quelques meilleures pratiques pour effectuer des assertions et \u00e9crire des mocks pour les d\u00e9pendances.","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\/fr\/wp-json\/wp\/v2\/posts\/80093","og_locale":"fr_FR","og_type":"article","og_title":"Utilisation de Testify pour \u00e9crire des tests unitaires dans Go","og_description":"Pleins feux sur quelques-uns des laur\u00e9ats Top Gopher dans JFrog GoCenter\u00a0! Comment utiliser Testify pour \u00e9crire des tests unitaires dans Go.","og_url":"https:\/\/jfrog.com\/fr\/blog\/top-go-modules-writing-unit-tests-with-testify\/","og_site_name":"JFrog","article_publisher":"https:\/\/www.facebook.com\/artifrog","article_published_time":"2021-08-16T09:21:18+00:00","article_modified_time":"2021-08-16T09:22:52+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":"Principaux modules Go\u00a0: \u00c9criture de tests unitaires avec Testify","twitter_description":"Pleins feux sur quelques-uns des laur\u00e9ats Top Gopher dans JFrog GoCenter\u00a0! Comment utiliser Testify pour \u00e9crire des tests unitaires dans Go.","twitter_creator":"@jfrog","twitter_site":"@jfrog","twitter_misc":{"Written by":"giannit","Est. reading time":"13 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/jfrog.com\/fr\/blog\/top-go-modules-writing-unit-tests-with-testify\/#article","isPartOf":{"@id":"https:\/\/jfrog.com\/fr\/blog\/top-go-modules-writing-unit-tests-with-testify\/"},"author":{"name":"giannit","@id":"https:\/\/jfrog.com\/fr\/#\/schema\/person\/b554ace14b37da5eed75bbfc7dd1c1af"},"headline":"Principaux modules Go\u00a0: \u00c9criture de tests unitaires avec Testify","datePublished":"2021-08-16T09:21:18+00:00","dateModified":"2021-08-16T09:22:52+00:00","mainEntityOfPage":{"@id":"https:\/\/jfrog.com\/fr\/blog\/top-go-modules-writing-unit-tests-with-testify\/"},"wordCount":1881,"publisher":{"@id":"https:\/\/jfrog.com\/fr\/#organization"},"image":{"@id":"https:\/\/jfrog.com\/fr\/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","Modules Go","gocenter"],"articleSection":["Gestion des Artefacts","Go"],"inLanguage":"fr-FR"},{"@type":"WebPage","@id":"https:\/\/jfrog.com\/fr\/blog\/top-go-modules-writing-unit-tests-with-testify\/","url":"https:\/\/jfrog.com\/fr\/blog\/top-go-modules-writing-unit-tests-with-testify\/","name":"Utilisation du module Testify\u00a0Go pour les Tests Unitaires dans Golang | JFrog\u00a0GoCenter","isPartOf":{"@id":"https:\/\/jfrog.com\/fr\/#website"},"primaryImageOfPage":{"@id":"https:\/\/jfrog.com\/fr\/blog\/top-go-modules-writing-unit-tests-with-testify\/#primaryimage"},"image":{"@id":"https:\/\/jfrog.com\/fr\/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-08-16T09:21:18+00:00","dateModified":"2021-08-16T09:22:52+00:00","description":"D\u00e9couvrez comment utiliser Testify pour \u00e9crire des tests unitaires dans Golang faciles \u00e0 lire et \u00e0 g\u00e9rer. Nous allons vous montrer quelques meilleures pratiques pour effectuer des assertions et \u00e9crire des mocks pour les d\u00e9pendances.","breadcrumb":{"@id":"https:\/\/jfrog.com\/fr\/blog\/top-go-modules-writing-unit-tests-with-testify\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/jfrog.com\/fr\/blog\/top-go-modules-writing-unit-tests-with-testify\/"]}]},{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/jfrog.com\/fr\/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\/fr\/blog\/top-go-modules-writing-unit-tests-with-testify\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/jfrog.com\/fr\/"},{"@type":"ListItem","position":2,"name":"Principaux modules Go\u00a0: \u00c9criture de tests unitaires avec Testify"}]},{"@type":"WebSite","@id":"https:\/\/jfrog.com\/fr\/#website","url":"https:\/\/jfrog.com\/fr\/","name":"JFrog","description":"Deliver Trusted Software Releases at Speed and Scale","publisher":{"@id":"https:\/\/jfrog.com\/fr\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/jfrog.com\/fr\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"https:\/\/jfrog.com\/fr\/#organization","name":"JFrog","url":"https:\/\/jfrog.com\/fr\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/jfrog.com\/fr\/#\/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\/fr\/#\/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\/fr\/#\/schema\/person\/b554ace14b37da5eed75bbfc7dd1c1af","name":"giannit","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/jfrog.com\/fr\/#\/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\/fr\/wp-json\/wp\/v2\/posts\/80093","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jfrog.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jfrog.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jfrog.com\/fr\/wp-json\/wp\/v2\/users\/140"}],"replies":[{"embeddable":true,"href":"https:\/\/jfrog.com\/fr\/wp-json\/wp\/v2\/comments?post=80093"}],"version-history":[{"count":2,"href":"https:\/\/jfrog.com\/fr\/wp-json\/wp\/v2\/posts\/80093\/revisions"}],"predecessor-version":[{"id":80095,"href":"https:\/\/jfrog.com\/fr\/wp-json\/wp\/v2\/posts\/80093\/revisions\/80095"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/jfrog.com\/fr\/wp-json\/wp\/v2\/media\/64448"}],"wp:attachment":[{"href":"https:\/\/jfrog.com\/fr\/wp-json\/wp\/v2\/media?parent=80093"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jfrog.com\/fr\/wp-json\/wp\/v2\/categories?post=80093"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jfrog.com\/fr\/wp-json\/wp\/v2\/tags?post=80093"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}