web-dev-qa-db-ja.com

開発者に自分の作業をテストさせる/させない理由

製品が本番稼働する前の最後のステップとして開発者に自分の作業をテストさせるのは悪い考えである理由について、いくつかの議論を集めたいと思います。 、ほとんどの人が他のことに忙しく、他の人にプログラムのその部分に慣れる時間がないために、議論は煮詰められました-それは非常に専門的なソフトウェアです)。

この場合のテスト計画はありますが(常にではありません)、実際にテストされている変更を行わなかった人が最終テストを行うことを強く望んでいます。だから私はあなたが次回これが議論されるときに持ち出すことができる議論の良いしっかりしたリストを私に提供することができるかどうか尋ねています。または、特に正式なテストケースがある場合に、これが完全に問題ないと考える場合に備えて、反論を提供します。

82
pyvi

他の人(そしてあなた自身)が指摘したように、開発者は自分のコードを単体テストする必要があります。ただし、その後、重要な製品も独立した人物(QA部門やクライアント自身)がテストする必要があります。

開発者は通常、「これを機能させる方法」の開発者の考え方で作業します。優れたテスターは、「これをどのように壊すか?」について考えています-非常に異なる考え方。単体テストとTDDは、開発者に帽子をある程度変えるように教えていますが、それに頼るべきではありません。さらに、他の人が指摘したように、要件を誤解する可能性が常にあります。したがって、最終的な受け入れテストは、クライアントにできるだけ近い人が実施する必要があります

103
Péter Török

開発者はコードがどのように機能するかを知っており、この知識に従ってコードをテストする習慣に陥ります。

開発者は、「どのように機能するか」ではなく、「どのように機能するか」という考え方から自分自身を取り除くのが難しいと感じます。

このため、客観性の高い人にQAやテストエンジニアなどのプログラムをテストしてもらうことをお勧めします。

127
John Shaft

テスターが壊れるようにテストする、簡単です。このタイプのバイアスは、ショーストッパーを実際に見つけるために必要です。

30
Aditya P

開発者は作業をテストする必要があります。暗黙の責任です。

私はあなたがあなたの発言に基づいてテストを行うことに専念しているチームを持っていないと想定しています。ただし、開発者がコーディングした方法でコードをテストする傾向があるため、テスト専用のチームを持つことは本当に役立ちます。何らかの品質保証チームができたら、開発者の責任としてすでにテストを実施できるという意味ではありません。

開発者は通常、バグを見つけるために巨大な穴のあるネットを使用します。その結果、小さなバグは回避されます。

15
setzamora

開発者は自分のコードを壊そうとするのが苦手だからです。彼らの心は、データ入力とアプリケーションとの相互作用の正しい経路をたどるだけです。多くのバグはnormal guyのようなシステムとの相互作用の結果です。開発者は通常のユーザーではありません。彼らはプロのユーザーです。

15
Saeed Neamati

専任のテストチームを配置する理由はいくつかあります。まず、前述のように、開発者はコードが機能することをテストするのは非常に得意ですが、それを壊すことはできません。

また、あなたが言うように、開発者は自分が書いたものを知っていますが、テストチームは何を書いた方がよいか知っています。これらの2つの概念が一致しない場合があります。テストチームの仕事の1つは、ソフトウェアが要件を満たしていることを確認することです。多くの場合、開発者はシステムのいくつかの部分だけをよく知っていますが、QAチームはすべてを知っています。

これが次の理由につながります。テストチームは完全な統合テストを行います。あなたが書いたばかりのコードはそれ自体でうまく機能するかもしれませんが、あなたが知らなかった他の機能を壊すかもしれません。

QAチームと協力して仕事をしたことなく、彼らが行った仕事に100%感謝し、彼らがソフトウェアチームの大切な一部であると言うでしょう。 QAチームがいる場合、コードのリリースがはるかに簡単になります。徹底的にテストされていることを知っているため、午前3時の呼び出しが少なくなります。

10
Tyanna

開発者は独自のコードを単体テストする必要があります。

独立したテスターは、破れるかどうかをテストするだけでなく、開発者がコーディング中に作成した、明文化されていない未定義の仮定をテストします。

8

私は、開発者が変更をコミットする前に初期テストを行い、コードが機能することに満足していることを期待しています。次に、開発者が持っている特定の「ホワイトボックス」の知識をテストケースにフィードすることを期待します。たとえば、影響を受けた可能性のあるコードの他の領域について詳しく説明します。

独自のコードをテストする開発者に対する主な反対点は、1つのビューポイントのみをテストすることです。開発者は仕様を読んで解釈しました。仕様が明確で完全で明確であることを願っていますが、常にそうであるとは限りません。開発者は、仕様の一部を誤解している可能性があります。彼らが独自のコードをテストする場合、関数が期待どおりに動作することがわかるため、これは捕捉されません。

異なる人々はまた、異なる方法で製品を使用する傾向があり、その結果、コードを介して異なるルートをたどります。開発者はコードが適切に機能することを確認しますが、別のテスターが見つける可能性のあるEdgeケースを考慮していない可能性があります。

7
Luke Graham

開発者すべき自分の作業をテストします。開発者がテストされていない作業をQAチームまたは開発者の同僚にプッシュすることは、本当に悪いアイデアです。開発者とテスターの時間を無駄にし、関係を台無しにします。

しかし、それだけでは必ずしも十分ではありません。開発者は、システム全体を通して幸福な道をたどるか、開発中に何度も何度も何度も経験されてきたいくつかの特異性を知らないでしょう。

もう1つのポイントは、仕様と配備の間に多数の通信層が存在する可能性があることです。これは、最終的な展開可能物に対する中国のささやき効果につながる可能性があります。要件またはバグレポートテストを定義した人が、それが希望どおりに機能することが最善です。

5
Paul Butcher

開発者は自分のコードを担当するので、テストする必要があります。 Does the feature work as expected?答えが「はい」の場合、完了です。

なぜテストケースをやるべきではないのですか?

  1. 発見されたバグはあなた(またはあなたの同僚)によって書かれているため、あなたは主観的です。
  2. あなたはあまりにも高価会社がケーステストを実行することはできません。 (私は願います)。
3

通常、開発者は、特定の特殊な場合を除いて、ほとんどの場合、コードを使用する開発者ではありません。したがって、運用システムに昇格する前の最後のテスト手順は、ユーザー受け入れテスト、UATである必要があります。彼らは一般に、彼らがパッケージが何をしていると期待していることをよりよく理解していると思われます。また、一般的に、日常的に使用しない人にはなじみのないエントリフローで物事を壊す能力が高くなります。

あなたのプロジェクト計画はユーザーテストに対応していませんか?ユーザーにテストしてもらうと、実装後のバグよりも早くバグが見つかる可能性があります。これは、私の世界では悪いことではありません。

3
temptar

それはあなた自身の子供の芸術を判断することに似ているので、開発者は彼ら自身のコードをテストするべきではありません。どちらにしても美しく見えますし、欠陥を指摘する専門家が本当に必要です。一方、ユニットテストは、子供が鉛で塗装しようとしていないことを確認するのと同じです。

本当にQAを採用したくない場合は、開発者に他の開発者用のテストコードを作成してもらいます。これは良い最初のステップです。開発者のほとんどの時間はCRに加えて他のコードの問題のテストに費やされるため、すぐに開発者がQAリソースを要求するようになります。

コードを保護しているのは開発者だけではありません。特定のケースに気づかなかったり、何かを開発する方法で仕様を誤って解釈したりすると、コードをテストするときにそれらのケースを見逃してしまいます。

テストのテクニックとスキルも非常に異なります。

テストチームによるほとんどのテストは、機能的(製品が仕様に従って機能すること)およびブラックボックス(テストチームはアプリケーションの内部動作を認識しません)です。機能テスターは、物事がどのように機能するかを気にする必要はありません。機能するかどうかに集中するだけです。

3
StuperUser

プログラマーがテストすると、「数量」というラベルの付いたテキストボックスが表示され、「1」と入力します。次に、経験豊富なプログラマーが、値「2」のフォローアップテストを行います。

ユーザーには、「数量」というラベルの付いたテキストボックスが表示され、「~~ unicorns ROX !!! ~~」と入力します。経験豊富なユーザーも「-12 1/2」を試してみます。

うまくいけば、テスターがどこかにいて、プログラマーがユーザーがこれらのことを行うときに体験することについて警告するでしょう。

2

私の経験では、少なくとも私の小さな組織では、エンドユーザーがテストする必要があります。私たちが入手するほとんどすべてのプロジェクトは、必要なすべての情報を提供できず、常に特定の詳細を省いています。開発者は、ユーザーの仕事の仕方がわからないため、常にテストの不利益に直面しています。したがって、開発者は、提供された情報に従ってソフトウェアが機能することはわかっていますが、エンドユーザーに役立つかどうかはわかりません。彼らの仕事をします。

2
Kratz

開発者は要件を読み違え、誤って解釈し、要件の責任者は重要なことを特定できないことがよくあります。開発者以外の誰もテストしない場合、ライブになる前にこれらの切断を見つけることはできません。開発者がテストするとき、彼らはそれがどのように機能することになっているのかについてあまりよく知っており、ユーザーが試みるかもしれない愚かなことを試みません。開発者はまた、要件の独自の解釈に基づいてテストを作成しますが、これは実際に意図されていることとは異なります。したがって、テストはパスしますが、要件は満たされていません。別の人がテストしている場合、その人は要件について異なる考えを持っている可能性があり、2人の異なる人がそれをどのように異なる方法で解釈するかによって、必要な表現が不十分である場所を見つけることがよくあります。テストでこれを確認する方が、稼働後よりもはるかに優れています。

2
HLGEM

開発者は、私たちが取得した要件に従って、コーディングした部分が期待どおりに機能することを確認できるように、初期テストを行う必要があります。したがって、通常のテストを実行し、作成したコードの単体テストを作成します。

次のステップは、コードを書くときに開発者には見えないものを見つけるQAの仕事です。開発者はより高いレベルで考えますが、ユーザーは同じレベルで考えない場合があります。開発者が自分の作品をテストしていて、テキストボックスにテキストを入力する必要がある場合、ユーザーもそうだと思って常に文字列全体を入力する可能性があります。ユーザーかもしれませんが、彼がテキストに%&$ ^のような特殊文字を入力すると、ランダムにアプリケーションが壊れ、エンドユーザーには見栄えがしません。開発者は、そのように考えるように訓練されていないため、起こり得るすべての可能性について考えることはできません。 QA(テスター)に関しては、ユーザーはこのアプリケーションを壊すためにユーザーが何をすべきかを常に考え、本のすべての愚かなことを試します。ユーザーは愚かではありませんが、何もチャンスに任せるべきではありません。

また、一般的には同時に複数のピースが作成され、両方が生産されることも理解する必要があります。開発者は自分の部分だけをテストしてそれが正常に機能していると考えることができますが、プッシュされているすべての部分に対して全体的な回帰テストを実行し、2つの異なる部分の組み合わせがアプリケーションを破壊する可能性があることを確認する必要があります。見栄えもよくない。また、負荷テストのシナリオや、テスターがよく知っているその他のことも考慮する必要があります。

最後に、UAT(User Acceptance Test)を実行して、行った部分が期待どおりかどうかを確認する必要があります。一般に、要件はBAを通過しますが、最終的な人はそれがどのように見えるかを正確に知らない可能性があり、彼/彼女は彼らが期待したものではないと考えるかもしれません、または彼らはそれをより良く見せるために何かを追加したいかもしれません彼らは作品がすでに利用可能な機能に対応していないと彼らが考えるので、全体の作品。

上記で説明したように、これらは非常に重要であり、開発者だけでは実行できず、アプリケーションが正常に機能するために絶対に必要です。経営陣はこれは保守的なアプローチであると言えますが、それはより良いアプローチです。上記のようにいくつかの調整を行うことはできますが、全体として回避することはできません。

2
Amar Jarubula

上記のコメントは素晴らしい点を提起します。

以前に言及されていない追加の1つは、個別の個別のテストコードを持つことで、要件に対する追加のチェックとして機能し、システムがそれらを正しく実装しているかどうかです。

要件とドキュメントは完璧ではなく、多くの場合、実装は開発者による要件の解釈の結果です。

テストが別の個人によって行われる場合、テスト計画を作成してテストを実行するときに、要件の独自の解釈も提供します。

テストアクティビティが開発アクティビティとは独立して行われ、両方の出力が「同意する」場合、システムが正しく、要件の元の意図に完全に一致していることをさらに確認できます。

2
tschaible

1つの理由は、開発者がtooが自分のコードに近いためです。彼らはそれが一風変わっていることを知っています、それは少し奇妙な行動です。彼らはテストする傾向がありますaround彼らがよく知っている小さな特異性。彼らはそれについて十分客観的ではありません。テストチームはそれをブラックボックスのように扱います。彼らは数十または数百のテストケースの行列を記述し、コードを実行するためにそれらを系統的に実行します。多くの場合、開発チームは夢にも思わないようなシナリオを考え出します。

別の理由は時間です。段階的に構築される大規模なプロジェクトの場合、開発チームは段階1を構築します。次に、段階2が構築されている間にテスターがそれをテストし、段階1の欠陥が修正されます。これはすべてのステージで続くので、テストされているステージは、構築された前のステージです。

それはあなたがそれが好きかどうかに関わらず、コードに不慣れな誰かによってテストされます。問題は、誰かがあなたの顧客になりたいかどうかです。

1
Karl Bielefeldt

人間は人間であるため、認知バイアスに苦しむ傾向があります。2つのほぼ同じシナリオでの判断が異なるのは、いくつかの変更点があるためです。8年間の開発で気付いたのは、開発者が同僚が書いたコードとは対照的に、彼自身のコードのテストに直面しています。自分のコードで実行されたテストは、品質がかなり悪いです。

これは、開発者が直接責任を負っていると言っているのではありません-彼/彼女の脳は彼らが書いたバイアスを使用して、彼らがその権利を信じているという事実を補強し、基本的なチェックのみを実行します。他の誰かのコードを見て、より徹底的なチェックを行います。

2つの異なる航空機が同じ空域を同時に占有するのを防ぐために、航空路管制のコンピュータシステムなど、認知バイアスまたは「ヒューマンファクター」として一般に知られている手順が導入されている例は何千もあります。時間がかかり、複数の医師が診断を下さなければならないため、医療処置が実施されます。

IT業界がより専門的な態度に移行し、独自のコードのテストを防ぐための手順を導入する時期です。

1
Surgical Coder

すばらしい質問です。あなたの状況では、テストケースが存在する場合があり、ソフトウェアが非常に複雑なため、初心者が製品をすぐに理解するのは現実的ではありません。また、実行されたテストは製造前の最終テストであると言います

開発者が最終テストを実行しても問題ない理由

  • 他にも十分なテストカバレッジがあります...単体テストが存在し、統合テスト環境が存在し、使用されている、UIテスト、探索的テストなどが実行されているなど。最終テストは、最終テストよりも厳密な受け入れ基準ではありません駆け抜ける"
  • プロのSQA /テスターが作成した一連のテストケースが存在し、誰か(開発者)が明示的にフォローする必要がある
  • 機能/製品/モジュールの失敗のリスクは、それ以外の場合は低レベルに軽減されています(専門家に高リスク領域をテストさせ、「新人」が低リスクをテストさせてください)。
  • ビジネス状況の現実は、潜在的な欠陥のある製品をリリースすることはリリースを遅らせるよりも優れているということです
  • 問題の開発者は実際には非常に有能なテスターでもあり、役割を精神的に変更することができます
  • 変更は、システムがオフラインであるために顧客のサイトがシャットダウンされたり、収益が失われたりしたときに開発者がフィールドで行ったバグ修正です(オフィスに持ち帰られ、制御されたバージョンでできるだけ早くテスト/リリースされるパッチ)。 )

開発者がテストを行うべきではない理由

  • 他に何か

一般的に、あなたは本当のソリューションを攻撃する正しい道にいるようです-SQAエキスパートにテストケースを生成してもらいます...

注:私は通常、開発者にテストを任せることに賛成ですが、最初の箇条書きが存在することを確認します。

1
Al Biglan
  • 誰もがテストする必要があります-開発者テストコード、QAのテスト機能、マーケティングテストメッセージング。そうすれば、誰もが同じ哲学を共有すると、テストにまつわる言葉は戦いの半分です。

  • テストは定期的なメンテナンスであり、私は通常アナロジーを使用して比較しますです。たとえば、車のオイル交換の類推。オイルを交換する必要はありません。しかし、とにかく定期的にそれを行います。歯磨きも同じです。あなたがそれらを毎日維持する理由があります-彼らは「今日」を壊すつもりはありません、それはすべて明日と未来の日と投資をすることについてです。

  • 誰もがテストする必要があります責任を共有。 QAチームは重要ですが、「テスト」をQAチームだけが行うこととして行うことは、製品開発やワークフローに統合されない「別個の」アクティビティになり、これは良いことではありません。

  • 本番環境で何らかの問題が発生した場合、次の2つのことを行います。

    1. 最初のコメントとして、「うーん、テストがありますか」と言います。
    2. 修正する問題のテストを含める修正よりも、最初に再現します。
1
Michael Durrant

テストが本番環境に移行する前の最後のステップとして開発者に自分の作業をテストさせるのは悪い考えである理由についていくつかの議論を集めたいのです。 、ほとんどの人が他のことに忙しく、他の人にプログラムのその部分に慣れる時間がないために、議論は煮詰められました-それは非常に専門的なソフトウェアです)。

テストは開発者にとってオプションではありません。開発者は自分が書いたコードをテストする必要があります。タスクが正常に完了したことを他にどのように確信できますか?何らかの自動化テスト(ユニットテスト)を作成するか、手動で(GUIを使用したり、コマンドラインでコマンドを呼び出したりして)「マシンが実行したいことをマシンが行っているかどうか」をチェックする必要があります。

その後テストされているものはすべて、他の人(同僚、QAなど)による「唯一の」追加テストです。開発者による直接テストに代わるものはありません。開発者が書いたコード/機能をテストする必要がない(または許可されていない)と私に言った人は、ソフトウェアの開発方法をまったく理解していません。

1
perdian

私の会社では、かなり複雑な金融アプリケーションをいくつか構築しています。私たちの一般的なポリシーは、開発者が技術的なエラーが発生しないようにすることです。基本的に、ユーザーのリソースを考慮して、それを打破するためにできる限りのことを試してください。ランタイムエラーが見つからない場合は、テストのためにBAに転送してください。ビジネス要件のテストで燃え尽きるほどに途方に暮れてしまった開発者が何人かいますが、そのすべてのテストが彼らの責任ではなかったからです。はっきりと見える明白なエラーがない限り、私たちは出力を理解するために給料を受け取った人々に転送します。また、ユーザーは、結果を検証する上で実際の役割を持つ必要があります。小売店の店員はあなたのために衣服を試着するのではなく、適切なサイズの衣服を見つけるなどの「技術的な詳細」を提供するだけです。

0

1つの問題は、開発者が自分のコードを破るインセンティブがほとんどないことです。自分の作品の欠陥を検索したり、間違いを犯したりする人はほとんどいません。別のチームを持つことは、物事が壊れることを確実にするのに役立ちます。

0
Wyatt Barnett