顶级模块:Schreiben von Unit-Tests mit证物

更新:上午1点。Mai 2021 wind das zentrale Repository von GoCenter einschließlich aller Funktionen eingestellt。Weitere Informationen zur einstein中心发现了他博客-爱因斯坦之歌

Jeden Monat verleht GoCenter den leistungsstärksten模块金花鼠徽章Auszeichnung(德国):请原谅我,我的朋友们Top-Module在Go verwendet werden找到了我们。

杰德Entwickler帽子您肖恩gesehen, selbst肠道strukturierten Golang-Programmen: Kommentare, vorschlagen死去,没人西奇·冯·Codezeilen fernhalten sollte, da这auf magische怀斯祖茂堂funktionieren scheinen。Diese Warnungen机器运行ängstlich, weil wungen机器运行könnten, weil wungen机器运行könnten。Aber Anwendungen msssen siich ändern, um berser zuwerden and innovative zusein。

应在软件测试中使用标准的单元测试。我们帮助我们的软件开发人员,帮助我们的软件开发人员,帮助我们的功能开发人员,帮助我们的软件开发人员。在此基础上,建立了基于单元测试的系统,并在此基础上建立了基于单元测试的系统,在此基础上建立了基于单元测试的系统。Sie wissendann nämlich, dass Sie leicht berprefen können, ob die neue Version immer noch wie vorgesehen functioniert。

在软件世界,在单元测试世界,在软件世界,在软件世界,在软件世界,在软件世界,在软件世界,在软件世界。和da Testcode一样,Abdeckung sehr umfangreich sein kann, muss er genauso lesbar和wartbar在der productcode, damit Entwickler ihn verwenden和seine Vorteile nutzen。

我们的go - community - project (go - community - project)我们的go - center (go - community - project)将会为我们带来更大的信心作证-模块,das eine Reihe von Golang-Paketen f r die durchf hhrg - Unit-Test-Funktionen bereitstellt。

In diesem Artikel erfahren Sie, wie Sie die whichtigsten Funktionen von作证nutzen können, um unit tests In Go zu schreiben, die einfach zu lesen and zu warten sind。德国德国德国德国德国德国德国德国德国德国德国德国德国德国德国德国德国德国德国德国德国德国德国德国德国德国德国德国德国德国德国德国德国德国德国德国德国德国德国德国德国德国德国德国德国德国德国德国德国德国德国德国德国Anschließend sehen Sie den Code, der sich nach der Anwendung von证言。Wir zeigen einige最佳实践,Wir zeigen einige断言dchfhrt和mock f r Abhängigkeiten schreibt。

证人:Ein - Top-Gopher

作证ist ein entwicklerfreundlicher Satz von Paketen mit ber 11.000 Sternen auf GitHub and großer unterstung tzung durch die Community。我要作证,我要作证测试-框架von Go, um断言和Mock-Abhängigkeiten durchzuf hren。

disese funcktionen sowie das tägliche Vertrauen unseres Go-Community-Teams darauf sind in grode ßer Teil der grnde, warum das testify - modules“顶级gopher”在GoCenter ausgezeichnet wurde.[4] [1] [1] [1] [1] [1] [1]亲爱的,亲爱的。

  • 自述des模块是最先进的、最先进的、最先进的文档。Mehr Details ber den Code des modules erfahren wir ber dieGoDoc-Registerkarte,自动生成通用文档和文件大小。
  • 所使用的——和指标-Registerkartenvon GoCenter zeigen, dass dieses模块设计,视频下载,福克斯,Mitwirkenden和Verwendung durch andereGo-Module信仰和信仰在vertrauenswrdig列表中。
  • Security-Registerkartevon GoCenter的每一项重量,都有一个模块和过滤器Abhängigkeiten keine bekannten NVD-Schwachstellen aufweisenJFrog Xray-Tiefenscanbestatigt将。

einefacfacgolang - unit

在单元测试方面,benötigen与zunächst之间的关系。verwenden的翻译是:

类型Prohth华体会最新官方网站ductService接口{IsProductReservable(id int) (bool,错误)}

疾病的定义与疾病的实施、疾病的诊断、疾病的诊断有关。模块实现模块实现模块集成业务逻辑模块,即集成业务逻辑模块,在产品存储模块中实现。Die Implementierung hängt auch von einer Data Access object - componente ab, um Informationen Die produckte bereitzustellen。Die Implementierung muss Die folgenden vereinfachten Testfälle best hen:

  • Die dienstiplementung muss Die Dienstdefinition beachten
  • 产品:1 .产品:1 .产品:1 .产品:1 .产品:1 .产品:1 .产品:1 .产品:1 .产品:1
  • 安德雷产品夜间蓄水池
  • product, die night in catalog enthalsing, solingen“product night gefunden”-Fehler verursachen

Die dienstiplentingingingsight是什么?

type hth华体会最新官方网站ProductServiceImpl struct {productDAO持久化。ProductDAO} //构造函数func NewProductSerhth华体会最新官方网站viceImpl(dao persistent .ProductDAO) *ProductServiceImpl{返回&ProductServiceImpl{ProductDAO: dao,}} func (s *ProductServiceImpl) IsProductReservable(id int) (bool,错误){// productinformation aus Datenbank holen product, err:= s.productDAO.GetProduct(id)如果err != nil{返回false, fmt. ProductDAO . getproduct (id)。错误("未能获取产品详细信息:%w", err)}如果产品== nil{返回false, fmt。//返回product. createdat . before (time.Now())} //返回product. createdat . before (time.Now())。AddDate(-1, 0, 0)), nil}

verwenden作证

达我们修女einfachen Dienst您,能帮我们麻省理工学院作证单元测试erstellen, gewahrleisten死去,dass er是不是vorgesehen funktioniert。

断言ausfuhren

Die grundlegendsten Aufgaben, Die von Unit-Tests ausgefhrt werden, and断言。断言在der Regel verwendet, um zu berprefen, ob die vom Test durchgefhrten Aktionen under Verwendung bestestimmter Eingaben das Ergebnis erzeeugen。1 . see können auch verwendet werden, um zu profen, odie Komponenten den gewnschten designregen entprechen。

Wenn wir mit reinem Go die Assertions ausfhren, die benötigt werden, um zu prefen, obder erste Testfall anerkant和unsere dienstiplementerung richtialisierist wind, erhalten wir den folgenden代码:

import ("service" "testing") function TestNhth华体会最新官方网站ewProductServiceImpl(t *testing. t) {productDaoMock:= productDaoMock {} // Mock vererst ignoorieren productServiceImpl:= NewProductServiceImpl(&productDaoMock) // Sichert productServiceImpl zu implementiert ProductService。brichden编译器ab,当它是晚上的时候。Var服务。hth华体会最新官方网站如果productServiceImpl == nil {t.Fatal(" productdienst night initialisiert")}如果productServiceImpl。productDAO == nil {t.Fatal("Produktdienst-Abhängigkeit night initialisiert")}}

al Hilfe r die断言enthält作证das Paketgithub.com/stretchr/testify/assert.2 . die helfen können, Werte mit erwarteten Ergebnissen zu vergleichen。Wenn wir unsere Vergleiche duch diese Methoden ersetzen, erhalten wir folgendes;

import (" github.com/stretchr/testify/assert" "service" "testing") function Testhth华体会最新官方网站NewProductServiceImpl(t *testing. t){断言:= assert.New(t) productDaoMock:= productDaoMock {} // Mock vererst ignoorieren productServiceImpl:= NewProductServiceImpl(&productDaoMock) if !assertions.Implements((*service. productservice)(nil), new(productServiceImpl)) {t. fatal (" productdienst - implementierung beachtet Dienstdefinition ")} if !断言。NotNil(hth华体会最新官方网站productServiceImpl, " productdienst night initialisiert") {t.Fatal(" productdienst night initialisiert")} if !productDAO, "Produktdienst-Abhängigkeit nicht initialisiert") {t.Fatal("Produktdienst-Abhängigkeit nicht initialisiert")}}

Neben der Hilfe beden Assertions biedie。Wenn wir zum Beispiel vergessen haben,产品dao - feld在Konstruktor der dienstippentiung zu setzen, wrden wir den folgenden Testfehler erhalten:

===运行TestNewProhth华体会最新官方网站ductServiceImpl TestNewProductServiceImpl: product_service_impl_test。go:22:错误跟踪:product_service_impl_test。go:22 Error: Erwarteter Wert darf night Null sein。测试:TestNewProhth华体会最新官方网站ductServiceImpl Meldungen: Produktdienst-Abhängigkeit nicht initialisiert TestNewProductServiceImpl: product_service_impl_test。go:23: Produktdienst-Abhängigkeit night initialisiert—FAIL: TestNewProdhth华体会最新官方网站uctServiceImpl (0.00s)

Bisher德国我们trotz besserem消息传递和bequemerer Methoden苏珥Ausfuhrung der断言窝Umfang不reduzieren unser测试。如果不是断言中断的话,那么就会有一个错误,如果不是断言中断的话,就会有一个错误,即Testcode错误。恩大北祖赫芬,enthält证言达斯帕克特github.com/stretchr/testify/require.摘要/ abstract摘要/ abstract摘要/ abstract摘要/ abstract摘要/ abstract摘要/ abstract摘要/ abstract摘要/ abstractWenn wir dieses Paket einfhren, erhalten wir den folgenden krzeren和leichter zlesenden测试代码:

import ("github.com/stretchr/testify/require" "service" "testing") function TestNhth华体会最新官方网站ewProductServiceImpl(t *testing. t){断言:= require.New(t) productDaoMock:= productDaoMock {} // Mock vererst ignoorieren productServiceImpl:= NewProductServiceImpl(&productDaoMock) assertions. implements ((*service. productservice)(nil), new(productServiceImpl), " productdienst - implementierung beachtet Dienstdefinition ight ")断言。NotNil(hth华体会最新官方网站productServiceImpl, " productdienst夜初始化")断言。productDAO, "Produktdienst-Abhängigkeit night initialisiert")}

Mocking-Abhangigkeiten

Wenn wir eine Komponente testen, wollen wir sisiin Idealfall vollständig isolieren, um zu vermeiden, pass Fehler和under Stelle unsere Tests beeinträchtigen。die list如下:schwierig, wenn die Komponente, wenn die testen wollen, Abhängigkeiten zuanderen Komponenten aus verschiedenen Schichten unserer软件hat。在dem中,verwendetenszenario hängt在数据访问对象(DAO)下的数据访问对象(Object)-Schicht ab, auinformationen (Data Access Object)- Data Access Object (Data Access Object)下的数据访问对象。

1 . die gew隔离系统fördern, ist es blich, der Entwickler unechte, der infachte Implementierungen dieser Abhängigkeiten schreiben, die während der Tests verwendet werden。disese unechten implementerungen werden Mocks gent。

Wir können eine Mock-Implementierung des ProductDAO stesteen, die in die dienstiplement f r die testusf hrung injiziert wind。模具产品:dao - schnittstelle,模具用户模拟实用型,视觉效果好;

类型ProductDAO接口{GetProduct(id int)(*模型。Product, error)}

Um die teststausf hrung zu ermöglichen, ist es not enddig, dass der Mock ein Verhalten zeigt, das mit allen Testfällen, die wir valideren wollen, kompatibel ist, da wir sonnight die gew nschte Testabdeckung erreichen können。Mit Mit Mit Mit Mit Mit Mit Mit Mit Mit Mit Mit Mit Mit Mit Mit Mit Mit

import ("errors" "model" "persist" "testing" "time") type ProductDaoMock struct {} function (m *ProductDaoMock) GetProduct(id int) (*model. int)产品,错误){开关id{情况1:返回&型号。Product{Id: 1, Description: " productwurde vor 2 Jahren erstellt", CreatedAt: time.Now()。AddDate(- 2,0,0),}, nil情况2:返回&模型。Product{Id: 2, Description: " productk rzlich erstellt", CreatedAt: time.Now(),}, nil case 999:返回nil,持久化。ErrProductNotFound} return nil, nil} func TestPrhth华体会最新官方网站oductServiceImpl_IsProductReservable(t *testing.T) {testDataSet:= map[int]bool {1: true, 2: false,} productDaoMock:= productDaoMock {} productServiceImpl:= NewProductServiceImpl(&productDaoMock) for productId, expectedResult:= range testDataSet {reservable, err:= productServiceImpl. isproductreservable (productId) if err != nil {t.Fatalf("Es konnte nicht gepr ft werden, ob product% v reservierbar list:= expectedResult {t. fatf (" false reserveerungsinfo f_product_id erhalten %v. ", " product_id ", " err ")} if reservable !预期:% v。{}} func TestProductServiceImpl_IsProductReservable_NotFound(t *hth华体会最新官方网站testing.T) {productDaoMock:= productDaoMock {} productServiceImpl:= NewProductServiceImpl(&productDaoMock) _, err:= productServiceImpl. isproductreservable (999) if !Is(err, persistent . errproductnotfound) {t. fatf ("Unerwartetes Fehlerergebnis erhalten: %s", err)}}

“新问题”是由“新问题”构成的,“新问题”是由“新问题”构成的。在Testfall实现器中,包含了Ereignisse和die getestete组件和断言,在eregebnissen ausfhren中,während derandere teilim Mock实现器。dier wiederum musus in Verhalten bereitstellen, dmit dem des Testfalls comppatibel ist。本文主要研究了两方面的问题:一是测试问题,二是测试问题,三是模拟测试问题,三是模拟测试问题,三是模拟测试问题,三是模拟测试问题,三是模拟测试问题。

在weiteres Problem中,das die Sache noch frustrierender machen kann, ist die Tatsache, ass wiir den Mock auf mehrere Testfälle verteilen。est möglich, pass Änderungen, die am Mock vorgenomics werden, um die Erfordernisse eines Testfalls zu erfellen, andere Testfälle zerstören。在unserem情景中,habenwirnur 3 Testfälle, um die wirunk mmern。Sie können sich aber vorstellen, wie unbersichtlich es werden könnte, wenwir komplexere Testfälle hätten。在mehrere w中模拟的Aufteilung des Mocks, rde night unbedingt helfen, sonen könnte die Komplexität sugar noch erhöhen。当sich unserere gemockte Schnittstelle ändert, ssten wir ßerdem mehrere Mocks aktualisieren, um sie kompatibel zu halten。

是关于brauchen, ist, dass die Testfalllogik zentralisiert and unabhängig bleibt。恩大北祖赫芬,enthält证言达斯帕克特github.com/stretchr/testify/mock.2 .安装安装工具,安装安装工具,安装安装工具,安装安装工具ermöglichen,安装安装工具,安装安装工具。大北的大北是大北的大北,大北是大北,大北是大北,大北是大北。

军队死Verwendung des Testify-Mock-Pakets苏珥Erstellung unser DAO-Mocks和das Verschieben der Initialisierung des Mock-Verhaltens Testfalle和港口的das Hinzufugen des Testify-Require-Pakets苏珥Ausfuhrung unserer断言sieht unser Testcode是不是folgt来自:

import ("github.com/stretchr/testify/require" "github.com/stretchr/testify/mock" "errors" "model" "persist" "testing" "time") type productdaotestfymock struct {mock。function (m * productdaotestfymock) GetProduct(id int) (*model。Product, error) {args:= m.s edcalled (id) return args. get (0).(*model.Product), args. error (1)} funhth华体会最新官方网站c TestProductServiceImpl_IsProductReservable(t *testing.T){断言:= require.New(t) //注册测试mock productDaoMock:= productdaotestfymock {} productDaoMock。(“GetProduct”,1).Return(模型。Product{Id: 1, Description: " productwurde vor 2 Jahren erstellt", CreatedAt: time.Now()。AddDate(- 2,0,0),}, nil) productDaoMock。(“GetProduct”,2).Return(模型。产品{Id: 2,描述:" productk rzlich erstellt", CreatedAt: time.Now(),}, nil) testDataSet:= map[int]bool {1: true, 2: false,} productServiceImhth华体会最新官方网站pl:= NewProductServiceImpl(&productDaoMock) for productId, expectedResult:= range testDataSet {reservable, err:= productServiceImpl. isproductreservable (productId)断言。NoErrorf(err, "Konnte nicht prefen, obproductid %v reservierbar list: %s", productId, err)断言。{} func TestProductServiceImpl_IsProductReservable_NotFound(t *testing.T){断言:= require.New(t) //注册测试mock productDaohth华体会最新官方网站Mock:= productdaotestfymock {} productDaoMock。On("GetProduct", 1). return ((*model.Product)(nil), persist.ErrProductNotFoundhth华体会最新官方网站) productServiceImpl:= NewProductServiceImpl(&productDaoMock) _, err:= productServiceImpl. isproductreservable (1) if !Is(err, persistent . errproductnotfound){断言。Failf("得到意外错误结果"," unwartetes Fehlerergebnis erhalten: %s", err)}}

在本例中,我们使用了Mock-Verhalten和die Testlogik内部halb (Testfalls zentralisierist)。Beachten Sie auch, dass das erfasste Scheinverhalten ausschließlich fgr den Testfall gilt, in dem es platziert ist, da es zu einer einzelnen Mock-Instanz gehört, die夜间von mehreen Tests gemeinsam genutzt wid。模具测试erfassen ohne jegliche问题糖terschiedliche Verhaltensweisen 模具产品编号1。ProductDaoTestifyMock kann sicher zwischen mehreen Testfällen wiederverwendet werden, da es kein Verhalten。

Fazit

Ich hoffe, Sie haben ntzliche Informationen in diesem Artikel gefunden und Ich hoffe, ass her Ihnen helfen kann, bessere Unit-Tests in Ihren project jekten zu schreiben。6 .在《新技术与新技术》的基础上,对新技术与新技术的研究进展进行了验证。

$ export GOPROXY=https://gocenter。IO $去github.com/stretchr/testify

当我看到我在作证的时候在这样的情况下,嗯,我可以告诉你,Go-Module是什么意思。