テストを不安定にする5つの残念な書き方(翻訳)|TechRacho(テックラッチョ)〜エンジニアの「?」を「!」に〜|BPS株式会社エンジニアの「?」を「!」に。テストを不安定にする5つの残念な書き方(翻訳)hachi8833シェアツイートブックマークLINEこんにちは、hachi8833です。今回はテストを正しく書く方法を解説する記事の翻訳をお送りします。原著者の許諾を得て翻訳・公開いたします。Shatrov(@kirshatrov)テストを不安定にする5つの残念な書き方(翻訳)不安定なテストは、毎日の苦労を台無しにしてくれる技術上の負債の一部となります。テストが不安定だとCIが赤信号になってしまい、それだけのために新しいコードのリリースを中断してビルドをやりなおすはめになります。実際のコードはどこもおかしくないのに、どこかがおかしいのではないかという疑念が湧くと、ストレスの元になります。数百人の開発者と5万件のテスト項目があるような大規模案件では、不安定なテストが混入する可能性がさらに高まります。本記事で扱うデモの中には、テストの実行順序に関連するものもありますが、そうでないものもあります。テストの実行順序とは何か、それがテストにどう関連するのか。それを確認する一番の方法は、テストの実行順序をランダムにしてみることでしょう。すれば、あるテストが他のテストに紐付けられていないことと、テストが実行順序に依存していないことがわかります。本記事ではMiniTestを用いますが、どの問題もフレームワークに依存しないものばかりなので、MiniTestであるかRSpecであるかを問わず、一般的に応用できます。Faker::Internet.safe_email)endどこに問題があるかおわかりでしょうか。このテストはほとんどの場合パスしますが、ごくたまに、既に使ったメールアドレスがFakerからもう一度返されることがあります。unique制約エラーに引っかかってテストがクラッシュするというわけです。正しい書き方はこうです。Faker::Internet.safe_email(n.to_s))endFakerに渡す引数を、(デフォルトの)ランダムなメールではなく、n番目のメールを指定するのがポイントです。@products.pluck(:quantity))このテストもほぼすべてのケースでパスしますが、ORDERなしのSELECTクエリではレコードの順序が保証されません。したランダムな要素が原因のエラーを回避するには、次のように明示的に順序を指定します。BulkEditor.attributes_for(@user)私の経験した例では、登録されたモデルのリストをBulkEditorがグローバルな環境に保存していたことがありました。これでテストを実行するとレジストリが汚されてしまい、その後に実行される他のテストが影響されてしまいます。順序依存の一丁上がりです。解決方法は次のとおりです。BulkEditor.unregister(User)end私の経験したグローバル環境汚染からもうひとつご紹介しましょう。@provider.supported?endこのテストコードの後に実行されるテストでは、SomeGem::VERSIONから返る値がおかしくなってしまいます。SomeGem::VERSION」が表示されます。解決方法は次のとおりです。post.published_atこのテストは通常であればパスしますが、ごくたまに、postの公開に要する時間が1msecを超え、かつ#published_atの所要時間が1.hour.from_nowを超えることがあります。いう場合に便利なのは、#assert_in_deltaという特殊なヘルパーメソッドです。1.second他にも、Timecopなどのライブラリで時間を止める方法があります。requireに依存するテストテスト用のクラスが2種類あり、1つはリモートHTTP呼び出しを許可するがもう1つは許可しないとします。以下のような感じのコードになるでしょう。endend外部へのHTTP呼び出し用に#remote_test_helperを使うテストが大量にあるとします。私見では、こうしたテストは単独であればおそらく完璧に動作します。CIですべてのテストを通しで実行すると、テストの順序によってはリモート呼び出しの後のあらゆるテストで外部呼び出しができてしまう可能性があります?requireはグローバルであり、グローバルな状態を変更します。このことを肝に銘じておいてください。よい解決方法は、特定のテストのコンテキストのみを変更するマクロを使うことです。endendまとめ実行結果の不安定なテストの修正はたいてい面倒なものであり、それだけでブログ記事が1本書けるほどです。した不安定な要素をテストに持ち込まないよう注意することをおすすめします。不安定なテストについてご興味がおありの場合は、以下の英語記事をご覧ください。コボラー、ITコンサル、ローカライズ業界、Rails開発を経てTechRachoの編集・記事作成を担当。チュートリアル第2版の監修および半分程度を翻訳、Railsガイドの初期翻訳ではほぼすべてを翻訳。その後も折に触れて更新翻訳中。enno.jpを運営。実は最近Go言語が好きで、Goで書かれたRubyライクなGoby言語のメンテナーでもある。仕事に関係ないすっとこブログ「あけてくれ」は2000年頃から多少の中断をはさんで継続、現在はnote.muに移転。Storageを使ってはいけない(翻訳)#Tags#会社紹介#自社サービス#勉強会#Rails#PHP#デザイン#実績#週刊RailsウオッチCONTACTお気軽にご相談ください。(翻訳)CONTACTTechRachoでは、パートナーシップをご検討いただける方からのご連絡をお待ちしております。お気軽にご意見・ご相談ください。