Upgrade to Pro — share decks privately, control downloads, hide ads and more …

xUnit Test Patternsから学ぶテストアンチパターン / testing anti-pattern learned in xUnit test pattern

xUnit Test Patternsから学ぶテストアンチパターン / testing anti-pattern learned in xUnit test pattern

Kazuki Higashiguchi

March 20, 2019
Tweet

More Decks by Kazuki Higashiguchi

Other Decks in Technology

Transcript

  1. @hgsgtk Kazuki Higashiguchi job is … Software Engineer lang is

    ... PHP, Go ...etc belongs to ... BASE BANK株式会 社 (BASE株式会社の100%子会社) 3
  2. 『xUnit Test Patterns』 Title: xUnit Test Patterns: Refactoring Test Code

    Author: Gerard Meszaros 5 https://www.amazon.co.jp/dp/0131495054/ref=cm_sw_r_tw_dp_U_x_Y8kJCb6EX02F6
  3. = • 自動ユニットテストにおける原則・パターンなどが体系的にまとめられている書 籍 • ウェブページでも閲覧可能 ◦ http://xunitpatterns.com/ • 自動ユニットテストにおける「原則」について整理されていたり

    ◦ Chapter 5 Principles of Test Automation ◦ See also: xUnit Test Patternsから学ぶ12個のユニットテストの原則 by @hgsgtk ▪ https://qiita.com/hgsgtk/items/a3186a250d36d3b224d9 • 現在は英書のみ 6 『xUnit Test Patterns』
  4. = Test Smellsとは • テストにまつわる問題の兆候 3つのカテゴリ分け • Test Code Smells

    ◦ 開発者やテスターがテストを読み書きする際の コーディングレベルのアンチパターン • Behavior Smells ◦ コンパイル時やテスト実行時 に出くわす ◦ 無視するのが難しい “Smell”、テストの失敗がとても不都合な時に発生しうる • Project Smells ◦ テストコードを読んだり実行したりしない、プロジェクトマネージャや顧客が気づく ◦ プロジェクト全体的な健全性の指標 取り除くには • “Five Why’s” ◦ 「問題の要因は何?」 →「その要因はなぜ発生した?」 → (repeat) 8 Test Smells
  5. Code Smells One of Test Smells • Obscure Test •

    Conditional Test Logic • Hard-to-Test Code • Test Code Duplication • Test Logic in Production 9
  6. = • ひと目で理解することが難しいテスト • 自動化テストの2つの目的 ◦ 「テスト対象がどう振る舞うべきか 」を示すドキュメント ◦ それ自身が実行可能な仕様

    • メンテナンスコストの高いテストに繋がりうる • いくつかの原因 ◦ Eager Test ◦ Mystery Guest ◦ General Fixture ◦ Irrelevant Information ◦ Hard-coded Test Data ◦ ...etc 10 Obscure Test
  7. = • 一つのテストケースでたくさん機能を検証しすぎているテスト ◦ 例えば次のように1テストケースで複数Functionを検証している 11 Eager Test - a

    cause of Obscure Test - • それによる弊害 ◦ 一テストケースでの可読性の低下 ◦ 一つが失敗すると後続が検証されない • → Singile-Conditin Tests へ ◦ 一つの機能を独立して検証する ◦ 原因の特定をしやすくする
  8. = • そもそもテストが難しいコード ◦ ex. GUIコンポーネント・マルチスレッド・テストコード自体 • →テスタビリティの良いコードへ • いくつかの原因

    ◦ Highly Coupled Code ◦ Asynchronous Code ◦ Untestable Test Code • See also Principles ◦ “Write the Tests First” ◦ ”Design for Testability” ◦ “Minimize Untestable Code” ◦ See also: https://qiita.com/hgsgtk/items/a3186a250d36d3b224d9 13 Hard-to-Test Code
  9. = • 他のクラスのテスト無しでテストできないクラス • 原因 ◦ 設計不足 ◦ オブジェクト志向設計の経験不足 ◦

    疎結合な構造への意識不足 • →テスト駆動開発 ◦ 自然と”密結合”を避けるようになる ◦ See alos: “テストが辛いを解決するテスト駆動開発のアプローチ at PHPカンファレンス仙台 2019” by @hgsgtk ▪ https://speakerdeck.com/hgsgtk/tesutokaxin-iwojie-jue-surutesutoqu-dong-kai-fa-fal seahuroti-at-phpkanhuarensuxian-tai-2019 • →コードを分離するための手法 ◦ Test Double (Test Stub or Mock Object) • → オブジェクト指向設計を学ぶ ◦ BASE社内勉強会「オブジェクト指向設計勉強会」 ▪ 教材:『オブジェクト指向設計実践ガイド ~Rubyでわかる 進化しつづける柔軟なアプリ ケーションの育て方』 14 Highly Coupled Code - a cause of Hard-to-Test Code -
  10. = • 同じテストコードが何度も繰り返される ◦ ex. setup fixture. assertion • いくつかの原因

    ◦ Cut-and-Paste Code Reuse ◦ Reinventing the Wheel Reinventing the Wheel • 「車輪の再発明」 • 便利な Test Utility があるならそれを使おう ◦ ex. 使用フレームワークの Test Utility 15 Test Code Duplication
  11. = • テスト対象にテスト環境では動かないロジックがある • それゆえ、テストをサポートするだけのロジックが含まれてしまう 16 Test Logic in Production

    • 弊害 ◦ 本番同等の動作をテストできていない • → Test Specific Subclass の使用 ◦ 特定の振る舞いだけを上書きしたクラス • → Test Double の使用
  12. Behavior Smells One of Test Smells • Assertion Roulette •

    Erratic Test • Fragile Test • Frequent Debugging • Manual Intervention • Slow Tests 17
  13. = • 同じテストメソッド内のどれかのアサーションが失敗する • いくつかの原因 ◦ Eager Test ▪ 一つのテストでたくさんの機能を検証しすぎてる

    ◦ Missing Assertion Message Missing Assertion Message • アサーションの失敗原因を特定するメッセージの設定がない • 参考になる考え方:Why does Go not have assertions? ◦ https://golang.org/doc/faq#assertions ◦ “thinking about proper error handling and reporting.” 18 Assertion Roulette
  14. = • 不安定なテスト ◦ 時々通るし時々落ちる • 弊害 ◦ 失敗時のトラブルシューティングが難しい ▪

    ex. 順序に依存したテスト ▪ → 原因特定用のTestSuiteを一時的に作ってデバッグする 19 Erratic Test
  15. = • 壊れやすいテスト • テスト対象の変更に敏感に反応してテストが落ちる • いくつかの原因 ◦ Interface Sensitivity

    ◦ Behavior Sensitivity ◦ Data Sensitivity ◦ Context Sensitivity Data Sensitivity • テストデータの変更に敏感 • Shared Fixture(共有されたフィクスチャ)の変更 • →テスト実行前に状態チェック ◦ 他の変更による影響を受けていないかを確認する 20 Fragile Test
  16. Project Smells One of Test Smells • Buggy Tests •

    Developers Not Writing Tests • High Test Maintenance Cost • Production Bugs 21
  17. = • 開発者がテストを書かない • いくつかの原因 ◦ Not Enough Time ▪

    過剰にタイトな開発スケジュール ◦ Hard-to-Test Code ▪ テストの難しいコード ◦ Wrong Test Automation Strategy 22 Developers Not Writing Tests
  18. Finish About this talk • 「xUnit Test Patterns」はユ ニットテストの原則・パターン などを網羅的にまとめる

    • 原則・パターンから自身のテス トコードを振り返ってみては 23