いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Goメモ-603 (nalgeon/be)(シンプルなテスト用アサートライブラリ, Err)

関連記事

GitHub - devlights/blog-summary: ブログ「いろいろ備忘録日記」のまとめ

概要

以下、自分用のメモです。忘れないうちにメモメモ。。。

以下のブログ記事から nalgeon/be というライブラリを知りました。

antonz.org

めっちゃシンプルで使いやすいですね。個人的にドンピシャなライブラリです。

こんな感じでシンプルなのが良いんですよ。それぞれがジェネリック対応となっているため、どのような型でもアサート出来るようになっています。

関数も

  • Equal
  • Err
  • True

の3つだけです。

自分用に使い方のメモを残しておくことにしました。今回は Err 関数。

サンプル

be_err_test.go

package main

import (
    "errors"
    "fmt"
    "reflect"
    "testing"

    "github.com/nalgeon/be"
)

type (
    ValueError struct {
        V int
    }
)

var _ error = (*ValueError)(nil)

func (v *ValueError) Error() string {
    return fmt.Sprintf("invalid value: %d", v.V)
}

var (
    ErrInvalid = errors.New("invalid value")
)

func errSometime(v int) error {
    switch {
    case v > 100:
        return &ValueError{v}
    case v > 10:
        return ErrInvalid
    default:
        return nil
    }
}

func TestBeErr(t *testing.T) {
    t.Run("ok", func(t *testing.T) {
        be.Err(t, errSometime(1), nil)
    })
    t.Run("ng", func(t *testing.T) {
        be.Err(t, errSometime(99), nil)
    })
    t.Run("return-nil", func(t *testing.T) {
        err := errSometime(5)
        be.Err(t, err, nil)
    })
    t.Run("return-err", func(t *testing.T) {
        err := errSometime(99)
        be.Err(t, err)
    })
    t.Run("check-message", func(t *testing.T) {
        err := errSometime(20)
        be.Err(t, err, "invalid") // 指定したメッセージが含まれていればOKとなる
    })
    t.Run("check-type-is", func(t *testing.T) {
        err := errSometime(20)
        be.Err(t, err, ErrInvalid)
    })
    t.Run("check-type-as", func(t *testing.T) {
        err := errSometime(199)
        be.Err(t, err, reflect.TypeFor[*ValueError]()) // Asの場合は reflect.Type を指定する
    })
}

実行例

$ task
task: [default] go test -v
=== RUN   TestBeErr
=== RUN   TestBeErr/ok
=== RUN   TestBeErr/ng
    be_err_test.go:44: unexpected error: invalid value
=== RUN   TestBeErr/return-nil
=== RUN   TestBeErr/return-err
=== RUN   TestBeErr/check-message
=== RUN   TestBeErr/check-type-is
=== RUN   TestBeErr/check-type-as
--- FAIL: TestBeErr (0.00s)
    --- PASS: TestBeErr/ok (0.00s)
    --- FAIL: TestBeErr/ng (0.00s)
    --- PASS: TestBeErr/return-nil (0.00s)
    --- PASS: TestBeErr/return-err (0.00s)
    --- PASS: TestBeErr/check-message (0.00s)
    --- PASS: TestBeErr/check-type-is (0.00s)
    --- PASS: TestBeErr/check-type-as (0.00s)
FAIL
exit status 1
FAIL    github.com/devlights/try-golang/examples/testing/be_library/err 0.003s

参考情報

antonz.org

github.com

github.com

Goのおすすめ書籍


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。