概念
抽選・a/bテストなどの場合、パーセンテージで実行したいコードやユーザーフローが代わります。そのため、9.xでLottery
のヘルパが追加され、簡単にこのような機能を実装やテストができるようになりました。
シナリオ
サービスで新しいキャンペーンがあり、抽選で5人の内一人にスーパー割引クーポンが当たるというシナリオを使います!
シナリオを普通のphpで実装した場合
下記の普通のphp
でシナリオを実装できる。結構シンプルで実装できますね!
if (rand(1, 5) === 1) { // 当選する率(5人の内の一人)
dd('おめでとう'); // 当選する処理
} else {
dd('残念'); // 外れる処理
}
Lotteryヘルパの使い方
Lotteryのodds()
関数で当選する率を設定し、winner()
「当選する」とloser()
「外れる」のそれぞれの関数に実行したいコードをクロージャとして渡します。全体を実行するときにはchoose()
「選択」の関数を実行する
use Illuminate\Support\Lottery;
Lottery::odds(1, 5) // 当選する率(5人の内の一人)
->winner(function () {
dd('おめでとう!'); // 当選する処理
})
->loser(function () {
dd('残念!'); // 外れる処理
})
->choose(); // 抽選実行
上記の例はintegerで率(1/5)を渡していますが、float(.2)でも渡す可能です。
抽選のテスト
ここまで読んだ方の中に「この抽選機能は普通のphpで簡単に実装でき、本当にこのヘルパは必要ある」という疑問を持っている方はいると思います。その意見はわかります。しかし、テストで上記のシナリオを普通のphpで当たる・外れるのそれぞれのテストを実装するのは非常に難しいです。 Lotteryヘルパはテスト専用の関数もあり、抽選のそれぞれのパターンを簡単にテスできるようになり、それはLotteryヘルパの一番魅力的の点です。
Lotteryヘルパのテスト仕方
LotteryヘルパはalwaysWin()
「常に当選する」とalwaysLose()
「常に外れる」の関数もあり、テスト内でそれぞれのパターンを簡単に実装できます。
//テスト内で
Lottery::alwaysWin(); // 常に当選する
// 実装
Lottery::odds(0) // 当選する率を0%にしても。。。
->winner(function () {
dd('おめでとう!');
})
->loser(function () {
dd('残念!');
})
->choose();
// おめでとう!
まとめ
Lotteryヘルパで抽選のような機能の実装やテストが簡単にできるようになれ、これから使ってみましょう!