精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

在 Go 中使用 Dockertest 進行集成測試

開發 后端
進行集成測試(或系統測試)通常意味著讓數據庫填充數據,像 redis、elasticsearch 等,通常,我們的軟件與之交互的任何基礎設施都可以工作。

[[437314]]

進行集成測試(或系統測試)通常意味著讓數據庫填充數據,像 redis、elasticsearch 等,通常,我們的軟件與之交互的任何基礎設施都可以工作。

最常見的方法是復制我們的生產基礎設施,其實用容器來實現還是比較容易的,比如 docker 容器。

我們可以為需要復制的每個服務設置和運行一個容器,我們可以使用 docker-compose 對其進行編排并創建一些 makefile 或只是一個簡單的腳本來準備基礎設施并運行集成測試。

如果你的測試是獨立的(它們應該是獨立的),你必須找到在測試之間“重新啟動”基礎設施服務的方法,這可能很難通過分離的基礎設施設置和測試來實現(基礎設施是在腳本中設置的,而測試在 Go 文件中)

01 dockertest

如果你使用的是 Go,則可以使用 dockertest,一個可以管理和編排 Go 測試文件中的容器的庫。

從 Go 文件管理測試基礎設施容器,允許我們控制在每個測試中需要的服務(例如,某些包正在使用數據庫而不是 Redis,為這個測試運行 Redis 沒有意義)

安裝 dockertest

要安裝 dockertest,只需運行:

  1. go get -u github.com/ory/dockertest/v3 

使用 dockertest

使用 dockertest 設置基礎設施的最簡單方法是在測試文件的TestMain 函數中添加設置代碼。

TestMain 是在包中運行測試之前調用的函數,更多信息參考這里。

這是如何使用 dockertest 設置 MySQL 服務的示例:

  1. package mypackage_test 
  2.  
  3. import ( 
  4.  "database/sql" 
  5.  "fmt" 
  6.  "log" 
  7.  "os" 
  8.  "testing" 
  9.  
  10.  _ "github.com/go-sql-driver/mysql" 
  11.  "github.com/ory/dockertest/v3" 
  12.  
  13. var db *sql.DB 
  14.  
  15. func TestMain(m *testing.M) { 
  16.  // uses a sensible default on windows (tcp/http) and linux/osx (socket) 
  17.  pool, err := dockertest.NewPool(""
  18.  if err != nil { 
  19.   log.Fatalf("Could not connect to docker: %s", err) 
  20.  } 
  21.  
  22.  // pulls an image, creates a container based on it and runs it 
  23.  resource, err := pool.Run("mysql""5.7", []string{"MYSQL_ROOT_PASSWORD=secret"}) 
  24.  if err != nil { 
  25.   log.Fatalf("Could not start resource: %s", err) 
  26.  } 
  27.  
  28.  // exponential backoff-retry, because the application in the container might not be ready to accept connections yet 
  29.  if err := pool.Retry(func() error { 
  30.   var err error 
  31.   db, err = sql.Open("mysql", fmt.Sprintf("root:secret@(localhost:%s)/mysql", resource.GetPort("3306/tcp"))) 
  32.   if err != nil { 
  33.    return err 
  34.   } 
  35.   return db.Ping() 
  36.  }); err != nil { 
  37.   log.Fatalf("Could not connect to docker: %s", err) 
  38.  } 
  39.  
  40.   // RESERVED FOR DATABASE MIGRATIONS 
  41.  code := m.Run() 
  42.   
  43.  // You can't defer this because os.Exit doesn't care for defer 
  44.  if err := pool.Purge(resource); err != nil { 
  45.   log.Fatalf("Could not purge resource: %s", err) 
  46.  } 
  47.   
  48.  os.Exit(code) 

填充數據庫

現在我們有工作的數據庫服務,但這個數據庫是空的。dockertest 正在為容器使用通用 MySQL 映像,并且沒有與我們的應用程序相關的任何內容。

之前寫了一篇關于 數據庫遷移,在那篇文章中,我談到了 go-migrate,一個運行數據庫遷移的工具,那篇文章,我專注于作為 CLI 工具使用,現在將在我們的 Go 代碼中使用它。

我們將先前編寫的代碼 // RESERVED FOR DATABASE MIGRATIONS 添加到此代碼中:

  1. m, err := migrate.NewWithDatabaseInstance("file://<path-to-migration-folder>, "mysql", driver) 
  2. if err != nil { 
  3.     log.Fatalf("Error running migrations: %s", err) 
  4. err = m.Up() 
  5. if err != nil { 
  6.     log.Fatal(err.Error()) 

然后在 dockertest up 數據庫后,遷移工具填充數據庫,我們的集成測試可以使用數據庫中的相同數據運行。

如果應用程序有多個包(這是常見情況),我會將服務的設置代碼放在一個獨立文件中,該文件在每個包中調用:

  1. // it_utils.go 
  2. package it_utils 
  3.  
  4. func IntegrationTestSetup() (*dockertest.Pool, *[]dockertestResource { 
  5.   // Setup the services 
  6.   //return the pool and the resources 
  7.  
  8. func IntegrationTestTeardown(pool *dockertest.Pool, resources []*dockertest.Resource) { 
  9.  for _, resource := range resources { 
  10.   if err := pool.Purge(resource); err != nil { 
  11.    fmt.Printf("Could not purge resource: %s\n", err) 
  12.   } 
  13.  } 

那么在每個包的測試中我們只需要添加如下代碼:

  1. package my_package 
  2.  
  3. func TestMyTests (t *testing.T) { 
  4.     if testing.Short() { 
  5.   t.Skip() 
  6.  } 
  7.  pool, resources := itutils.IntegrationTestSetup() 
  8.  defer itutils.IntegrationTestTeardown(pool, resources) 
  9.   
  10.  t.Run("your test", func(t *testing.T) { 
  11.  ... 
  12.  } 
  13.  
  14. func TestOtherTests (t *testing.T) { 
  15.     if testing.Short() { 
  16.   t.Skip() 
  17.  } 
  18.  pool, resources := itutils.IntegrationTestSetup() 
  19.  defer itutils.IntegrationTestTeardown(pool, resources) 
  20.   
  21.  t.Run("your other test", func(t *testing.T) { 
  22.  ... 
  23.  } 

以這種方式在每個測試塊上執行此操作,服務在新容器中運行,從而使測試完全獨立。

作為最后一個提示,我建議將集成測試放在不同的包中以避免循環導入。

原文鏈接:https://sergiocarracedo.es/integration-tests-in-golang-with-dockertest/

本文轉載自微信公眾號「幽鬼」,可以通過以下二維碼關注。轉載本文請聯系幽鬼公眾號。

 

責任編輯:武曉燕 來源: 幽鬼
相關推薦

2023-10-28 16:22:21

Go接口

2023-11-27 19:39:46

Goprotobuf

2009-06-22 10:29:11

集成測試Spring

2009-06-08 19:59:09

EclipseJUnit單元測試

2009-06-08 19:57:29

EclipseJUnit4單元測試

2009-06-08 20:04:06

EclipseJUnit4單元測試

2024-02-07 11:44:20

NestJSRxJS異步編程

2011-12-08 10:24:53

JavaNIO

2023-10-13 18:02:57

JUnitMockito關系

2019-12-12 13:50:27

strace追蹤系統調用Linux

2023-05-24 16:41:41

React前端

2024-05-06 13:34:28

WireGoogleGo

2021-09-21 15:44:02

LinuxOBSWayland

2021-02-20 09:14:35

PythonPygal可視化

2021-01-05 08:39:51

容器前端流水線

2022-01-03 08:06:15

函數Go數據

2024-08-19 01:10:00

RedisGo代碼

2022-11-03 20:38:01

CMD命令Go

2013-01-07 13:54:17

Android開發JUnit單元測試

2010-06-23 15:21:45

SharepointExchange
點贊
收藏

51CTO技術棧公眾號

日韩欧美成人精品| 国产亚洲精品免费| 欧美xxxx14xxxxx性爽| 四虎精品一区二区| 婷婷激情一区| 亚洲乱码日产精品bd| 国产在线精品一区| 怡红院成永久免费人全部视频| 欧美日韩在线大尺度| 亚洲欧美三级在线| 超碰人人cao| 456成人影院在线观看| 一区二区三区四区精品在线视频| 免费观看国产成人| 国产精品视频一区二区三区,| aa级大片欧美三级| 久久久国产91| 国产黄片一区二区三区| 亚洲性视频在线| 欧美在线三级电影| 老太脱裤子让老头玩xxxxx| 日韩黄色影院| 成人av在线影院| 成人在线精品视频| www.久久久久久久| 亚洲国产国产亚洲一二三| www.久久久久久.com| 中文字幕在线视频播放| 国产精品高清一区二区| 91高清视频在线| 亚洲人成无码网站久久99热国产 | 日本欧美在线| 色综合天天综合色综合av| 日韩精品手机在线观看| 欧美成人xxx| 欧美韩日一区二区三区| 欧美精品久久久| 天天干天天插天天操| 国产高清久久久| 国产欧美亚洲视频| 久久这里只有精品9| 国产精品嫩草99av在线| 97视频com| 日韩成人免费在线观看| 欧美aⅴ99久久黑人专区| 社区色欧美激情 | 精品无码国产污污污免费网站| 香蕉久久夜色精品国产更新时间 | 亚洲成av人片在线观看无码| dy888午夜| 久久77777| 亚洲欧洲日产国码二区| 亚洲午夜精品一区二区三区| 91啦中文在线| 国产精品二三区| 一本一本久久a久久精品综合妖精| 久草福利在线| 国产视频一区在线播放| 日本免费高清一区| 国产三级在线免费| 中文字幕国产精品一区二区| 水蜜桃亚洲一二三四在线| 岛国在线视频免费看| 欧美经典三级视频一区二区三区| 日本亚洲欧洲精品| av片在线免费观看| 国产精品久久久久久妇女6080| 亚洲一二三区在线| 中文字幕在线观看网站| 亚洲一区在线播放| av免费观看网| 美女写真久久影院| 欧美日韩夫妻久久| 91丨porny丨九色| 精品素人av| 亚洲日本中文字幕| 999福利视频| 国产主播精品| 热草久综合在线| 亚洲熟女乱色一区二区三区久久久| 国产一区啦啦啦在线观看| 亚洲tv在线观看| 同心难改在线观看| 久久久国产午夜精品| 亚洲高清在线观看一区| 91精品久久| 欧美色播在线播放| 三上悠亚在线一区| 国产成人tv| 伊人av综合网| 久久成人国产精品入口| 国产精品久久久久久模特| 国产精品久久久久久影视| 99久久精品日本一区二区免费| av在线不卡免费看| 亚洲国产精品一区在线观看不卡 | 亚洲天堂2014| 国产网站免费在线观看| 成人在线中文| 亚洲国产精品成人va在线观看| 亚洲v国产v欧美v久久久久久| 亚洲精品二区三区| 日韩免费中文字幕| 亚洲AV午夜精品| 欧美激情一区不卡| 国产极品粉嫩福利姬萌白酱| 9999精品视频| 一个色综合导航| 91蜜桃视频在线观看| 久久国产精品99久久人人澡| 免费99视频| 金瓶狂野欧美性猛交xxxx| 欧美视频中文一区二区三区在线观看| 涩视频在线观看| 欧美激情777| 日本久久久久亚洲中字幕| 国产黄色小视频在线观看| 国产偷国产偷精品高清尤物| 大伊香蕉精品视频在线| 午夜不卡一区| 国产一区二区三区直播精品电影| 久久国产精品波多野结衣av| 美美哒免费高清在线观看视频一区二区 | 国产无遮挡aaa片爽爽| 久久国产夜色精品鲁鲁99| 久久青青草综合| 欧美男男video| 7799精品视频| 少妇高潮一区二区三区喷水| 久久人人97超碰国产公开结果| 国产精品区一区二区三含羞草| 免费黄网站在线| 欧美日韩精品欧美日韩精品一| 少妇按摩一区二区三区| 亚洲国产二区| 国产欧美日韩一区| xxx.xxx欧美| 日韩精品一区二区三区蜜臀| 99自拍视频在线| 另类中文字幕网| 天堂√在线观看一区二区 | 国产在线精品播放| 国产大学生校花援交在线播放| 一本色道久久加勒比精品| 色呦呦一区二区| 亚洲黄色大片| 久久一区二区精品| 亚洲精品mv| 亚洲天堂第二页| 亚洲高清在线看| 欧美国产精品一区二区三区| 99热手机在线| 波多野结衣在线观看一区二区| 国产精品久久一区主播| 啊v在线视频| 欧美日韩电影在线播放| 日韩在线视频免费看| 成人公开免费视频| 三级不卡在线观看| 视频一区在线免费观看| 日日狠狠久久| 欧美大胆在线视频| 亚洲精品97久久中文字幕| 亚洲国产日韩a在线播放性色| 激情综合激情五月| 国产欧美一级| 午夜精品福利一区二区| 国产精久久久| 国内揄拍国内精品| 黄色av网站在线| 666欧美在线视频| 欧美精品成人久久| 91美女蜜桃在线| 在线免费视频a| 欧美喷水视频| 快播日韩欧美| 国产精品久久久久77777丨| 久久综合五月天| 天天干天天色天天| 欧美日韩在线一区二区| 久久一区二区三| 亚洲淫成人影院| 91精品国产综合久久久久久久久久 | 亚洲一区二区日韩| 成人黄视频免费| 大菠萝精品导航| 国产亚洲精品久久| h狠狠躁死你h高h| 高跟丝袜欧美一区| 亚洲aaa视频| av资源站一区| 中文字幕亚洲欧洲| 国产精品av久久久久久麻豆网| 久久精品99久久| 亚洲精品一区av| 高清一区二区三区四区五区 | 久久久精品亚洲| 日日躁夜夜躁白天躁晚上躁91| 91久久精品网| 久久久久97国产| 亚洲国产精品高清| 久久久老熟女一区二区三区91| 日韩激情一二三区| 免费网站永久免费观看| 成人高清av| 好吊妞www.84com只有这里才有精品| 欧美性片在线观看| 97婷婷大伊香蕉精品视频| 看黄网站在线| 亚洲一级一级97网| 少妇av在线播放| 91麻豆精品国产91久久久资源速度 | 石原莉奈一区二区三区在线观看| 国产1区2区3区中文字幕| 国产在线日韩精品| 狠狠色伊人亚洲综合网站色| 99国内精品久久久久| 国产成人综合久久| 中文字幕乱码中文乱码51精品| 久久精视频免费在线久久完整在线看| 日韩av免费观影| 欧美精品一区二区精品网| 99久久免费国产精精品| 欧美日韩视频一区二区| 亚洲国产av一区二区三区| 亚洲高清视频在线| 欧美日韩亚洲国产另类| 国产精品久久久久影视| 在线免费观看视频| 国产亚洲综合av| 国产偷人妻精品一区| 波多野结衣91| 亚洲熟女一区二区| 成人久久久精品乱码一区二区三区| 久久成年人网站| 国产真实乱偷精品视频免| 中文久久久久久| 免费观看在线色综合| 热久久精品免费视频| 男女精品网站| 不要播放器的av网站| 久久激情网站| 免费在线观看毛片网站| 午夜在线视频观看日韩17c| 狠狠97人人婷婷五月| 宅男噜噜噜66国产日韩在线观看| 久久久久99精品成人片| 国模一区二区三区| av在线com| 亚洲成色精品| 日韩少妇内射免费播放18禁裸乳| 一区二区精品| 国产精品99久久免费黑人人妻| 亚洲一区二区三区高清不卡| av观看免费在线| 久久一区中文字幕| 国产视频一区二区视频| 麻豆91在线观看| 爽爽爽在线观看| 国产99久久久国产精品潘金 | 国产露脸国语对白在线| 欧美一区二区三区在线观看| 亚洲第一大网站| 亚洲国产精品电影| 极品美乳网红视频免费在线观看| 国产亚洲xxx| 毛片免费不卡| 欧美高清视频在线播放| 男人天堂视频在线观看| 国产成人精品久久久| 久久天天久久| 成人在线观看网址| 图片婷婷一区| 一个色的综合| 激情婷婷亚洲| 中文久久久久久| 国产999精品久久| 少妇久久久久久久久久| 亚洲色大成网站www久久九九| 久久免费小视频| 欧美日韩亚洲国产一区| 中文字幕在线观看你懂的| 欧美成人一区二区| 久草在线青青草| 久久综合色影院| 无遮挡爽大片在线观看视频| 国产精品香蕉国产| 操欧美女人视频| 亚洲成人av动漫| 最新日韩av| 91视频这里只有精品| 不卡av在线网| 二区三区四区视频| 精品日韩中文字幕| 97国产精品久久久| 日韩激情av在线免费观看| 很黄的网站在线观看| 国产91成人video| 国产一区一区| 污视频在线免费观看一区二区三区 | 国产亚洲黄色片| 久久99精品网久久| 欧美图片第一页| 亚洲一本大道在线| 一级淫片免费看| 亚洲欧美综合区自拍另类| 亚洲图区一区| 国产精品中文字幕久久久| 欧美激情久久久久久久久久久| 在线综合视频网站| 日韩电影免费在线| 国产精品300页| 亚洲一区在线观看视频| 中文字幕在线播出| 亚洲欧美一区二区三区情侣bbw| 免费在线播放电影| 91久久精品美女高潮| 精品一区二区三| 国内外成人激情视频| 成人av网在线| 免费毛片在线播放免费| 欧美一区二区三区人| 日韩伦理在线电影| 国产精品久久久久久久一区探花| 日韩美脚连裤袜丝袜在线| 日韩成人三级视频| 国产在线精品一区二区不卡了| 91导航在线观看| 日本丶国产丶欧美色综合| 女人偷人在线视频| 欧美一区二区三区精品电影| 国产一区二区三区不卡av| 日本大片免费看| 成人av资源站| 国产精品2020| 精品国产123| 欧美人与牲禽动交com| 99www免费人成精品| 欧美国产专区| 佐山爱在线视频| 亚洲六月丁香色婷婷综合久久| 国产精品自偷自拍| 久久精品视频免费播放| 日韩一区二区三区四区五区| 天天综合狠狠精品| 久久99久久久久| 国产女片a归国片aa| 欧美一区二区三区在线视频| caoporm免费视频在线| 亚洲xxxx在线| 国产精品大片| 捆绑裸体绳奴bdsm亚洲| 无码av免费一区二区三区试看| 少妇av在线播放| 国产成人精品视频在线| 热久久天天拍国产| 最新免费av网址| 亚洲精品国产一区二区精华液| 午夜精品一区二区三| 久久久久一本一区二区青青蜜月 | 国产精品一区二区久久精品爱涩| 好吊日在线视频| 精品久久久久久久久久久久久久久久久| 免费污视频在线观看| 欧美成ee人免费视频| 日韩精品色哟哟| 91麻豆免费视频网站| 亚洲国产精品99久久| 午夜av成人| 精品国产三级a∨在线| 成人黄色在线视频| 亚洲熟女综合色一区二区三区| 欲色天天网综合久久| 国内不卡的一区二区三区中文字幕| 中文字幕日韩精品无码内射| 26uuu另类欧美亚洲曰本| 久久久999久久久| 欧美超级免费视 在线| 欧美综合精品| 欧美成人福利在线观看| 亚洲一区二区三区不卡国产欧美| 飘雪影院手机免费高清版在线观看| 国产精品自产拍在线观看| 午夜久久一区| 无码人妻aⅴ一区二区三区69岛| 91精品国产麻豆| gay欧美网站| 国产又粗又硬又长| 久久久久久久久久看片| 精品人妻少妇AV无码专区| 国产97在线观看| 国产尤物精品| 久久爱一区二区| 亚洲人成电影在线| 亚洲日本va中文字幕| 无码内射中文字幕岛国片| 亚洲一二三区视频在线观看| 91社区在线观看播放| 久久精品日韩精品| 国产精品一区二区在线看|