15

私は自分のコードをテストすることに慣れています。Go を初めて使用するようになったので、できるだけ早く正しくできるように努めています。標準ライブラリの testing パッケージを使用していますが、これで十分だと思われます。(また、それが別の外部依存関係ではないことも気に入っています。現在、Java または Ruby プロジェクトと比較して、全体で 2 つの依存関係があります.....) とにかく - golang の assert は次のようになります。

func TestSomething(t *testing.T) {
  something := false
  if something {
    t.Log("Oh noes - something is false")
    t.Fail()      
  }
}

これは冗長で、代わりに 1 行で実行したいと思います。

Assert( something, "Oh noes - something is false" )

またはそのようなもの。ここで明らかな何かを見逃したことを願っています。goでそれを行うための最良/慣用的な方法は何ですか?

更新:明確にするために。私がこのようなことをしたとしたら:

func AssertTrue(t *testing.T, value bool, message string) {
  if value {
    t.Log(message)
    t.Fail()
  }
}

そして、このように私のテストを書きます

func TestSomething(t *testing.T) {
  something := false
  AssertTrue(t, something, "Oh noes - something is false")
}

それはそれを行う方法ではないでしょか?

4

4 に答える 4

17

ストック テスト フレームワークと統合できる外部パッケージがあります。

私がかなり前に書いたもののうちの 1 つであるgocheckは、そのようなユース ケースを分類することを目的としていました。

これにより、テスト ケースは次のようになります。たとえば、次のようになります。

func (s *Suite) TestFoo(c *gocheck.C) {
    // If this succeeds the world is doomed.
    c.Assert("line 1\nline 2", gocheck.Equals, "line 3")
}

を使用して通常どおり実行するとgo test、そのチェックの失敗は次のように報告されます。

----------------------------------------------------------------------
FAIL: foo_test.go:34: Suite.TestFoo

all_test.go:34:
    // If this succeeds the world is doomed.
    c.Assert("line 1\nline 2", gocheck.Equals, "line 3")
... obtained string = "" +
...     "line 1\n" +
...     "line 2"
... expected string = "line 3"

コードのすぐ上のコメントが、報告された失敗にどのように含まれていたかに注意してください。

スイートやテスト固有のセットアップや分解ルーチンなど、他にも多くの通常の機能があります。詳しくはウェブページをご覧ください。

私や他の人々が多くのアクティブなプロジェクトで使用しているため、よく維持されているので、気軽に参加したり、フォローアップして、好みに合った他の同様のプロジェクトをチェックしたりしてください.

gocheck の使用例については、mgogoyamlgoamzpipevclockjuju (大規模なコード ベース)、lpadgozkgoetveldtombなどのパッケージをご覧ください。それをブートストラップするのはとても楽しかったです。

于 2013-09-05T14:19:27.617 に答える
1

しかし、Uncle Martin のように、テストに 1 つの assert と長い関数名を使用してテストを記述しようとすると、 http: //github.com/stretchr/testify/assertのような単純な assert ライブラリを使用すると、はるかに高速かつ簡単になります。

于 2013-09-07T09:35:20.910 に答える