iT邦幫忙

2023 iThome 鐵人賽

DAY 29
0
Modern Web

就是個Go,我也可以啦!GOGO系列 第 29

2023鐵人賽Day 29 Go X 來寫測試吧

  • 分享至 

  • xImage
  •  

我們今天要來寫測試,說到測試,就必須選擇測試使用的套件
Go 的 testing 套件提供了一個健壯的基礎來撰寫測試,而 Testify、GoMock 和 GoCheck 等工具則在此基礎上提供了額外的功能和便利,今天我們會來介紹 Testify

testify

testify提供了一組工具來測試你的程式是否正常運行

簡單的斷言(Easy Assertions)

斷言(Assertions)在軟體測試中扮演著極為重要的角色。它們用於驗證代碼在特定條件下的行為是否符合預期
assert package

step 1 導入必要的包

import (
  "testing"
  "github.com/stretchr/testify/assert"
)

step 2 定義測試函數

func TestSomething(t *testing.T) {
}

所有的測試函數都應該接收一個指向 testing.T 類型的指針作為參數

step 3 斷言的使用

(1)
  // assert equality
  assert.Equal(t, 123, 123, "they should be equal")

這行檢查兩個數字(123 和 123)是否相等。如果不相等,它將記錄一個錯誤,附帶消息 "they should be equal"

(2)
  // assert inequality
  assert.NotEqual(t, 123, 456, "they should not be equal")

這行檢查兩個數字(123 和 456)是否不相等。如果相等,它將記錄一個錯誤,附帶消息 "they should not be equal"

(3)
  // assert for nil (good for errors)
  assert.Nil(t, object)

這行檢查 object 是否為 nil。如果不是,它將記錄一個錯誤

  // assert for not nil (good when you expect something)
  if assert.NotNil(t, object) {

    // now we know that object isn't nil, we are safe to make
    // further assertions without causing any errors
    assert.Equal(t, "Something", object.Value)

  }

這幾行首先檢查 object 是否不為 nil。如果是 nil,它將記錄一個錯誤。如果不是 nil,則會進入 if 語句的塊中,並進行進一步的斷言。在這個塊中,它檢查 object.Value 是否等於字符串 "Something"。如果不是,它將記錄一個錯誤

訊息

  • 每個斷言函數都將 testing.T 對象作為第一個參數。這是因為斷言函數通過 testing.T 對象將錯誤信息寫入到測試輸出中。當一個斷言失敗時,它會調用 t.Error 或 t.Fail 方法來報告失敗
  • 每個斷言函數都返回一個布爾值,指示斷言是否成功。如果斷言成功,它返回 true;如果失敗,它返回 false。這個返回值可以用來決定是否繼續進行後續的斷言或操作

模擬(Mocking)

模擬可以提供一個穩定、可控的測試環境,減少測試的不確定性和不穩定性
mock package

step 1 定義模擬對象

type MyMockedObject struct{
  mock.Mock
}

這裡,MyMockedObject 結構體嵌入了 mock.Mock,這樣 MyMockedObject 的實例就能使用 mock.Mock 的方法來設置期望和返回值

step 2 定義模擬方法

func (m *MyMockedObject) DoSomething(number int) (bool, error) {
  args := m.Called(number)
  return args.Bool(0), args.Error(1)
}

DoSomething 方法是 MyMockedObject 的一個模擬方法。它使用 m.Called 來記錄方法的調用並返回預設的返回值

Called 方法的定義和用途:Called 方法是在 Testify 的 mock 包中定義的。它用於記錄一個模擬方法的調用,並返回用於設置該方法返回值的 mock.Arguments 對象

step 3 使用模擬對象

(1)

在測試函數中,你可以創建模擬對象的實例,並設置它的期望和返回值

testObj := new(MyMockedObject)
testObj.On("DoSomething", 123).Return(true, nil)

這裡,On 方法用於設置當 DoSomething 方法被調用時的期望參數,Return 方法用於設置模擬方法的返回值

(2) 使用佔位符
testObj.On("DoSomething", mock.Anything).Return(true, nil)

你也可以使用 mock.Anything 作為一個佔位符,表示你期望 DoSomething 方法被調用時接收任何參數


上一篇
2023鐵人賽Day 28 Go X 要來杯琴酒嗎
下一篇
Day 30 or 30000... 繼續學習下去...今天就學 Go錯誤處理
系列文
就是個Go,我也可以啦!GOGO30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言