毎日更新

81日目 Qiita投稿

こんばんは。

今日は、「久々にQiita書いたよ」というテーマです。

昨日、久々にQiita記事をを書きました。

【Laravel テスト】フォームリクエスト 複数項目バリデーションのテストコードを書いてみた

自分を売り込むためのTwitter運用やブログ更新だったりしますが、エンジニアである以上QiitaやGithubへの露出も増やしていきたいなと思い始めました(Qiita経由でスカウト何件ももらってるという話を身近で聞いちゃったので)。
バズるかどうかなんて二の次、ブログと同じでまずは投稿しまくって「投稿へのハードルを下げる」ところからスタートです。(これめっちゃ大事)

今回の記事は、『Laravelのフォームリクエストで複数項目のバリデーションを行うテストコードの書き方』というかなりニッチな内容になっておりますが、自分が実装するにあたって1つの記事では情報収集しきれず複数の情報源を使ったので、少なくとも同じような人がこれまでにもいたはず。実際、参考にしたQiita記事の1つに、「複数項目の時はどう書けばいいですか?」というコメントが投稿されていて未回答状態だったので、「少ないながらも需要はありそうだ」と思い書くことにしました。

投稿してみると、早速コメントをいただきました。(本当にありがたい!)

1つ目のコメントは、テストケースの書き方について。

「ユーザー登録」を題材に記事を書いたんですが、フォームのリクエストは4項目(name, email, password, password_confirmation)あり、それぞれのバリデーション項目についてテストを行うと結構なテストケース数になってしまいました。

//バリデーションルール一覧
public function rules()
{
    return [
        'name' => 'required|string|max:255',
        'email' => 'required|email|max:255|unique:users',
        'password' => 'required|min:8|confirmed',
    ];
}
public function dataUserRegistration()
{
    //テストケース一覧
    return [
            'OK' => [
                ['name', 'email', 'password', 'password_confirmation'],
                ['testuser', 'test@example.com', 'password', 'password'],
                true
            ],
            '名前必須エラー' => [
                ['name', 'email', 'password', 'password_confirmation'],
                [null, 'test@example.com', 'password', 'password'],
                false
            ],
            '名前形式エラー' => [
                ['name', 'email', 'password', 'password_confirmation'],
                [1, 'test@example.com', 'password', 'password'],
                false
            ],
            '名前最大文字数エラー' => [
                ['name', 'email', 'password', 'password_confirmation'],
                [str_repeat('a', 256), 'test@example.com', 'password', 'password'],
                false
            ],
            'OK' => [
                ['name', 'email', 'password', 'password_confirmation'],
                [str_repeat('a', 255), 'test@example.com', 'password', 'password'],
                true
            ],
            'email必須エラー' => [
                ['name', 'email', 'password', 'password_confirmation'],
                ['testuser', null, 'password', 'password'],
                false
            ],
            'email形式エラー' => [
                ['name', 'email', 'password', 'password_confirmation'],
                ['testuser', 'test@example.', 'password', 'password'],
                false
            ],
            'email最大文字数エラー' => [
                ['name', 'email', 'password', 'password_confirmation'],
                ['testuser', str_repeat('a', 255) . '@example.com', 'password', 'password'],
                false
            ],
            'emailユニークエラー' => [
                ['name', 'email', 'password', 'password_confirmation'],
                ['testuser', $this->user->email, 'password', 'password'],
                false
            ],
            'password必須エラー' => [
                ['name', 'email', 'password', 'password_confirmation'],
                ['testuser', 'test@example.com', '', ''],
                false
            ],
            'password最小文字数エラー' => [
                ['name', 'email', 'password', 'password_confirmation'],
                ['testuser', 'test@example.com', 'pass', 'pass'],
                false
            ],
            'password一致エラー' => [
                ['name', 'email', 'password', 'password_confirmation'],
                ['testuser', 'test@example.com', 'password', 'password1'],
                false
            ],
        ];
}

4項目に対してこのケース数なので、「メインコンテンツの登録メソッド」などはもっと項目数が多くなり「指数関数的にケース増えちゃうよな〜」と思っていたところ、「Laravelで用意されているバリデーション項目(reqiredやemailなど)はいちいち確認しなくてもいいですよ〜。その代わりテストメソッドrules()の戻り値をすれば良いですよ」というコメントをいただきました。(コードの修正はまだできてない)

なるほど、たしかにフレームワークで用意されたバリデーションをわざわざテストする必要がないってのは納得。境界値のテストくらいやればいいのかな?

あとは、「フォームリクエストのテストはfeatureじゃなくてunitテストだよ」ってことも教えていただきました。

さらに、「テストケースで使用していたサンプルのメールアドレス『〇〇@gmail.com』は、もし実在するアドレスだた場合に事故になりかねないので、公式に用意されているダミードメインである@example.comなどを使いましょう」という指摘をいただきました。

「え?なにそれ?」って感じだったけど、test.comやaaa.comをテストデータに使うのはやめましょうという話を見たら超納得。。ちょっと考えたら分かることかもしれないけど、今まで一度たりとも脳裏をよぎったことすらなかった。。

コメントくださった方が「自分も知らなかった時代は何度も事故を起こしかけただろうし、新しい人たちが先輩の失敗を繰り返さないように見つけ次第お伝えしております。」と仰ってました(マジの神様現る)。

また一つ成長しました。

自分から発信をすれば、こうして「親切心」で情報をいただくこともあります。自分が情報をもらうには、「その10倍自分が発信」しなきゃだめだよなーと改めて思いましたね。

これからはもうちょっと頻度上げてQiita更新していきたい。2週間に1回くらいのペースで。

おわり。

  • この記事を書いた人

きわっち

元食品メーカー製造マンが未経験からwebエンジニアになりました。 エンジニアとして0から成長していく過程を発信していきたいと思っています。

© 2021 きわっちのブログ Powered by AFFINGER5