精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

999福利视频| 污污网站免费观看| 日本一级在线观看| 日韩av电影天堂| 日韩在线免费av| 日本人dh亚洲人ⅹxx| 日本孕妇大胆孕交无码| 91网站最新网址| 国产精品专区一| 久久久精品国产sm调教| 首页亚洲中字| 91精品国产91久久久久久最新毛片| 欧美a级免费视频| 日韩欧美电影在线观看| 国精品**一区二区三区在线蜜桃 | 国产精品久久久久久一区二区 | 国产精品视频自拍| 黄色在线观看免费| 日韩亚洲一区在线| 欧美精品一区二区三| 成人一区二区三| 成人在线高清免费| 一区二区中文视频| 久久久水蜜桃| 精品人妻一区二区三区四区不卡| 国产精品永久| 久久成人av网站| av黄色在线免费观看| 天堂va在线高清一区| 色综合中文字幕| 日韩欧美精品免费| 18av在线视频| 中文字幕一区二区三区色视频| 国严精品久久久久久亚洲影视 | 精品久久久久久久久久久久包黑料 | 亚洲三级欧美| 中文字幕在线观看不卡视频| www.成人av| 一卡二卡三卡在线观看| 国产精品视区| 久久久久久久久久久免费| 国产成人在线网址| 精品国产乱码久久久久久果冻传媒 | 亚洲精品tv| 欧美性xxxxx极品娇小| 欧美黑人在线观看| av国产在线观看| 国产欧美视频一区二区| 蜜桃麻豆www久久国产精品| 亚洲奶汁xxxx哺乳期| 国产精品一区三区| 5566中文字幕一区二区| 国产又黄又粗又硬| 精品影视av免费| 91精品久久久久久综合乱菊| 亚洲一区二区激情| 毛片一区二区三区| 国产一区二区丝袜高跟鞋图片| 国产91av在线播放| 青草国产精品久久久久久| 国产精品久久久久久久久免费看 | 久久精品国产精品青草色艺| 婷婷五月综合激情| 激情综合色综合久久| 91在线看www| 老司机午夜福利视频| 成人网页在线观看| 乱色588欧美| 高清福利在线观看| 中文乱码免费一区二区| 亚洲欧美久久234| 麻豆视频在线播放| 一区二区三区免费网站| 日本人体一区二区| 是的av在线| 在线观看日产精品| 色婷婷激情视频| 玖玖精品一区| 亚洲精品国产精品国自产在线| 欧美狂猛xxxxx乱大交3| 欧美va久久久噜噜噜久久| 麻豆国产精品va在线观看不卡| 久草资源在线视频| 免费在线播放第一区高清av| 国产精品69久久| 99久久精品免费看国产交换| 99re这里只有精品6| 日韩一区二区三区资源| 乱人伦中文视频在线| 亚洲国产另类精品专区| 激情六月丁香婷婷| 色综合视频一区二区三区44| 精品美女被调教视频大全网站| 国产网站无遮挡| 日韩在线视频精品| 性色av一区二区三区在线观看 | 欧美精品在线一区二区| 91精品人妻一区二区三区蜜桃2| 亚洲欧洲美洲国产香蕉| 色一情一乱一区二区| 国产在线一区视频| 日韩av中文在线观看| 99久久精品免费看国产四区| 免费理论片在线观看播放老| 悠悠色在线精品| 免费激情视频在线观看| 中文字幕亚洲在线观看| 亚洲天堂色网站| 成人免费看片98| 蜜臀av性久久久久蜜臀aⅴ| 懂色一区二区三区av片| 欧美另类自拍| 亚洲一级电影视频| 天堂一区在线观看| 九九热精品视频在线观看| 欧美高清不卡在线| 中文字幕乱码视频| 26uuu欧美| 欧美乱大交xxxxx潮喷l头像| 欧美a视频在线| 亚洲欧洲国产一区| 国产成人免费观看视频| 国产成人精品三级麻豆| 日韩欧美一区二区三区四区| 久久青草伊人| 欧美一级日韩一级| 国产精品视频一区二区在线观看| 老牛嫩草一区二区三区日本| 国内一区在线| 91破解版在线观看| 日韩欧美中文一区| 在线观看美女av| 九九视频精品免费| 日韩在线三级| 亚洲欧美在线成人| 亚洲人成免费电影| 国产视频1区2区| 91亚洲大成网污www| 色综合久久久久无码专区| 91精品丝袜国产高跟在线| 久久天天躁狠狠躁夜夜躁| 亚洲一区二区影视| 国产精品久久三| 在线黄色免费观看| 欧美国产一区二区三区激情无套| 日本aⅴ大伊香蕉精品视频| 亚州av在线播放| 亚洲va国产va欧美va观看| 成年女人免费视频| 精品动漫3d一区二区三区免费| 999日本视频| 天堂av中文在线| 亚洲电影成人av99爱色| 国产精品第9页| 99国产精品久| 欧美私人情侣网站| 日韩久久视频| 成人欧美在线观看| 91精品国产91久久久久久青草| 欧美一级欧美三级在线观看| 免费在线一区二区三区| 成人一区二区三区| 日本在线xxx| 精品在线91| 国产精品入口免费视| 中文字幕日本在线观看| 91麻豆精品国产91久久久久久 | 欧美天天综合网| 激情无码人妻又粗又大| 国产精品资源网| 日韩a级在线观看| 国产欧美高清视频在线| 国产精品视频一区二区高潮| 国产日产一区二区| 亚洲精品在线电影| 午夜久久久久久久久久影院| 国产精品国产三级国产普通话99| 一级网站在线观看| 激情婷婷欧美| 神马欧美一区二区| 青草综合视频| 性欧美亚洲xxxx乳在线观看| www.av在线播放| 日韩视频国产视频| 国产欧美一区二区三区在线看蜜臂| 亚洲国产岛国毛片在线| 亚洲一区二区图片| 一区二区福利| 伊人av成人| 乱中年女人伦av一区二区| 国产精品久久久久久网站| 日韩经典av| 一本大道亚洲视频| www.看毛片| 欧美自拍偷拍午夜视频| 久久久久久激情| 国产欧美精品区一区二区三区 | 久久久久久成人| 最新av网站在线观看| 亚洲国产欧美一区二区丝袜黑人| 国产免费a视频| 亚洲大片免费看| 999久久久国产| 99精品视频在线观看| 中文字幕22页| 久久黄色影院| 中文字幕无码精品亚洲资源网久久| 青青草国产免费一区二区下载| 国产精品美女黄网| 婷婷久久免费视频| 日韩免费观看高清| 国产精品一品| 九九热99久久久国产盗摄| 国产污视频在线| 亚洲精品不卡在线| 精品人妻一区二区三区浪潮在线| 欧美体内she精视频| 国产三级av片| 亚洲mv大片欧洲mv大片精品| 人妻久久一区二区| 国产精品免费丝袜| 国产综合精品久久久久成人av | 91视频免费在观看| 99久久久无码国产精品| 337p日本欧洲亚洲大胆张筱雨| 日本不卡中文字幕| 久久久久久久久久久久久国产精品| 国产在线日韩| 免费看av软件| 国产精品国产三级国产在线观看| 欧洲av一区| 自拍视频一区| 欧美日韩系列| 日韩影视高清在线观看| 国产一区二区三区奇米久涩| 视频国产精品| 91精品入口蜜桃| 亚洲性视频在线| 亚洲综合国产精品| 国产95亚洲| 国产日韩欧美在线观看| 久久久精品一区二区毛片免费看| 国产精品wwww| 男人最爱成人网| 国产精品igao视频| 欧美日韩在线精品一区二区三区激情综合| 日本高清不卡在线| 日韩精品三区| 国产精品久久久久久久久免费看 | 国产一二三四视频| 日本一区二区三区久久久久久久久不 | 男插女视频久久久| 久久成人精品视频| 日皮视频在线观看| 欧美激情奇米色| 调教一区二区| 77777少妇光屁股久久一区| 高清在线视频不卡| 欧美最近摘花xxxx摘花| 亚洲播播91| 国产日韩在线免费| 成人豆花视频| 国产精品久久国产三级国电话系列| 久久97久久97精品免视看秋霞| 精品高清视频| 欧美欧美黄在线二区| 先锋影音亚洲资源| 亚洲一本二本| r级无码视频在线观看| 午夜一区不卡| gogogo高清免费观看在线视频| 国产精品原创巨作av| 日本护士做爰视频| 国产日本欧美一区二区| 国产精品视频一区二区三| 亚洲一区二区三区自拍| 欧美黑人一区二区| 欧美日韩精品一区二区| а√天堂资源在线| 日韩精品视频免费在线观看| аⅴ资源新版在线天堂| 欧美精品一本久久男人的天堂| f2c人成在线观看免费视频| 国产不卡一区二区在线播放| 97色婷婷成人综合在线观看| 国产精品久久亚洲7777| 欧美视频网址| 国产情侣第一页| 久久精品人人| 亚洲精品乱码久久久久久9色| 972aa.com艺术欧美| 少妇太紧太爽又黄又硬又爽小说| 亚洲综合激情网| 国产99久久久久久免费看| 日韩欧美国产综合一区 | 久久99久国产精品黄毛片入口| 一区一区三区| 成人免费观看网站| 色偷偷综合网| 国产乱子夫妻xx黑人xyx真爽| 久久66热偷产精品| 国产熟妇搡bbbb搡bbbb| 亚洲欧美色综合| 樱花视频在线免费观看| 亚洲高清一二三区| 久久99精品久久久久久野外| 91国语精品自产拍在线观看性色 | 国产精品自产自拍| 丰满的亚洲女人毛茸茸| 精品欧美一区二区三区| 99热这里只有精品66| 亚洲人在线视频| 黄频免费在线观看| 97久久夜色精品国产九色| 大色综合视频网站在线播放| 噜噜噜久久亚洲精品国产品麻豆| 国产精选一区二区三区| 美国美女黄色片| 色综合久久88色综合天天免费| 女人18毛片水真多18精品| 久久久国产成人精品| 99只有精品| 色婷婷精品国产一区二区三区| 99在线|亚洲一区二区| 91porn在线| 亚洲男同性恋视频| 国产免费视频一区二区三区| 在线观看免费高清视频97| 波多野结衣亚洲一二三| 精品久久精品久久| 在线成人国产| 美女伦理水蜜桃4| 夜夜嗨av一区二区三区网页| www.中文字幕| 九九久久久久99精品| 日韩免费成人| 欧美日韩中文字幕在线播放 | 欧洲亚洲国产日韩| 久久精品蜜桃| 国产成人精品网站| 国产成人ay| 999在线免费视频| 国产欧美精品区一区二区三区| 在线精品免费视| 亚洲人成在线免费观看| 高清成人在线| 亚洲免费不卡| 国内成人免费视频| 强乱中文字幕av一区乱码| 日韩欧美国产麻豆| 波多野结衣乳巨码无在线观看| 国产精品初高中精品久久| 影音先锋亚洲电影| 国产精品无码永久免费不卡| 一本色道综合亚洲| www.亚洲视频| 91精品天堂| 亚洲毛片一区| 日韩人妻无码精品综合区| 欧美日韩一区高清| 国产理论在线观看| 福利视频一区二区三区| 99精品视频免费| 久久美女免费视频| 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 在线观看精品一区二区三区| 91免费国产网站| 欧美三级特黄| 性久久久久久久久久| 欧美午夜一区二区三区免费大片| 欧洲不卡视频| 国产99视频精品免费视频36| 一区二区精品| 亚洲欧美精品久久| 日韩精品一区二区三区老鸭窝| 爱草tv视频在线观看992| 欧美一区二区福利| 精油按摩中文字幕久久| 精品无码人妻一区二区三区 | 黄色网址在线免费观看| 国产成人精品一区二区三区福利| 国产精品尤物| 69夜色精品国产69乱| 亚洲精品成人免费| 成人日韩av| 缅甸午夜性猛交xxxx| 欧美激情一区二区三区不卡| 99久久精品日本一区二区免费| 欧美主播福利视频| 91成人网在线观看| 香蕉网在线播放| 91精品国产日韩91久久久久久| 成人bbav| 国产精品一区在线免费观看| 99精品欧美一区二区三区综合在线| 美女黄页在线观看| 97精品在线观看| 国产精品7m凸凹视频分类| 国产精品伦子伦| 欧美一区二区三区在|