すべてをテストする必要がありますか?


28

Ruby on Railsで最初の実際のプロジェクトを開始し、TDDテストの作成を強制します。テストを書くことに本当の利点はないと思いますが、それは非常に重要だと思われるので、試してみます。

静的ページを含むアプリケーションのすべての部分をテストする必要がありますか?


9
これは実際にRailsの質問ではありません。それはTDDの質問です。
ジョンストレイラー

4
@JonStrayer:そうですか?RoRの答えは.NETと同じになると確信していますか?設計上、RoRは意図的にテストのコストを削減したが、コンパイラの形で型安全性を持たないと、テストのメリットが大幅に増加することをお勧めします。
-pdr

1
なんらかの理由で、この質問のために、「すべてをテストしてください」と叫ぶキャプテンネロの画像マクロを投稿したいと思います。
メイソンウィーラー

3
テストを書いて盲目的な信仰からそれらを書くことの本当の利点を見ないことは、本当に正しく聞こえません。テストを書かずに続けてください。しばらくすると、予期しないリグレッションが発生し、テストする理由がわかります。
ZJR

1
コードの再構築を決定するまで待ちます。大規模な変更が導入されるたびに、機能を検証する必要があります。テストなしでは、アプリケーションを調べて、すべての機能を手動でテストする必要があります。別の大規模な更新を導入すると、再度実行する必要があります。単体テストは、すべてが期待どおりに機能していることを確認するための「安い」方法です。
エヴァンプライス

回答:


47

TDDはテストではなく、設計に関するものです。テストを書くと、クラスがどのように機能するか、どのようなインターフェースが必要かを考えるようになります。テストは、後でリファクタリングしやすくする幸せな副作用です。

それで、それを念頭に置いて、静的ページの動作とインターフェイスは何ですか?

私の最初の応答は「なし」と「なし」です。


静的ページのテストはありませんか?
マッテオパグリアッツィ

TDDは、ある程度、デザインに関するものです。しかし、まだアーキテクチャが必要です。アーキテクチャを念頭に置いていないと、多数のテストから組織がどのように成長するかを想像するのは困難です。
ロバートハーベイ

@MatteoPagliazziテストのレベル(単体テスト/統合テスト/など)に応じて、おそらく1つまたは2つで、静的ページにアクセスできることを確認します。しかし、それは単体テストには高すぎます。
イズカタ

1
@RobertHarvey何もテストしないとは言わなかった。静的ページの単体テストは行わないと言った。
ジョンストレイラー

@JonStrayer:TDD'ersは、設計のための魔法のエリクサーとしてTDDを保持する傾向があります。それがあなたが意図したものではない場合、私は謝罪します。:)
ロバートハーヴェイ

32

常に費用対効果の分析です。機能を壊すことの費用はいくらですか?コストが高い場合は、十分にテストしてください。コストが低い場合は、軽くテストするか、まったくテストしません。

市場投入までの時間を考慮するコストもあります。完全に機能する機能を遅らせるよりも、ほとんど機能する機能を提供する方が良いかもしれません。

一般的なIMOでこれらの質問に答えることはほとんど不可能です。

ある機能が最初に気付いたよりも重要であることが判明した場合、テストする能力を維持することがより重要だと思います。


また、静的ページのバグは、論理エラー、設計エラー、およびTDDを使用して防止するために通常使用される種類のエラーよりも、はるかに簡単に修正できると想定しています。静的ページのエラーの発見と修正はどちらもかなり簡単である可能性が高く、TDDを使用すると、必要以上に時間がかかる場合に両方のプロセスを短縮することができます。:D
ゴードンガスタフソン

私はそうは思いません。ブラウザーのあいまいなバージョンの動作や奇妙なjavascriptメモリの問題に対処したことがあるなら、おそらくかなりのトレーニングを受けているでしょう。バックエンド言語がもう少し信頼性が高く標準的な場合もあります。時々。たぶん、あなたはhtmlのように静的であり、javascriptではないことを話しているのかもしれません。
マイケルデュラント

8

私は「はい」と言います。最も単純な機能とコードさえもカバーするテストがある場合、新しいコードを追加してもインプレースコードが機能しなくなることはないと確信できます。同様に、発生したすべてのバグに対してテストを行うことで、回帰が忍び寄るのを防ぎます。


「新しいコードを追加しても、インプレースコードが動作を停止することはないという自信があります」というように、以前に書いたコードに触れてはいけませんし、新しいメソッドを追加することもできますか?
マッテオパグリアッツィ

うーん、ダメ。しかし、現在「機能している」コード間の予期せぬ予期しない依存関係は、それらの依存関係を変更する新しいコードを追加すると問題を引き起こす可能性があります。また、テストを間違えた場合(これはかなり一般的だと思います)、テスト自体を変更する必要があり、その後、そのテストから発生するコードを変更する必要があります。
ブルースエディガー

@アンディそれは絶対にナンセンスです。プロパティセッターとゲッターのテストは簡単であり、非常に重要です。それらが機能しない場合、一般的にクラス全体がバラバラになります。たとえば、マルチスレッドアプリケーションでは、セットが同時取得を妨げない場合、データソースが正しいため取得に時間がかかるため、データソースが正しく取得されるまでに数時間かかる破損データの問題が発生します。または、セットが更新時間も更新しない場合、データを同期できなくなる可能性があります。セッターとゲッターが本当に些細なものであれば、プロパティを公開することができます
-deworde

@dewordeインスタンスメンバーをスレッドセーフにすることはそれほど一般的ではありません。スレッドセーフにするよりも、thead以外のセーフタイプへのアクセスを制御する方が一般的です。とにかく、別の答えが示すように、テストするものは費用対効果です。ゲッターまたはセッターのテストの作成に時間を費やすか、システムがカプセル化するはずの実際の動作をテストできます。
アンディ

3

はい、すべてをテストする必要があります...

すべての自動テストを作成する必要はありません。静的ページについては、Selenium http://seleniumhq.org/を使用して、問題がないことを確認してください

私の経験から、いくつかのフロントエンドのものはテストケースを書くことがほとんど不可能ですが、それが実際にMark 1眼球を使用してテストしたい理由です。


同意しません。モックまたはデータを渡すことでそれを実現できない場合は、コードにそれを含める必要があります。ゲッターとセッターは独自のテストを必要としませんが、期待される機能を検証するためにシステムの他の単体テストを介してテストされます。
シュライス

もちろん、セッター/ゲッターは他のテストで間接的にテストされますが、誰かが「すべてをテストする」と言うとき、それらの種類のテストを特別に作成することを意味すると思います。私はいつも人々に「重要なことをテストする」と言っています。セッターやゲッターのようなものは、私にとってその定義に当てはまりません。
アンディ

2

テストはコーディングと同じくらい重要です。「何かがうまくいかないことがあるなら、それはそうする」という言葉を聞かなければなりません。INMO、品質を向上させるために使用されるソフトウェアエンジニアリングの多くの技術のうち、テストは、問題を早期に発見するのに役立つ最も価値のあるものです。

すべてをテストすることはできませんが(特に小さなチームと大規模なシステムで)、テストを完全にスキップするわけではありません。テストする価値はありますか?See Wiki-SoftwareTestingのセクション「障害の早期発見」を参照してください。


2

TDDテストは、そのように書かれていれば、生きた仕様にもなります。テストメソッドの名前は、ビジネスユーザーにとって意味のあるものでなければなりません。


2

他の人が述べたように、Ruby on Railsのテストでは、(ほとんどの)他の言語よりもはるかに重要です。これは、コンパイラーがないためです。

以下のような言語のDelphi、C ++、VB.NETなどは、...言語をコンパイルされ、そしてあなたのコンパイラは、このようなメソッドの呼び出しでタイプミスとしてmistkesの多くをピックアップします。Ruby on Railsでは、特定のコード行が実行された場合、または視覚的な警告を表示するIDEを使用している場合、コードに誤字や誤りがあるかどうかのみがわかります。

すべての単一行のコードが重要である(そうでない場合は存在しない)ため、作成するすべてのメソッドをテストする必要があります。これは、いくつかの基本的なTBDDツールに従う場合に聞こえるよりもはるかに簡単です。

Ryan BatesのRails Cast on How I testは私にとって非常に貴重なものであり、正しく行われればTBDDのシンプルさを強調しました。


1

本当にTDD方法論を使用している場合は、最初にパスしようとしている単体テストがなければコードを作成しません。


2
はい...しかし、たとえば静的ページで何をテストすればよいですか?それの存在?コンテンツとリンクが存在するか?多分...私は間違っているが、それは時間の無駄だ
マッテオPagliazzi

1
私はTDD方法論があなたのロジックに適用されると思う傾向があります。静的ページはhtmlファイルですか?変わらないMVCビュー?後者の場合、コントローラーが適切なビューを返すことをテストできると思います。もっと重要なことは、TDDが単に「テスト」ではなく、仕様に対する開発を支援する必要があることを覚えていることだと思います
...-wessiyad

フレームワークのコンポーネントを使用して静的ページを単に提供すると仮定します。メソッドがそのページに触れていない場合、実際にはテストするものはありません。Railsをテストする必要もありません。誰かがそれをカバーしていると思う。
エリックReppen

0

私はTDDから始めないでください。一般的なアーキテクチャ戦略の学習により多くの時間を費やしたときに、情報に基づいた決定を下します。TDDでは、宿題をスキップできるとは思わないかもしれませんが、宿題をスキップすることはできません。

これが私の問題です。言うまでもなく、TDDを壊すことのないものに多くの時間を浪費しているように思えますが、依存関係の巨大なチェーンで予期していなかったことが破壊されると、感謝するでしょう。アプリを書く前にそのようなことを予測することは不可能だと指摘するとき、それが...私たちがテストする理由です、彼らはテストが便利であるにもかかわらず、実際には設計に関することであり、テストではないことを伝えます。

しかし、予測不可能なリンクされた依存関係の巨大なチェーンは、安っぽいデザインの産物ではありませんか?

それでどちらですか?

ここに考えがあります。Design Patternsのオブジェクト指向設計の次の2つの原則を考慮して、そもそも依存関係の巨大で複雑なチェーンを持たないようにしましょう。

「実装ではなく、インターフェースへのプログラム」

つまり、オブジェクトは、誰が呼び出しを行っているのか、どのように作成されたのかを気にしてはいけません。適切な引数が入力され、指示された他のオブジェクトから呼び出されるメソッドが期待どおりに動作することだけが必要です。ほとんどの場合、依存関係のチェーンは、1つのリンクポイント、呼び出し側のメソッド呼び出し、および引数がメソッドにドロップされる場所にある必要があります。ここで、ログに記録して検証し、問題が発生したときにデバッグに役立つメッセージを送信します。

そして:

「クラスの継承よりもオブジェクトの構成を優先する」

ダミーは誰ですか?複雑なカスケード継承スキームのクラスに何かをして、30のクラスのようにフリンジケースの破損を引き起こした人、またはそもそもそのアーキテクチャを思いついた開発者ですか?TDDを使用すると、ピサの斜塔の内部の問題の根底に到達するのに役立つ場合がありますが、そのコード災害のエンドポイントの1つを次回変更しようとするのはそれほど苦痛ではありませんか?

そして、それは私が私を悩ませることに到達する場所です。TDDは本当に設計に役立ちますか、それとも悪いアーキテクチャを可能にしますか?自己実現戦略になる可能性があるように思えます。チームが貧弱なアーキテクチャに対する責任を負う必要がなければならないほど、これらの詳細なテストコンポーネントはより役立つように見えますが、最終的にはアプリはますます大きくなるPITAになります(最初の段階ではアーキテクチャをあまり考慮していなかったと仮定します)場所)。そして、その結果を認めなかったのは人手によるものであり、時間の経過とともにアップグレードおよび修正されることを意図したアプリケーションで作業するときに、常に最も費用のかかる間違いを犯します。


-1

質問に答えるには、「ここで何がうまくいかないか」を考えてください。特に、「コード」(マークアップ/何でも)を変更した場合、ページを壊していないことをどのように確信できますか。さて、静的ページの場合:

  • レンダリングされない可能性があります
  • 正しくレンダリングされない可能性があります
  • JSが読み込まれない場合があります
  • 画像のパスが機能しない場合があります
  • リンクが壊れている可能性があります

個人的に、私はお勧めします:

  • ページで期待する1つの文字列をチェックするセレン[1]テストを作成します(可能な場合、下部に近い)。これにより、レンダリングが検証されます。
  • JSエラーがないことを確認してください(セレンはこれを許可していると思います)
  • htmlバリデーター、可能であればリンクチェッカーを介して静的ページを実行します。
  • JSを検証するためのツールが見つかりませんでしたが、jslintまたはjshintで成功するかもしれません。

ここで重要なことは、反復可能で使いやすく、テストランナーで自動的に実行されるものが必要なことです。


-1

すでに優れた答えをすべて追加するために、テストするものとテストしないものについての私の考えを以下に示します。

テストを行います:

  • ビジネスの論理
  • アプリケーションロジック
  • 機能性
  • 動作、
  • だから、本当に、すべてを除いて

テストしないでください:

  • 定数
  • プレゼンテーション

したがって、次のようなテストを行っても意味がありません。

assert wibble = 3

と言ういくつかのコード

wibble = 3

また、アイコンがツルニチニチソウの青であるかどうか、見出しに使用したフォントなど、プレゼンテーションの内容をテストしても意味がありません...

したがって、「静的ページをテストする必要があります」と尋ねると、答えは次のとおりです。サイトの機能、ビジネスロジック、または動作の一部である限り、静的ページをテストします。

そのため、アプリには、サイトのすべての部分(匿名ユーザー、ログインユーザー、ダッシュボード、アプリ画面内など)から利用規約が利用可能であることを確認するテストがあります。各ページの「契約条件」と呼ばれるリンク、そのリンクが機能すること、そしてテストは、ページに到着すると、Ts&Csに「似ている」と言います。 「定数をテストする」または「プレゼンテーションをテストする」ことなく...たとえば、特定のフォントサイズやテキストレイアウトをチェックせずに、テキストが正しいことを確認できます...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.