それさえも平凡な日々おそらくはそれさえも平凡な日々ArchivesProfile旧Blog二十四節気スプリントシステムのススメツイートGoGoでテスト中に現在時刻を差し替えたりするflextimeというのを作ったhttps://github.com/Songmu/flextimeflextimeはテストコードの中で現在時刻を切り替えるためのライブラリです。Sleep時に実際に時間を止めずに時間が経過したように見せかける機能もあります。PerlのTest::MockTimeやRubyのtimecop的なことをしたいわけですが、Goだとグローバルに関数の挙動を切り替えるといったことはできないため、利用にあたってはtimeパッケージで使っている関数を、flextimeパッケージに切り替える必要があります。具体的には、flextimeはtimeパッケージと同様のインターフェースを備える以下の9つの関数を提供しています。flextime.Tick(3*time.Second)これらはデフォルトでは標準timeパッケージと同様の動作をするため、単純に置き換え可能です。乱暴ですが、以下のような単純置換でも大体動くでしょう。本来静的解析でやるべきですが...。.使い方SetやFix関数を使うことで上記の9つの関数の挙動を差し替えます。Restoreでもとに戻します。元の挙動に戻すSetとFixの違いは、Setは実際の時間経過の影響を受けますが、Fixは完全に固定されるところです。仕組み内部的に時刻を返すオブジェクト(内部clock)を差し替えることで実現しています。interfaceを満たしたオブジェクトです。flextime.Nowなどの関数はそのオブジェクトに処理を委譲している形になります。interafaceというアプローチは以下の様な先行実装を参考にしました。https://github.com/cloudfoundry/clockhttps://github.com/jonboulle/clockworkそのinterfaceをより標準timeパッケージに近づけつつ、内部的に差し替えるアプローチにより、easyに使えるようにしたのが、このflextimeです。Fixだけではなく、独自のClockインターフェースを備えたオブジェクトを作って、それに内部clockを差し替えることもできます。インターフェースの関数群は、NowとSleepの2つさえあれば、他の関数を実現することができます。インターフェースとして定義しており、これを満たすだけで、以下のように独自Clockを簡単に作ることができます。flextime.NewFakeClock(ns)flextime.Swtich(clock)なかなかflexibleと言えるのではないでしょうか。名前のflextimeも気に入っています。testabilityの向上に有用ではないでしょうか。ちなみに、弊社はフレックスタイム制を採用しています。採用にご興味があればぜひご応募ください。