funcTestSomething(t *testing.T) { // assert equality assert.Equal(t, 123, 123, "they should be equal")
// assert inequality assert.NotEqual(t, 123, 456, "they should not be equal")
// assert for nil (good for errors) assert.Nil(t, object)
// 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) } }
funcTestSomething(t *testing.T) { a := assert.New(t)
// assert equality a.Equal(123, 123, "they should be equal")
// assert inequality a.NotEqual(123, 456, "they should not be equal")
// assert for nil (good for errors) a.Nil(object)
// assert for not nil (good when you expect something) if a.NotNil(object) { // now we know that object isn't nil, we are safe to make // further assertions without causing any errors a.Equal("Something", object.Value) } }
Require package
require 和 aasert 很像,但是它不會回傳 bool , 而是會直接終止目前的測試。
Mock package
mock package 提供了一種機制,可以方便的 mock object, 在測試時可以用來替代 real object. 使用範例:
// MyMockedObject is a mocked object that implements an interface // that describes an object that the code I am testing relies on. type MyMockedObject struct{ mock.Mock }
// DoSomething is a method on MyMockedObject that implements some interface // and just records the activity, and returns what the Mock object tells it to. // // In the real object, this method would do something useful, but since this // is a mocked object - we're just going to stub it out. // // NOTE: This method is not being tested here, code that uses this object is. func(m *MyMockedObject) DoSomething(number int) (bool, error) { args := m.Called(number) return args.Bool(0), args.Error(1) }
/* Actual test functions */
// TestSomething is an example of how to use our test object to // make assertions about some target code we are testing. funcTestSomething(t *testing.T) { // create an instance of our test object testObj := new(MyMockedObject)
// call the code we are testing targetFuncThatDoesSomethingWithObj(testObj)
// assert that the expectations were met testObj.AssertExpectations(t) }
// TestSomethingWithPlaceholder is a second example of how to use our test object to // make assertions about some target code we are testing. // This time using a placeholder. Placeholders might be used when the // data being passed in is normally dynamically generated and cannot be // predicted beforehand (eg. containing hashes that are time sensitive) funcTestSomethingWithPlaceholder(t *testing.T) { // create an instance of our test object testObj := new(MyMockedObject)
// setup expectations with a placeholder in the argument list testObj.On("DoSomething", mock.Anything).Return(true, nil)
// call the code we are testing targetFuncThatDoesSomethingWithObj(testObj)
// assert that the expectations were met testObj.AssertExpectations(t) }
// TestSomethingElse2 is a third example that shows how you can use // the Unset method to cleanup handlers and then add new ones. funcTestSomethingElse2(t *testing.T) { // create an instance of our test object testObj := new(MyMockedObject)
// setup expectations with a placeholder in the argument list mockCall := testObj.On("DoSomething", mock.Anything).Return(true, nil)
// call the code we are testing targetFuncThatDoesSomethingWithObj(testObj)
// assert that the expectations were met testObj.AssertExpectations(t)
// remove the handler now so we can add another one that takes precedence mockCall.Unset()
// return false now instead of true testObj.On("DoSomething", mock.Anything).Return(false, nil)
testObj.AssertExpectations(t) }
Suite package
suite 可以幫助我們在讓每個測試案例做前置作業或後置操作, 很像是 Python 中的 setUp() 和 tearDown().
// Define the suite, and absorb the built-in basic suite // functionality from testify - including a T() method which // returns the current testing context type ExampleTestSuite struct { suite.Suite VariableThatShouldStartAtFive int }
// Make sure that VariableThatShouldStartAtFive is set to five // before each test func(suite *ExampleTestSuite) SetupTest() { suite.VariableThatShouldStartAtFive = 5 }
// All methods that begin with "Test" are run as tests within a // suite. func(suite *ExampleTestSuite) TestExample() { assert.Equal(suite.T(), 5, suite.VariableThatShouldStartAtFive) }
// In order for 'go test' to run this suite, we need to create // a normal test function and pass our suite to suite.Run funcTestExampleTestSuite(t *testing.T) { suite.Run(t, new(ExampleTestSuite)) }