web-dev-qa-db-ja.com

テストコードをテストするにはどうすればよいですか?

ほとんどのソフトウェア開発者が同意するいくつかのことの1つは、テストしない限り、コードが正しく機能することに依存してはならないということです。テストしない場合、隠れたバグがあり、将来的にさらに作業が増える可能性があります。

通常のコードをテストする方法は理解していますが、テストコードをテストして、エラーが存在する場合にそれを効果的に見つけて報告できることを確認するにはどうすればよいですか?私は十分に愚かでした本来持ってはいけないときに合格する誤ったテストケースを書いて、そもそも私の筆記テストの目的を打ち負かした。幸いにも、エラーを見つけて修正しましたが、テストのマントラによると、テストスイートが機能していないことを確認するための独自のテストセットがなければ、完全なテストスイートはないようです。

これを行うための最良の方法は、バグのあるコードのテストが失敗することを確認することだと思われます。*コードにバグを交互に追加し、失敗することを確認するために2分間費やした場合、許容できる程度の自信があるはずです。テストは「機能」します。これにより、2つ目の質問が表示されます。テストケースでバグを確実にキャッチするためにバグを導入する良い方法は何ですか?ランダムにステートメントをコメントアウトする必要があります。 if-elseのブランチは、その条件を否定することで実行され、テストがmost一般的なバグをキャッチすることに満足するまで、副作用などでコードの実行順序を変更します?プロの開発者は、テストが実際に想定されていることを実行することをどのように検証しますか?彼らはテストがうまくいくと想定していますか、それともテストに時間をかけていますか?もしそうなら、彼らはどのようにテストをテストしますか?

人々がテストをテストしてからテストをテストするのに多くの時間を費やして、実際のコードを実際に書くことは決してないように提案しているわけではありませんが、私は少し利益があると思うほど愚かなことをしました「メタテスト」の、そしてそれについて行く最善の方法に興味がありました。 :D

*「バグのない」コードをテストするときにテストに合格するかどうかを確認することはできましたが、テストの仕様としてコードを使用するとかなり逆に見えます...

22

TDDの標準フローは次のとおりです。

  1. 失敗したテストを作成します。 (赤)
  2. 成功させる最小のコード変更を行う(緑)
  3. リファクタリング(グリーンに保つ)

この場合のテストのテストはステップ1です。コードを変更する前にテストが失敗することを確認してください。

私が気に入っているもう1つのテストは、コードを削除して別の方法で再実装できるかどうかであり、テストは削除後に失敗しますが、別のアルゴリズムを使用すると機能します。

すべてのものと同様に、特効薬はありません。必要なテストを書くのを忘れるのは、開発者がコードを書くのを忘れるのと同じくらい簡単です。少なくとも両方を行っている場合、自分の脱落を発見する機会が2倍になります。

16
Bringer128

1つのアプローチは、 Jester のようなツールを使用した Mutation Testing です。

Jesterはコードに変更を加え、テストを実行します。テストに合格すると、Jesterは変更内容を示すメッセージを表示します

9
parsifal

テストのためのテスト?その道を行かないでください。次に、おそらくテストのテストのためのテストが必要であり、次にテストのテストのためのテストが必要になるでしょう...どこでやめますか?

通常のテストフローは次のようになり、開発者は時間の大部分をポイント1〜3に費やします。

  1. コード
  2. 単体テスト
  3. 統合テスト
  4. システム/その他の自動化
  5. QA /ヒューマンテスター

2分を費やしてコードにバグを交互に追加する場合(...)

あなたのコードは最終的にそれ自身のバグを「成長」させます、手作業でそれらを導入する時間を無駄にしないでください。言うまでもなく、事前に知っていたことは本当にバグですか?バグが来るでしょう、私はそれについて心配しません。

ステートメントをランダムにコメントアウトする必要がある場合は、条件を否定することでif-elseの間違ったブランチが実行されることを確認してください(...)

これは実際に、自分がやっていることを実際にテストするかどうかを検証するための実行可能なアプローチです。 「test for test for test ...」の問題と同じ問題があるため、常に良いとは思いません。テストしているコードが100%機能していることがわかっていれば、コードの変更を停止しますか?

また、昔ながらの実用的なプログラマーのアドバイスについても覚えておくとよいでしょう あなたはそれを必要としないでしょう 。俊敏になり、実際のバグのテストとコードを記述します。代わりに、表示される場合と表示されない場合がある仮説をテストします。

4
k.m

構造上、機能コードとテストコードは互いにテストされます。問題が1つ残っています。機能コードのバグがテストコードのバグによって隠されている、コモンモードバグの場合です。 TDDはこの影響の影響を受けません。このため、通常、この確率を下げるために、さまざまな人が複数のレベルでテストを実行します。

3
mouviciel

ユニットテストを記述するときに、デバッガーで一度テストします。次に、あなたはそれを放っておいて、それを忘れます。ここでは問題ありません。

このことを考慮。単体テストの目的は何ですか?メインプログラムで行う多数の変更のいずれかがそのプログラムのロジックを誤って変更した場合に通知します。どんな変化でも何かが壊れる可能性があることを知っているので、あなたはそれが欲しいです。これが、テストをテストしなくても問題がない理由です。プログラムのロジックを意図的に変更するまでテストを台無しにしないでください(テストに再度アクセスしてもう一度テストする必要があります)。テストが誤って壊れる可能性は低いです。

0
Martin Maat