2024/02/26

actually その後

actually は Go の testing ライブラリです。明示的なインターフェースと一貫性の高いメソッド群、そしてメンテナンスやリファクタリングの際に力を発揮するフェイルレポートを備えています。

actuallyのリポジトリはこちらです。

今回は、この actually について、最近のアップデート内容について簡単にまとめます。

  • フェイルレポートとhelperの一部を分離
  • アサーションメソッドの拡充
  • エイリアスメソッドの追加
  • テストカバレッジの改善
  • Fi() と witness へのインターフェース

ひとつひとつ見ていきます。

フェイルレポートとhelperの一部を分離

actually はいわゆるアサーションライブラリになります。テスト対象の値と、期待値を受け取って、アサーション関数を呼ぶことの繰り返しです。アサーションの結果、パスすれば単純ですが、入力値と期待値が異なる場合、フェイルレポートを出力します。アサーションライブラリの中身は大きくこのアサーション関数群とフェイルレポートに2分されるわけですが、actually においては、フェイルレポートを witness という別ライブラリに切り出しています。

フェイルレポート部分を別ライブラリに切り出した利点は、コードベースが小さくなったこと。これはライブラリ作者にとってだけでなく、利用者にとっても参照が簡単になってメリットがあります。アサーションライブラリはなんだかんだソースコードレベルで参照することがあると思うので。

また、ファイルレポートの生成部分だけを再利用することももちろん可能です。アサーションを書くことがあったら是非ご利用ください。

アサーションメソッドの拡充

比較的最近追加されたアサーションメソッドには以下のようなものがあります。

  • Panic / NoPanic
  • NotSame
  • Match / NoMatch
  • Len

あと、うっかり実装を忘れていたものとして、ヘルパー関数の Dump も追加されています。

エイリアスメソッドの追加

actuallyでは、Got(got) Expect(expect) というセッターでテスト値を設定しますが、Actual(got) Want(expect) というエイリアスを追加して、お好みで使えるようになりました。

プロジェクトの中でどのメソッドに統一するかは決めた方が良いと思いますが、actually を利用することで、いずれかのセッター名に縛られることが無いようになりました。

テストカバレッジの改善

数か月前まで 60% くらいだったテストカバレッジを 92% まで改善しました。

Fi() と witness へのインターフェース

Fi()

actually のアサーション関数はチェインするために、原則として *testingA オブジェクトを返却します。通常のアサーション関数が、成功なら true、失敗なら false を返すのとは異なっています。そのせいで、これまでテストがこけたときに独自に何か処理を書きたい、ということができませんでした。そういう場面のために、Fi というメソッドを追加しました。

if res := actually.Got(true).False(t).Fi(); !res {
    // your own some action on fail
}

witness へのインターフェース

前述した通り、フェイルレポート部分を別ライブラリに分離したのですが、actually から直接レポートだけ生成する機能を逆に追加しました。

アサーション関数がない場合に、つい自力でフェイルレポートを生成することになりがちですが、もう、t.Errorf しなくて大丈夫です。

if got != expect {
    actually.Fail(t, "Not same", got, expect)
}

これだけで、got/expectの型に応じて修飾されたフェイルレポートが出力されます。

まとめ

最近の actually の更新内容についてまとめてみました。アサーションメソッドについては、ひととおり揃ったかなという感じです。testify にはあるけど actually には無い、というアサーションは、基本的に実装しない、と判断したものになります(機会があればその辺の判断基準についてもどこかで書きたい)。ただ、要望があれば実装していくのはやぶさかではないので、もし、あとこれがあったら actually 使うのに、というのがあったら教えてください。すぐやります :smile:

actuallyのリポジトリ

サイト内検索