testify - 標準ライブラリでうまく動作する共通のアサーションとモックを備えたツールキット

(A toolkit with common assertions and mocks that plays nicely with the standard library)

Created at: 2012-10-17 00:43:17
Language: Go
License: MIT

証する - あなたはテストを書く

ℹ️私たちはv2の証言に取り組んでおり、あなたがその中で見たいものを聞きたいです、ここであなたの意見を持ってください:https://cutt.ly/testify

ビルドステータス レポートカードに移動 PkgGoDev

Go code (golang) パッケージのセットは、コードが意図したとおりに動作することを証明するための多くのツールを提供します。

機能は次のとおりです。

はじめに:

アサートパッケージ

このパッケージは、Goでより良いテストコードを書くことを可能にするいくつかの便利なメソッドを提供します。

assert

  • 印刷しやすく、読みやすい障害の説明
  • 非常に読みやすいコードを実現
  • オプションで、各アサーションにメッセージで注釈を付ける

実際の動作をご覧ください。

package yours

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

func TestSomething(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)

  }

}
  • すべてのアサートfuncは、オブジェクトを最初の引数として受け取ります。これは、通常の機能を介してエラーを書き出す方法です。
    testing.T
    go test
  • すべてのassert funcは、アサーションが成功したかどうかを示すブール値を返すため、特定の条件下でさらにアサーションを行いたい場合に便利です。

何度もアサートする場合は、以下を使用します。

package yours

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

func TestSomething(t *testing.T) {
  assert := assert.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)
  }
}

パッケージが必要

パッケージはパッケージと同じグローバル関数を提供しますが、ブール値の結果を返す代わりに、現在のテストを終了します。

require
assert

詳細については、t.FailNow を参照してください。

モックパッケージ

このパッケージは、テストコードを書くときに実際のオブジェクトの代わりに使用できるモックオブジェクトを簡単に書くためのメカニズムを提供します。

mock

外部オブジェクトに依存するコードをテストするテスト関数の例は、期待を設定(証言)し、実際に起こったことをアサートすることができます。

testObj

package yours

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

/*
  Test objects
*/

// 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.
func TestSomething(t *testing.T) {

  // create an instance of our test object
  testObj := new(MyMockedObject)

  // setup expectations
  testObj.On("DoSomething", 123).Return(true, nil)

  // 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)
func TestSomethingWithPlaceholder(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.
func TestSomethingElse2(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)
}

モック コードの記述方法の詳細については、モック パッケージの API ドキュメントを参照してください

ックリーツールを使用して、インターフェイスに対してモックコードを自動生成することもでき、モックの使用がはるかに高速になります。

スイートパッケージ

このパッケージは、より一般的なオブジェクト指向言語から使い慣れた機能を提供します。これにより、テストスイートを構造体としてビルドし、セットアップ/ティアダウンメソッドとテストメソッドを構造体にビルドし、通常どおり「go test」で実行できます。

suite

スイートの例を以下に示します。

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

// 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
func TestExampleTestSuite(t *testing.T) {
    suite.Run(t, new(ExampleTestSuite))
}

suite パッケージによって提供されるすべての機能を使用するより完全な例については、テストスイートの例を参照してください。

スイートの作成の詳細については、スイート パッケージの API ドキュメントを参照してください

Suite
オブジェクトにはアサーションメソッドがあります:

// Basic imports
import (
    "testing"
    "github.com/stretchr/testify/suite"
)

// Define the suite, and absorb the built-in basic suite
// functionality from testify - including assertion methods.
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() {
    suite.Equal(suite.VariableThatShouldStartAtFive, 5)
}

// In order for 'go test' to run this suite, we need to create
// a normal test function and pass our suite to suite.Run
func TestExampleTestSuite(t *testing.T) {
    suite.Run(t, new(ExampleTestSuite))
}

取り付け

証言をインストールするには、以下を使用します。

go get

go get github.com/stretchr/testify

これにより、次のパッケージが利用可能になります。

github.com/stretchr/testify/assert
github.com/stretchr/testify/require
github.com/stretchr/testify/mock
github.com/stretchr/testify/suite
github.com/stretchr/testify/http (deprecated)

このテンプレートを使用して、パッケージをコードにインポートします。

testify/assert

package yours

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

func TestSomething(t *testing.T) {

  assert.True(t, true, "True is true!")

}

最新情報を入手する

[証言] を最新バージョンに更新するには、 を使用します。

go get -u github.com/stretchr/testify


サポートされている囲碁版

現在、1.13 以降の最新のメジャー Go バージョンがサポートされています。


貢献

問題を提出し、リポジトリをフォークし、プルリクエストを送信してください!

問題を送信するときは、問題を示す完全なテスト関数を含めるようお願いします。Testifyを使用してそれを示すテストコードを書く人のための追加のクレジット。

コード生成が使用されます。いくつかのファイルの先頭を探します。[実行] を実行して、生成されたファイルを更新します。

CODE GENERATED AUTOMATICALLY
go generate ./...

また、 とチャンネルの Gophers Slack グループでもチャットしています。

#testify
#testify-dev


ライセンス

このプロジェクトは、MITライセンスの条項に基づいてライセンスされています。