回帰テスト、特性化テスト、承認テストの違いは何ですか?


いくつかのレガシーコードをリファクタリングする前に、仲間の開発者はこのアドバイスを削除します.

Make sure it's covered with a test first!


もちろん、このコードはテストされません.あなたが会うために少しの時間と期限がないので、私のような人々はあなたに気の利いた技術を使うように勧めます:Approval Testing.
承認テストは、テスト中の既存のコードを置くための最速の方法です.あなたはいくつかのコードを取る、それで入力の様々なをスローし、出力をキャプチャします.迅速に、リファクタリング時に何かを壊した場合について説明する回帰ネットを構築します.
時々、人々はマイケル羽からWorking Effectively with Legacy Codeに精通しています.その場合、通常、彼らは質問をします:

Yeah, I've heard about Approval Tests. Is this the same as Characterization Tests? Asking for a friend…


羽の本を読むことのない人々のために、「回帰テスト」はテストされないコードに接近するための一般名であるようです.微妙な違いはありますか.🤔

私はすでにこの質問に何度か回答しているので、私はここでそれを保存しているので、我々はすべての混乱した仲間と共有することができます😉

はい、承認と特性化テストは同じものです


違う名前の理由はこれまで認識基準がないからです.異なった人々は、同じテクニックのために異なる名前を思いつきました.実際に、それを参照するmost people seem to be using "Regression Tests"!
問題はそれの精神です.
まず、ゴールを理解する必要があります.システムが異なる動作をした場合に失敗するテストがあります.
プロセスはおよそ3段階である.

  • 自動化されたテスト👈これは通常、ゲームのハード部分です.これは、迷惑な依存関係を切断含まれています.羽のテクニックは、あなたがそれを助ける!

  • 興味深い出力をキャプチャします.を返します.または、実行中に起こる興味深い事実をキャプチャするカスタムロガーを紹介することができます.

  • 可能な限りすべての可能なシナリオをカバーするために入力を変更します.テストカバレッジは、あなたがテストしていないものを識別することができます.私は、少なくとも1つのテストが失敗したことを確認するために意図的なバグを導入するのが好きです.
  • 「キャラクタリゼーションテスト」は、羽の観衆の間で大衆化された名前です.特にレガシーコードでは良い名前だと思います.
    “承認テスト”も素晴らしい名前です.私は、それがさらによいと思います.
    なぜ?それが示唆するもののために.名前の問題.私は他の名前について教えてみましょう、YEPは、もっとあることを説明する!

    ゴールデンマスターとスナップショットテスト


    あなたがしばらくしてきた場合は、ゴールデンマスターのテクニックを思い出すことがあります.まあ、それは同じ話です.目標は、我々はそれに対して将来の変更を比較することができますので、既存の行動をキャプチャすることです.

    "The purpose of characterization testing is to document your system's actual behavior; not to check for the behavior you wish your system had"

    — Michael Feathers


    “黄金のマスター”の名前は、オーディオレコード業界、特にthe process of masteringから来ている.それはコピーができる1つの真実です.
    ソフトウェアは何をすべきかより重要であるという精神を埋め込んでいますが、私は名前として「ゴールデンマスター」が好きではありません.私にとって、それはあなたがそれに触れないことを暗示します.そして、それは私がレガシーシステムを扱うとき、良い考え方であると思いません.
    行動が人間によって承認されたことを示唆するので、私は「承認」を好みます.人間の側面はこの過程にとって重要だと思います.我々は、ソフトウェアの進化を制御している.つまり、システムがどのように振る舞うかを決定しなければならない.“承認テスト”それを表現!

    良いプリンターの(未知)重要性


    2020年9月、承認試験についての講演を行った.
    At 15:40、彼女は承認テストの4つの部分を提示します:
  • 手配
  • Act
  • 印刷
  • assert (以前の出力と比較する)
  • 印刷ステップはこれらのテストが本当に役に立つように重要です.プリンタは、古い値で新しい値を比較するのに便利な文字列に取り込む出力を変えるものです.
    良いプリンタは、無関係な、フレーク状のデータを洗浄し、出力のための人間の意味を読み取る方法で出力をフォーマットします.
    例えば、承認テストin the Supermarket Refactoring kataによって取得された出力です.
    ----------------------------------------
    Receipt date:           [date]
    ----------------------------------------
    3 for 2(apples)                    -0.99
    
    Total:                             -0.99
    
    データが実際の領収書のようにどのようにフォーマットされたかに注目してください.
    また、実際の日付がテスト実行間で変更される可能性がありますので、削除されました.
    そして、それは“スナップショットのテスト”もポイントを欠場!
    スナップショットは、Facebookとそのテストライブラリによって一般化されている.レガシーコードを扱うときに便利です.彼らはあなたが承認テストを行うのに役立ちます.
    “スナップショットテスト”の名前は、出力をキャプチャする動作に焦点を当て、良いプリンタの重要性を示唆していません.
    私は、Jestのスナップショットが一般的に悪用されると思います.人々がちょうど何が起こっているかを本当に理解することなくスナップショットを更新する点に達することは、一般的です.したがって、テストを持っているにもかかわらず、バグが表示されますが変更されているかどうかを伝える簡単な方法がないためです.
    テクニックの悪用は冗談の誤りではありませんが、私はFacebookがよりよく知っていて、「承認テスト」名を再利用するべきであると思います.代わりに、彼らは自分自身を思いついた🤷‍♂️

    冗談 “承認テスト”より多くのリソースにつながる


    私は、名前が他の上にこれを使用しますので、名前はあなたがそれをするのを助ける便利なツールにあなたを案内します.あなた自身でキャラクタリゼーションテストを書くことができる間、私はあなたに を見てみることを勧めます.
    「承認テスト」プロジェクトは多くのリソースとドキュメントを持っています.これは、1ダースの言語で実装されます.approvaltestsライブラリよりも進んで、あなたはあなたのためのプロセスを簡素化することを目指しapprovaltests.comのような製品を見つけることができます.これは、キャプチャされた出力とのコラボレーションを持っているだろう典型的な問題を解決するスケールで承認テストを適用をサポートします.

    東 それらを“承認テスト”と呼ぶ


    さて、既存のコードの振る舞いをテストに取り込む方法は別の名前を持っていることを知っています.
  • のキャラクタリゼーションテスト
  • 承認テスト
  • 金のマスター
  • のスナップショットテスト
  • ロックテスト(感謝)
  • 回帰テスト(それは、 がそれ自体を示す方法です)
  • とりわけ、「承認テスト」として参照することをお勧めします.他の名前は、同じテクニックを参照してください.
    Toucaを見て、あなたの承認テストをより便利にするためにプリンターを実装することについて考えてください.
    このテクニックの別の名前を聞いたことがありますか?
    あなたはそれが名前を知っていない承認テストを使用したことがありますか?
    🤠