Testify require and assert: Difference between revisions

From NovaOrdis Knowledge Base
Jump to navigation Jump to search
No edit summary
No edit summary
Line 27: Line 27:
assert := testifyassert.New(t)
assert := testifyassert.New(t)
     require := testifyrequire.New(t)
     require := testifyrequire.New(t)
     assert.Equal(123, 123, "this message is displayed when the assertion fails, but the test continues %s", "because of inequality")
     assert.Equal(123, 123, "this message is displayed when the assertion fails, but the test continues %s", "because of inequality")
     require.Equal(123, 123, "this message is displayed when the test fails and exists %s", "because of inequality")  
     require.Equal(123, 123, "this message is displayed when the test fails and exists %s", "because of inequality")  
Line 53: Line 52:
assert.NotNil(someObj, "someObj should not have been nil but it is %v, and the test continues", someObj)
assert.NotNil(someObj, "someObj should not have been nil but it is %v, and the test continues", someObj)
require.NotNil(someObj, "someObj should not have been nil but it is %v, and the test exits", someObj)
require.NotNil(someObj, "someObj should not have been nil but it is %v, and the test exits", someObj)
someObj = nil
someObj = nil
assert.Nil(someObj, "someObj should have been nil but it is %v, and the test continues", someObj)
assert.Nil(someObj, "someObj should have been nil but it is %v, and the test continues", someObj)

Revision as of 18:00, 12 March 2024

External

Internal

Overview

require and assert packages provide functions to evaluate arguments and establish whether the test passes or fails.

The major difference between require and assert is that assert means continue on error. If an assertion fails, the test reports it and continues. In the end, the test is accounted as "failed", but it keeps going to the end. This is different from the behavior of assert in other languages and frameworks, where the first failed assertion stops the current test. This does not make too much sense - if an assertion is broken, I am not that interested in what comes after that, they are likely to be broken too, or at least, not trustworthy. If you want the test to exit after the first failed assertion, use require. require means exit on error.

Internally, this is implemented by assert calling Fail() and require calling FailNow().

Equality and Non-Equality

In case the result is failure, Equal() and NotEqual() delegate to Fail().

package somepkg

import (
	"testing"

	testifyassert "github.com/stretchr/testify/assert"
    testifyrequire "github.com/stretchr/testify/require"
)

func TestSomething(t *testing.T) {
	assert := testifyassert.New(t)
    require := testifyrequire.New(t)
    assert.Equal(123, 123, "this message is displayed when the assertion fails, but the test continues %s", "because of inequality")
    require.Equal(123, 123, "this message is displayed when the test fails and exists %s", "because of inequality") 
	assert.NotEqual(123, 321, "this message is displayed when the test fails %s", "because of equality")
    require.NotEqual(123, 321, "this message is displayed when the test fails and exists %s", "because of inequality") 
}

Nil and Non-Nil

In case the result is failure, Nil() and NotNil() delegate to Fail().

package somepkg

import (
	"testing"

	testifyassert "github.com/stretchr/testify/assert"
    testifyrequire "github.com/stretchr/testify/require"
)

func TestSomething(t *testing.T) {
	assert := testifyassert.New(t)
    require := testifyrequire.New(t)
	someObj := &struct{}{}
	assert.NotNil(someObj, "someObj should not have been nil but it is %v, and the test continues", someObj)
	require.NotNil(someObj, "someObj should not have been nil but it is %v, and the test exits", someObj)
	someObj = nil
	assert.Nil(someObj, "someObj should have been nil but it is %v, and the test continues", someObj)
    require.Nil(someObj, "someObj should have been nil but it is %v, and the test exits", someObj)
}

Failing the Test

Fail()

Failf()

FailNow()

Failing a Test from a Goroutine

package yours

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

func TestSomething(t *testing.T) {

  assert := tassert.New(t)

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

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

  // assert for nil (good for errors)
  assert.Nil(object)

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

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

To check that an error has the expected message:

err := ...
assert.NotNil(err)
assert.Equal(err.Error(), "expected message")

Failing the Test