web-dev-qa-db-ja.com

誰がテストを書くべきですか?

ある人がテストを作成し、別の人がテストを実行する責任がある場合、またはコーダーとテストライターは理想的には同じ人である必要がありますか?

27
Henno

ユニットテストは、コードを書いているときに行うことです。このテストは物事がどのように機能するかをビューでテストする(クラス/メソッド/アルゴリズムのレベルで)であり、変更を加えてそのことを確認する前後にテストを実行できるため、開発時にサポートします。まだあなたが実施しているテストによるものです。これをプログラマーを助ける彼/彼女が働いているものとして見てください。さらに、テストは、コードを見ている人にとって何かがどのように機能するかを確認する方法も提供します。 TDD(テスト駆動開発)はこの概念を変更していませんむしろ、1つのコーディングが最初にどのように機能し、何を期待するかを考える必要があることを強調しています。

自分の問題が見られないという問題がある場合は、ペアプログラミング、コードレビュー、またはその他の方法で、より多くの目と頭脳で物事を見ることができます。それでも私は強く信じていますユニットテストはプログラマーのためのツールですそして他の誰かによって行われたことではありません。

統合テスト機能テスト、さらには(システム)パフォーマンステストなど、他の種類のテストについては、次のようにするとよいでしょう。 他の人これを行う。特に、このテストを自動化したい場合は、物事を行う方法を知っている必要があります。また、何をどのようにテストするかについてのより高いレベルのビジネス知識も必要です。

あなたの質問への答えは、文化や組織の仕組みにも依存しますが、すべての場合において、コード開発の一環として単体テストを実行したいと考えています。これが問題を引き起こす場合は、組織内で壊れている何か、または調べる必要がある何かがある可能性があります。

更新

ユニットテストの実践に影響を与える組織で私が見たいくつかの事柄は次のとおりです。

  • ユニットテストを書きたくない人もいるかもしれません。
  • 一部の人々は、良い単体テストを書く方法を知らないかもしれません。それはそれを行うことの利点を損なう可能性があり、それは単体テストが悪いことの「証拠」として使われるかもしれません。
  • 組織は人々を一緒に働かせるのではなく、コーダーコード、テスターテストなどの明確な責任を負っており、誰かに単体テストを強制する可能性があります。
  • 単体テストを作成するために雇われる人もいるため、この役割を変更しないと、コーディング時に単体テストを作成することと矛盾します。
  • 非常に小さな組織があるかもしれません。これは、誰もが少しでもすべてを行うことを暗黙のうちに意味する可能性があります。
  • 組織全体としては、単体テストの利点を認識していませんが、コードをできるだけ迅速に、後で問題に対処することを認めています。
  • ユニットテストを行う努力を推進しているのは誰ですか?一人ですか?開発者?管理?
  • 組織はユニットテストを誰が行うかを自由に決めることができますか?

単体テストを行うことに合意している場合、組織を自然に機能する状態にするために、上記の問題に対処する必要があるかもしれません。あなたが優れたユニットテストの実践と経験を持つ人々を持っているなら、彼らに物事をリードさせてくださいチームの残りを連れてくるためにユニットテストの魔法 =。

個人的には、私は信じています人々が単体テストの利点を理解し、優れた単体テストを記述し、ビルドでそれらを自動化でき、チームが単体テストを作成する方法を自分で決定できるかどうかすべて自然に配置されますそのため開発者はコードの開発中に単体テストを記述し、誰でもいつでも単体テストを追加できます見ているコードに対して。 テスターがある場合、それらは機能テストや探索的テストなどの他のタイプのテストに焦点を合わせます。

25
murrekatt

この質問は、組織の仕組みに基づくものもあれば、計画とテストの資格に基づくものもあり、さまざまな回答を求めます。テストを整理する方法はたくさんあります。特に、組織の規模が異なり、さまざまなチームを雇うためのリソースがある場合とない場合があるためです。

テストにはさまざまな種類があります。

  • ユニットテスト
  • 統合テスト
  • 機能テスト
  • 非機能テスト-ストレス、浸透および他の多くのタイプ
  • ユーザー受け入れテスト

私の経験では:
単体テスト(単一のコントローラーアクションなどの分離された機能のアトム)および統合テスト(ドメイン層オブジェクトを操作するコントローラーなど、一緒に機能するアトム、データ層オブジェクトを操作するドメイン層オブジェクト、)はdeveloperによって実行される必要があります。

機能テスト(仕様に記載されているシステム機能)は、別のQAチームで実行する必要があります。

非機能テストQAチームまたはアーキテクト/技術リーダーが実行できます。

[〜#〜] uat [〜#〜](システムは目的に適合しています)はclientによって実行される必要があります。

この背後にある理由は、自動化されたユニットテストと統合テストはホワイトボックス(コードなどのアプリケーション内で確認できます)であるため、開発者(必ずしも責任のある開発者ではない)が完了する必要があるためです。テスト中のコード)。
機能テストとUATはブラックボックス(アプリケーションの内部は表示されません)であるため、技術者ではないがテスト分析に熟練した人が行う可能性が高くなります。
機能しないテストは、テスト対象と全体的な戦略に応じて、ブラックボックスまたはホワイトボックスのいずれかになります。

自分の作品をテストするよりも、他の作品をテストする方が多くの欠陥が見つかることに注意することが重要です。テスターは考え方が異なるため、開発中に説明されなかったものを探して試してみてください。人々は自然にコードを保護します(客観的にしようとしても)。

個別のテストチームがない場合は、開発者にお互いのコードをテストしてもらうとよいでしょう。

もう少し質問に答えるために、私がテスターだったときは、テスト分析(仕様をテストするために必要な機能テストの決定)とテストスクリプトの作成、およびそれらのテストの手動実行を担当していました。これらのスクリプトが作成されると、どのテスターでもスクリプトを実行できますが、アプリケーションでの開発者の作業とは別にテスト分析を行うことが重要でした。

14
StuperUser

TDDを使用すると、開発ユニット(プログラマーまたはペアを読み取る)がテストを作成する必要があります。

TDD(テスト駆動開発)-単体テストは通常​​、技術レベルで行われます。開発ユニットは、クラスを実装するときにそれらを作成する必要があります。他の人がテストを書いた場合に遭遇する可能性のある問題は、外力が設計に影響を与えることです。 TDDは、開発者が設計を行っているときにうまく機能します。

BDD/ATDDでは、QA/POが関与する必要があります。

BDD(ビヘイビア駆動開発)およびATDD(受け入れテスト駆動開発)テストは、通常、粒度の低いレベルで記述されます。より良いテストは、利害関係者を念頭に置いて書かれています。したがって、これらを作成するのに適した人は、QA(品質保証)、PO(製品所有者)、またはBA(ビジネスアナリスト)です。それは、開発者がそれらを書くことができないということではありません。あなたはその役割に足を踏み入れる必要があります。

ペアで作業することの利点は、ペアがテストを作成する場合、作成時にテストの自動サニティチェックが行われることです。

7
Johnno Nolan

私の開発チームの非公式の方針は

誰もがすべてを行います。

つまり、テスター、プログラマー、アーキテクトは存在しません。誰もがすべての活動のビットを行うことが期待されています。

これは、ウォーターフォールプロセスを回避するためです。アクティビティが1人の唯一の保護者である場合、開発はシーケンシャルになり、作業を処理する人々は、自分が下した決定の完全な結果に気付かない可能性があります。

これは、全員がすべてのタスクに同時に取り組むことを意味するものではありません。それは、ある時点で各人がそれぞれの種類のタスクに取り組むことを意味します

1
Raedwald