Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

テストカバレッジはどうなりましたか?

コードを書くことは、テストを書くことよりもはるかに簡単で、その1行の方法を本当に とにかく、テストする必要がありますか?些細なことです!追加するテストは、開発時間を2倍または3倍にするだけで、次にコードを変更するときに、テストも変更する必要があります。特に見積もりに少ししか時間が残っていない場合は、そのような無駄のように思えます。

しかしすぐに、コードはテストで20%しかカバーされなくなり、コードに加えた変更は、すべてを壊すことなく、カードの家の中間層を置き換えようとしているように感じます。どこかで問題が発生し、その時点で行った決定は正しいように見えましたが、それでも完全に保守不可能なコードベースになってしまいました。

どうやって来たの?テストでセーフティネットを提供し、自信を持ってリファクタリングできるようにしたいと考えていました。彼らはあなたのコードをより良くするのを助けたはずです!代わりに、あなたはもう理解していないコードの低いテストカバレッジに戻り、あなたが持っているテストはどういうわけかそれを難し​​くします コードを変更します。

これはスキルの失敗ではありません。それは最高の開発者に起こります。それはプロセスです 失敗。新しい機能の記述方法にいくつかの変更を加えることで、テストの速度を落とすことなくコードを保護できます。テストにより、コードがより理解しやすく、より柔軟になります。テストされたすべてのパスを知っているので、自信を持ってコードを変更できます。

決定を下す必要はありません

キーボードの前に座って決定しようとしている場合 少しのコードをテストする必要があるかどうかにかかわらず、あなたはすでに間違った道を進んでいます。常にデフォルトで「テストする」に設定する必要があります。些細なトーンのテストに思えても、テストを書いてください。

コードの記述が簡単な場合は、テストが簡単なはずです。そして、複雑なコードは、書いた直後ほど些細なことではありません。 今から6か月後もささいなことのように見えることをどうやって知っていますか?

しかし、オーバーテストしたくない

巨大なテストスイートは、それ自体が問題になる可能性があります。実行に20分かかるテストは、常に実行するわけではないため、テストをまったく実行しないのと同じくらい優れています。 (あなたはそうすると言いますが、私はあなたがそうしないことを知っています)。さらに悪いことに、脆弱なテストが多すぎると、リファクタリングが以前よりもさらに苦痛になるため、実行しません。最終的には、ほとんどの小説よりも長い方法になります。

これは私の以前のポイントと矛盾しますか?必ずしも。テストは常にコードのインターフェースに焦点を当てる必要があります 、その実装ではありません 。例:

class Cart
  def initialize(item_params)
    @line_items = Array(item_params).map {|item| LineItem.new(item[:name], item[:price])}
  end

  def total
    @line_items.sum(&:price)
  end
end

ここのコードは、両方のCartをテストする必要があるように感じます。 クラスとLineItem クラス。しかし、LineItemです 他の何かによって使用されるクラス? Cartの実装の詳細だけの場合 、そして外の世界にさらされていないので、実際にいくつのテストが必要ですか?からだけテストすることはできません。 あなたのCart クラス?

リファクタリングによって抽出されたクラスは、多くの場合、独自のテストスイートを必要としません。これらは単なる実装の詳細です。 これらの追加のテストが必要になるのは、それらが単独で使用される場合のみです。

パブリックインターフェイスに対する優れたテストスイートを使用すると、すべてのテストを書き直すことなく、実装を柔軟に変更できます。これは、平均的なものを書くよりもはるかに少ない労力で行うことができます。 オブジェクトの実装に対するテストスイート。

テスト駆動開発でテストコストを償却します

最初のセクションでは、すべてをテストする必要があることを学びました。 2番目のセクションでは、パブリックインターフェイスのみをテストする必要があることを学びました。これら2つの相反する目標をまとめるのはテスト主導の開発です。

テスト駆動開発では、テストは次のプロセスに従ってコードの設計と実装を推進します。

  1. 必要なコードがすでに存在することを前提とした失敗したテストを作成します。
  2. テストに合格するコードの最も単純な実装を記述します。
  3. リファクタリングして重複を削除します(またはコードをより表現力豊かにします)。
  4. テストを再実行します(テストに合格することを確認します)。
  5. 手順1に戻ります。

これらの手順に従うことで、すべてをテストし(テストに失敗しない限りコードを記述してはならないため)、パブリックインターフェイスのみをテストします(リファクタリングの直後に新しいテストを記述しないため)。

そんなに簡単なことは決してありません。しかし、最も複雑なコードでさえ試乗する方法はまだあります。

TDDにはいくつかの副次的な利点があります:

  • より柔軟でテスト済みのオブジェクトモデルを使用できます(これは間違いなくメインです メリット)。
  • システムは定義上テスト可能であり、将来のテストの作成コストを削減します。
  • 開発プロセス全体でテストコストを償却し、見積もりをより正確にします。
  • 次に何をするかを決める必要がないため、流れを維持できます。

では、どのように始めればよいですか?

始めるのは難しい部分です!テスト主導のコードを書くリズムに乗れば、止めるのは難しいです。

次回新機能に取り組むときは、上記のTDDの手順に従ってください。可能な限り最小限の作業でほぼ100%のコードカバレッジを実現し、ビルドオンの強固な基盤を確保し、次にコードを変更する必要があるときにテストスイートが保護することを完全に確信できます。年。または、今日の後半、要件が再び変更されたとき。

完了したら、メールを送って、どのように進んだかを知らせてください。

簡単なテストプロセスに従うことで、簡単な意思決定やバグの追跡に費やす時間を短縮し、顧客やビジネスのニーズを解決するコードの作成に時間をかけることができます。


  1. Mac のエラー コード 36 とは何ですか?

    Mac は、デスクトップとラップトップに関しては、究極の CPU パフォーマンスと膨大な構成で知られています。その最高の特徴は、町の話題です。重要なファイルやフォルダーの移動からコピーまで、Mac ではすべてが簡単です。ただし、ファイルを移動するこのプロセスでエラー 36 が発生することがまれにあります。デスクトップで同じ問題に直面している場合は、同じ問題の解決策を見つけるのに適した場所にいます。 Mac のエラー コード 36 とその修正方法を知るのに役立つ完璧なガイドをお届けします。それでは、エラーについて簡単に知り、それを修正するためのいくつかの詳細な方法から始めましょう。 Mac

  2. Windows 10 のテスト モードとは何ですか?

    Microsoft Store 以外からのアプリケーションをインストールするたびに、同じことを警告するポップアップ メッセージが表示されます。これは、外部ソフトウェアが知らないうちにシステムに損害を与えないようにするためです。同様に、Microsoft はあらゆる種類のドライバーとアプリケーションに悪意のあるコードがないか検証し、安全に使用できるものとしてデジタル署名します。検証されていない、または認証証明書を持たないソフトウェアは、Windows OS によってブロックされる可能性があり、ブロックされる可能性が高くなります。これらのセキュリティ対策は、コンピューターの安全性と健全性を維持する