方法論:別の開発者向けの単体テストの作成


28

私はソフトウェア開発と単体テストの作成について考えていました。私は次のアイデアを得ました:

開発者のペアがあるとしましょう。各ペアはコードの一部を担当します。ペアの1つは機能(コードの記述)を実装し、2つ目は機能の単体テストを記述します。テストはコードの後に​​記述されます。私の考えでは、彼らはお互いを助けますが、かなり別々に働きます。理想的には、2つの同様のサイズの機能で動作し、テスト準備のために交換します。

このアイデアにはいくつかの利点があると思います。

  • テストは、実装の詳細を確認できる誰かが作成します。
  • ペアプログラミング(2つの機能を同時に使用)よりも作業を少し速くする必要があります。
  • テストとコードの両方に責任者がいます。
  • コードは少なくとも2人でテストされ、
  • コードをテストしている人が書いたコードのエラーを検索することは、より良いコードを書いてコーナーを避ける特別な動機付けになるでしょう。

また、コード開発とテスト開発の間にコードレビューのために別の開発者を追加することも良い考えです。

このアイデアの欠点は何ですか?それはすでに私にとって未知の方法論として説明されており、ソフトウェア開発で使用されていますか?

PS。私はプロのプロジェクトマネージャーではありませんが、プロジェクト開発プロセスについては何かを知っており、いくつかの最も一般的な方法論を知っています。


17
ユニットレベルでダウンストリームQAを説明しているだけです。何かに取り組んでいるペアがいる場合、TDDで実際のペアプログラミングを試しましたか?
jonrsharpe

9
これは、テスト作成者が最初にテストを行い(スケルトンコードを書く)、もう1つが機能を実装した場合に、より適切に機能します。最初の1つは設計を制御し、もう1つは重量物を持ち上げます。最初の人が彼が何をしているかを知っていて、2番目の人が常に彼のリードをフォローしても構わない場合、それはうまくいくでしょう。この協力方法の名前については知りません。私は言う..それを主張する!このFraniis開発の呼び出しを開始します。
マーティンマート

14
その批判は意味がなく、あなたの提案はその問題を解決しません。
jonrsharpe

5
@franiis assert trueすべてのテストに合格したため、同僚がテストとして書いて、それを1日と呼んでいるのを見ました。1つの重要なステップが欠落していました。テストは最初に失敗し、テストではなくコードを変更して合格する必要があります。
エリックドゥミニル

6
@franiis TDDは反復を中心に構築されています。失敗したテストを書き込みます。テストを緑にするコードを作成します。リファクタリング。失敗したテストを記述します。テストを緑にするコードを作成します。リファクタリング。「すべての要件をカバーするテストができるまで繰り返す」という部分が欠落しているようです。しかし、あなたが持っているように見える最大の問題は、テストが開発者にとって有用なツールでなく、誰かがそう言ったので、「テスト」はあなたが持たなければならないものとして見られるということです。コードの品質(および正確性)を気にかけられない場合は、それが問題であり、そこから始める必要があります。
ルアーン

回答:


30

ペアを使用して製品コードの記述とそれに関連する単体テストの記述の労力を分割する一般的なアプローチは珍しくありません。私は以前にもこの方法で個人的にペアを組んで、まともな成功を収めました。ただし、本番コードを書いている人とテストコードを書いている人との間の厳密な線が必ずしも結果をもたらすとは限りません。

私が同様のアプローチを使用したとき、ペアは問題について話し合い、理解を共有することから始めます。TDDを使用している場合、最初にいくつかの基本的なテストから始めることができます。TDDを使用していない場合は、おそらくメソッド定義から始めます。ここから、ペアの両方のメンバーが製品コードとテストコードの両方で作業し、1人がそれぞれの側面に焦点を当てますが、製品コードとその背後のテストコードを改善する方法について話します。

各ペアに2つの機能を提供することの利点がわかりません。最終的には、一部の機能についてはTDDに似たものであり、他の機能についてはそうではないものです。フォーカスを失います。リアルタイムのピアレビューのメリットは得られません。ペアリングの主な利点はありません。

ペアプログラミングの実践は、速度ではなく品質です。したがって、高速化によって駆動される修正された手法を使用しようとすると、自然に反します。並行コードレビューとテスト開発により高品質のソフトウェアを構築することにより、各変更の知識を持つ少なくとも2人のユーザーがいるため、ダウンストリームで時間を節約でき、ピアレビューとテストの待機サイクルを排除(または削減)します。


ありがとう、私の考えは、両方の機能が同じ方法で開発されていることを前提としています(ただし、開発者は役割を交換します)。私はあなたの答えが好きで、速度と品質に集中しています。
franiis

私の経験では、手直しのコストはこのアプローチの利点を上回ります。むしろ、「ピンポン」または別の方法を使用して、ペアがこれらの義務をトレードオフするようにします。
ネオンタピル

3
ペアプログラミングの実践は、速度ではなく品質です。ペアTDDは品質に関するものであり、完成のスピードをもたらし、開発のコストを削減します。石工がミレニアルで知られていることを学んでいるのは、私たちの業界だけです:最初にストリングラインと石工のルールを設定してからレンガを敷くと、より少ない時間で、より少ない労力とコストでより良い壁が構築されますあなたはレンガを置き、その後精神レベルと木mallで調整しようとします。そして、物事の助けを得る。
ローランラリッツァ

@LaurentLARIZZAそれは正しいようです。「ペアプログラミングの実践は、現在の速度ではなく、将来の品質と速度」であると言うより良い方法だと思います。問題を早期に発見し、作業の堅牢性を向上させ、サイロを解消するための知識を共有することは、間違いなく前向きなプラクティスです。これらのすべてには現在コストがあり、将来的には多くの場合報酬が支払われます。
トーマス・オーエンズ

@ThomasOwens:まあ、品質のコストは認識されているだけであり、現実のものではありません。テストに合格すると(そしてコードを整理したら)、テストで記述されたシナリオが完了し、セキュリティで保護され、期待どおりに機能するという自信が得られます。完了しました。先に進むことができます。コードが機能するという確実性なしで先に進むと、後でチェックを実行する必要がある借金を受け入れただけです。借金はなく、借金がかかります。つまり、あなたが話す「未来」は、最初のテストに合格するとすぐです。
ローランラリザ

37

あなたのアイデアの主な問題は、コードのテストを書くことができないということです。コードはテスト可能でなければなりません。

すなわち、モックを注入し、テストしたいビットを分離し、変更された状態にアクセスし、確認する必要があるなどの必要があります。

運が良かったり、最初にテストを書いたりしない限り、テストを書くことは、コードを少し書き換えることを意味します。そもそもコードを書いている人でなければ、遅延、会議、リファクタリングなどを意味します


ありがとう。しかし、TDDの一般的な批評は、テストを「グリーン」にするためにコードが記述されることがあることです。テストがコードの一部をテストしない場合、コードでは省略できます。後でテストを書くとこれに役立ちます(コードを書いた後にいくつかの変更が必要になる可能性があることを受け入れますが、開発者は将来、よりテスト可能なコードを書くことを学ぶべきです)。
franiis

1
@franiis確かに、主な問題は、後でテストを書くことではなく、それを行うことと、コードを書いたのと同じ人物ではないことの組み合わせです。
ユアン

しかし、例えばペアプログラミングを使用する場合、時間がかかりません。2人の開発者が1つの端末で作業する場合、2つの機能を同時に使用することはできません。私の考えでは、これを(限られた範囲でも)許可する必要があります。2人のマイクロチームの会議は、本当の負担ではありません。
フラニス

25
@franiis:「テストがコードの一部をテストしない場合、コードでは省略できます。」–それがポイントです。テストは、実行可能な例の形式での要件のエンコードです。テストがない場合、要件はなく、コードもありません
イェルクWミッターク

3
@JörgWMittagが言ったことの反対側:テストが「コードの重要なものをテストしない」なら、テストを修正する必要があります。これは、従来のTDDの場合と同様にシステムでも同様です。
bta

15

ここで私が見ている主な問題は、ユニットレベルで、コードを書くとき、それをコンパイルし、実行し、最も明白なバグをすぐに削除することです -コードが不完全で、ユニット、機能、または機能がわかっている場合でも部分的にのみ実装されています。そして、ユニットのコードを実行するには、実装を呼び出すプログラムの一部、通常はユニットテストまたは少なくとも部分的なユニットテストが必要です。これは必ずしも「本によるTDDスタイル」ではなく、そのようなテストはテスト対象のコードの前後に書くことができます。

私のユニットの1つのバージョンが「機能完了」であり、すべてのバグがない場合、私は自分でこの方法を見つけることができるので、2番目の人に引き渡して追加のユニットテストを書くか、コードをレビューさせるのが理にかなっています。しかし、コンパイラーが警告を表示しなくなったらすぐにそれを渡すことは意味がありません。「まだ」動作しない、または動作することをテスターに​​詳細に説明しなければならないと知っている場合、それは明らかに早すぎます私はまだそのコードで作業しているので、2時間で異なります。その詳細レベルでこれに必要な通信オーバーヘッドは、利益とバランスが取れていません。

そのため、追加の単体テストを作成する2番目のdevを使用するのは理にかなっていますが、単体テストを排他的に作成するためではありません。


7

次のいずれかの状況が発生する可能性があるように思われますが、これらはすべて望ましくありません。

混乱

Ewanが概説したように、CUTをテスト可能にするには変更が必要になる場合があります。変更の理由は、開発者にとって必ずしも明らかではない(そして意見の相違を引き起こす可能性がある)ため、テストが最初に記述されるのはまさにそのためです。

競合

開発者Aがコードを完成し、テストすることを望んでいる場合があります。開発者Bも開発中である可能性があるため、ユニットテストに参加するためにコードを保留することを控える場合があります。

コンテキスト切り替え

場合でも、開発者Bは、によって書かれたコードをテストするために、その開発を棚上げしていく所存です開発者Aを -活性の変化はコストがかかります。


何十年もの、人力を2倍にしても開発時間は半減しないことが受け入れられてきました。上記で概説した要因を考慮すると、この配置が物事をどのように改善するかを見るのは困難です。


4

ペアプログラミングおよびTDD組み合わせて使用する場合、これはピンポンパターンと呼ばれます。

  • Aは新しいテストを作成し、それが失敗することを確認します。
  • Bは、テストに合格するために必要なコードを実装します。
  • Bは次のテストを作成し、失敗することを確認します。
  • Aは、テストに合格するために必要なコードを実装します。

等々。リファクタリングは、運転している人が必要になるたびに行われます。

しかし、両方のプログラマーが異なるコンピューターでコーディングすることを提案するようです。個別に行うには、非常に低いレベルの仕様が必要です。これはアジャイルな方法論に反します。すべての変更を調整する必要があります。TDDでは、低レベルの設計をその場で行いますが、問題はありません。私のアプローチでは、何らかの種類のスケルトンがすでにコーディングされている必要があると思います。

とにかく、100%効率的でなくても、物事の新しい方法をテストすることで多くを学ぶことができます。あなたはそれをテストし、あなたの実生活経験を共有することができます


3

私はこのパーティーに遅れていますが、何か追加することがあると思います。

それはすでに私にとって未知の方法論として説明されており、ソフトウェア開発で使用されていますか?

あなたは記述されているピアのテストを

開発者のペアがあるとしましょう。

ああ、良いペアプログラミング

各ペアはコードの一部を担当します。ペアの1つは機能(コードの記述)を実装し、2つ目は機能の単体テストを記述します。テストはコードの後に​​記述されます。私の考えでは、彼らはお互いを助けますが、かなり別々に働きます。

それはペアプログラミングではありません。

理想的には、2つの同様のサイズの機能で動作し、テスト準備のために交換します。

それは間違いなくピアテストです。ここだそれについてのACMの紙が。これをやった。私はピアレビュープロセスの正式な部分で働いてきました。これは便利ですが、テストの最初の行になることを意図したものではなく、従来のペアプログラミングではありません。

これの別名はWhitebox Testingです。その定義は、テスターがテスト対象の内部動作を見ることができるという事実と同じくらい、誰がテストを行っているかということ自体には関係していませんが、何が出る。通常、ブラックボックスはQAの機能です。

テストの最初の行は、コーダーの手にしっかりとかかっています。そうでない場合、あなたは私がコードを自分でテストしないように私に頼んでいますが、私はそれを拒否します。私は10歳のときからコードをテストしています。当時は派手な単体テストでテストしていなかったかもしれませんが、コードはテストされました。実行するたびにテストされました。

ピアテスターに​​期待するのは、テストに追加するテストです。ピアがコードのレビュー時に発見した問題を十分に明らかにするテスト。自動化されたテストでこれらの問題を表現することにより、それらが意味するものをはるかに簡単に理解できます。事実、私は自分の主張を理解できなかった同僚と技術的な会話を交わし、ユニットテストを書くことが問題を示す最良の方法だと気づきました。それがピアテストです。

さて、コードを書く前にテストを書いてもらいたい場合は。コンパイルするほど正式な要件文書のようなものはありません。


返信いただき、ピアテストを紹介していただきありがとうございます(これについてはお読みします)。
franiis

1

私はDDT(開発駆動テスト、別名コード後のテスト)、ペアプログラミング、レッドグリーンリファクタリングTDDをそれぞれ数年間行ってきました。アサーションにポイントごとに応答するには:

テストは、実装に関する詳細を確認できる誰かが作成します。

テストを作成する人は、実装をできるだけ詳しく知って、過剰なテストをせずに適切なカバレッジでテストを作成する必要があります。これの典型的な例は、テストしようとしているものを2つで証明するときに3つの入力でテストすることです。彼らはコードを読んで表面的な知識を得ることができますが、元の開発者が現在の状態に到達するために何を経験したかを正確に理解することはできません。そのため、彼らはコードの理解が最適とは言えません。

作業はペアプログラミングよりも少し速くする必要があります(同時に2つの機能)

なぜあなたがそれを言うのか分かりません。誰かがテストを書いている間、彼らは新しい機能に取り組んでいません。2つの異なるタイプの仕事を与えることで、誰かの仕事の能力を魔法のように倍にすることはできません。私の経験では、テストの作成は一般に本番コードの作成より難しいため、別の機能を作成する際にコードのテストに生産的かつ責任を持って取り組むことはできません。

テストとコードの両方に責任者がいます

まず、テストコードです。ビジネスにとって、テストコードは本番コードとほぼ同じくらい重要です。ビジネスコードを使用すると、恐れることなくソフトウェア変更できるからです。第二に、これはテストと本番のコードを書いている一人、あるいは両方を書いているペアと違いはありません

コードは少なくとも2人でテストされています

いいえ、テストを書いている人によってのみテストされます。テストにさらに多くの時間を使いたくなければ、なぜ2つで停止するのですか?

コードをテストしている人が書いたコードのエラーを検索することは、より良いコードを書いてコーナーを避ける特別な動機付けになるでしょう。

開発者(上級者であっても)は、「良い」コードを構成する非常に異なるアイデアを持っています。ある人のコーナーカットは、できるだけ早く作業コードに到達する別の人の完全に有効な方法です。これは、システムを非難し、ゲームをするためのレシピです。

Red-green-refactor TDD(実動コードを作成、実行、失敗、実動コードのみの変更、テストの再実行、成功の確認、リファクタリングの前に単一のテストを実際に記述し、スキップまたはスワップしないこれらの手順)とコードレビューが機能します。


2人の人が「同じ仕事」をしているわけではないので、(おそらく)より高速になります。彼らはそれぞれ独自のことをしてから途中で交換します。
ジェイコブライレ

@JacobRaihleペアリングは、コミュニケーションなしで並んで開発している2人ではありません。それは同じ仕事をしている二人でしょう。2人が1つの作業で共同作業しているため、ペアリングは非常に効率的です。私の経験では、開発は個々のプログラマーとほぼ同じ速さで行われます(つまり、ペアは2倍の速さで作業を完了します)。
l0b0

私は、「作業を少し速くする必要がある」という理由を説明しようとしています。私の経験では通常、ペアリングは遅くなりますが、それでも価値があると思います(個々の作業とOPテストの引き渡しの両方が望ましい)。それがあなたにとってより速いなら、いっそう良い。
ジェイコブライレ

1

このアイデアにはいくつかの利点があると思います。

それらを1つずつ実行しません。

テストは、実装の詳細を確認できる誰かが作成します。

つまり、最初の開発者が実装を書くのに時間を費やしたということです。次に、別の開発者が来てテストを書きます。その理由はコードが正しいかどうかを誰も知らないので、コードが何をすべきかについてのみテストを書くことに比べて戦術的な利点をもたらすことを望んでいます。実装が正しくない場合、テストの作成に役立つことはないと思われます。

作業はペアプログラミングよりも少し速くする必要があります(同時に2つの機能)

両方の開発者が最初の開発を終了すると、どちらのコードが正しいかは誰にもわかりません。これはまだ確認されていないため、誰も完了したと判断することはできず、いつ完了するかを予測することはできません。これをTDDと比較してください。最初にテストを記述し、次にテストを失敗させ、コードを渡します。それは、より多くのシナリオをサポートするコードです。それは前進です。

それらを並行して進行させると、両方の機能で再利用できるコードが2回書き込まれ、2倍のコストがかかります。

テストとコードの両方に責任者がいます。

XPによって提案されたコードの集合的な所有権を調べてください。コードを担当する人がさらに増えます。開発者間で知識を共有することが目標の場合、なぜそれらを分離しようとしているのですか?

コードは少なくとも2人でテストされています

ペアTDDでも。ペアリングするとき、両方の人は、書かれたコードが適切であるか、書かれていないことに同意しなければなりません。それが戦いにつながる場合、チームの一部の人々は見当違いのエゴ問題を抱えています。

コードをテストしている人が書いたコードのエラーを検索することは、より良いコードを書いてコーナーを避ける特別な動機付けになるでしょう。

エラーを検索するということは、ある時点でエラーが発生することを許容したことを意味します。エラーが発生した場合、それらは気付かれていませんでした。最初にテストを書くことを拒否することは、取得するエラーにライセンスを与えることです。

カットコーナーは意図的でない場合があります。それがペアプログラミングの目的です。ペアの各メンバーは、他の1人にコーナーをカットさせないという義務を負わせる必要があります。それにはクローゼットの中にプライドを残し、オフィスを出るときにそれを取り戻す必要があります。従業員が間違いなく厳格であることを期待する場合、一般的な状況を考慮せず、失敗に備えてください。

XPは、XPのすべてのプラクティスは、互いの欠陥をカバーすることにより相互に強化することで作られていることを明確に述べています。XPの実践を他のものから切り離して批判することは避けてください。完璧なプラクティスはありません。TDDは完璧ではありません。ペアプログラミングは完璧ではありません。集合的なコードの所有権は完璧ではありませんが、それらはすべてお互いをカバーしています。

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