web-dev-qa-db-ja.com

「コードを書くだけなので」ユニットテストを使いたくない同僚

同僚は単体テストを使用したくないので、代わりに簡単なテストを選択し、ユーザーに渡します。すべてが順調であれば、ライブで公開されます。言うまでもなく、いくつかのバグは通り抜けます。

単体テストの使用を検討する必要があると述べましたが、コードをさらに記述する必要があることがわかったので、彼女はそれに反対しました。特にコードがスパゲッティであり、機会があればそれをリファクタリングしようとするため、何かを変更し、出力が同じであることを確信することができません。

それで、私にとって最善の方法は何ですか?

25
billy.bob

彼女はaware単体テストの利点を理解していないため、変更する必要があります。

  • 彼女の意識。

あなたは彼女があなただけでなく彼女の仕事を改善することを証明する必要があります。それは難しいでしょう、彼女はおそらく彼女が変化を恐れているなら彼女が見つけることができるあらゆる否定的な側面に集中しようとするでしょう。

あなたは彼女とすべての利点について話し合い、彼女のすべての反論に耳を傾けることを試みることができます。彼女が話し終わるまで待ってから、自分で話し始めてください。

自分自身を準備するには、P.SEまたはGoogleで、管理者や開発者がユニットテストについて心配しているすべてのことを調べ、同僚との話し合いで使用する答えをまとめる必要があります。

彼女に耳を傾け、それが彼女の仕事を改善するという証拠を提供するだけで、あなたは多くの助けになります。あなたは彼女の意見を心配していることを証明し、状況を分析して最終的に彼女の心を変えるために彼女が必要とするすべてのデータを彼女に提供します。

23
user2567

単体テストを書く(彼女に言わないでください)

物事が壊れるまで待ちます。2日間手動でテストしてから、単体テストを引き出して3秒でバグを見つけます。

カバーを取る...

15

自動テストのポイントの1つは、繰り返し可能性です。手でクイックテストを行う場合、可能性がありますユニットテストと同じものを書くよりも速く完了します(少なくともユニットテスト初心者の場合-ユニットテストの経験者ならだれでも、かなり早くテストを作成できます)。

しかし、明日、または来週、コードに小さな(または大きな...)変更が加えられるとどうなるでしょうか。同僚は、何も壊れていないことを確認するために、変更のたびに同じ手動テストを何度も繰り返し喜んで繰り返しますか?それとも彼女は「コードと祈り」を好みますか?

コードが変更されれば増えるほど、ユニットテストで初期投資が増える。テストが実際にバグを捕らえなくても、良い面になるのに時間がかかりません。しかし、彼らも定期的にそれを行っています-この時点で、彼らは非常に貴重になります。そして、誰かがその安全感を経験し、ユニットテストの実行が成功したことで自分のコードが信頼できるようになれば、通常、後戻りはできません。

彼女がある程度確信しているが、新しい領域への進出を恐れている場合は、彼女に最初の単体テストを一緒に書くペアプログラミングセッションを提供します。テストするのはそれほど難しくないが、テストする価値があるように十分に複雑なクラスを選択してください。

しかし、彼女が納得していない場合は、難しい事実を収集する必要があるかもしれません。そのような事実は

  • あなたと彼女が書いたコードの欠陥率
  • 彼女のコードに対して一連の単体テストを作成し、見つかったバグを文書化します。

そのようなデータをいくつか収集してから、結果を丁寧に示します。それでも彼女を納得させるのに十分でない場合は、問題について話し合い、収集した証拠を経営陣と共有する必要があるかもしれません。それはあなたの最後の手段であるべきですが、時々他の方法がありません。

11
Péter Török

それ以外の場合は手動タスクの自動化は、どのプログラマーにとっても魅力的です。

したがって、彼女は「より多くのコードを書いている」のではなく、手作業を減らしています。

11
Les

悪魔の擁護者を演じること:彼女はポイントを持っています。私は通常それを次のように置きます:

自動テストは、多くのコードの問題をさらに多くのコードで解決します。

根拠:

  • 故障率とOOメトリック の相関関係に関する調査、見出しの結果: "[クラスの]サイズを制御した後私たちが調査したメトリックは、フォールト傾向に関連付けられていました "(この調査では、クラスサイズについて説明します。この効果は、コードベースのサイズまで拡張されますか?おそらく、私の意見
  • 経験的に、大きなプロジェクトはゆっくりと進む傾向があります。 「新しいプロジェクトで一晩で5Kライン」対「大規模プロジェクトで10ライン/日」。これは、コードベースのサイズが大きくなるにつれて変化する「抵抗」を示していますか?
  • 私たちは常に「最良の言語はありません、それは問題次第です」と宣言します。重要な要件の1つは、問題のエンティティと操作を選択した言語で簡単にモデル化することです。問題を表現するのがより精巧な言語を選択することは悪いであり、コードベースの最終的なサイズと相関しているのではないでしょうか。

さて、それに対して簡単に発砲するいくつかの議論があります。私が考えることができるものに対処させてください:

  • サイズと単純さの比較:もちろん、コードを短くしたり悪化させたりすることは可能です。ただし、これは問題となるのは、さまざまなbrevity-vs-simplicityの比率でコードベースを比較する場合のみです。議論のために、この要素を何らかの方法で制御できると想定できます。

  • 単体テストは依存関係を減らすように圧力をかけます、そして私は経験的に、依存性を減らすことがコードサイズの問題を軽減できることを経験的に同意します(同じサイズの2つのコードベースの場合、より多くの相互依存関係がある方が悪い)。 ただし、本番コードユニット間の依存関係を減らしながら、テストとユニット自体の結合を導入します。


TL; DR:単体テストが悪いとは主張していません。私は尋ねます:テストがコードの量に関連する害を及ぼす損益分岐点はありますか?

3
peterchen

彼女のコードの最悪の部分の基本的なテストカバレッジを記述し、それらのテストに基づいてコードを分解し、継続的なビルドでのユニットテストにより生産性が向上することを経営陣に報告します。変更は、単一の開発者によって伝道されるのではなく、雇用主によって義務付けられた方が簡単です。

これを適切に表現する方法がわからないが、「チャンスが来たときに」彼女のコードをリファクタリングしている場合...まあ、彼女はおそらく「自分のビジネス」に自分を巻き込むためのちょっとしたやり直しだと思っているなので、心を開いてあなたの言うことに耳を傾ける可能性は低くなります。私の経験では、人々は自分がやったことに執着します-それがひどく良くないときでも。

3
TZHX

あなたは難しい立場にいると思います。私は人々がユニットテストを書いたり、さらにひどい、メンテナンス不可能なユニットテストを書いたりしなかったチームにいます。しかし、誰もがユニットテストが優れているという事実を認識していました。

そのため、チームのユニットテストスイートを高品質にすることは、長く困難な道のりでした。物事を改善できる場所を常に見守り、アイデアを伝え、経験を共有します。

一方、あなたには、その利点をまだ理解していない開発者がいます。そして、スパゲッティコードもコーディングします。この特定のケースで最も重要な理由の1つは、適切な単体テストを作成すると疎結合設計が強制されるという事実だと思います。したがって、彼女にテストを書いてもらうことで、長期的には「実際の」コードを改善できると期待しています。

しかし、結局のところ、それはチームの決定だと思います(チームに何人いるのか分かりませんか?)。十分にカバーできる単体テストスイートが必要であるというコンセンサスにチームが到達できる場合、全員が適合し、経験を共有し、チームが共に力強く成長できるようにする必要があります。

ただし、ユニットテストを作成する必要があるという合意にチームが到達できない場合は、別の開発チームと協力して作業することをお勧めします;)

2
Pete

彼女はボスですか?

もしそうなら...基本的に「1オンスの予防は1ポンドの治療に値する」という線に沿っている利点を彼女に納得させることができない限り、あなたはちょっと行き詰まっています。バグは通り抜けます。 TDDは、一貫性のある出力を構築することでそれを軽減するのに役立ちます。

彼女は上司ではないのですか?

あなたが働いているコーディング標準は何ですか?なぜ彼女はスパゲッティコードを吐き出すのを許されているのですか? 「TDDにもう少し時間をかけると、バグに多くの時間を費やす」と言って、ビジネスケースを上司に提示します。ビジネスケースで変更を強制できる人を説得します。

TDDによって時間と$$ MONEY $$を節約できたケースを文書化します。

このバグはそれ自体を表しています。それはライブになる前に捕らえられたでしょう。 2時間の予防に費やせば、10時間の治療時間を節約できたでしょう。こことこことここで起こった。会社で30人時間を節約できる10時間の作業。これだけの金額です。

2
WernerCD

彼女はまったく正しいです。単体テストは「より多くのコード」です。

ただし、プログラムが正常に機能することを確認するために(何度も)作成する必要があるのは、単により多くのコードです。時間の無駄ではありません。コアコンポーネントであると同時に、システムの一部でもあります。

彼女に挑戦する:

  1. コードに慣れていない人が何かを変更するとどうなりますか。
  2. 経験の浅い人が何かを変更するとどうなりますか。
  3. システムの維持コストは、作成にかかる時間では測定されません。それはより長期的な命題です。総所有コストについて考えます。
  4. 彼女の見積もり(コーディングが始まる前に必要だった場合)には、単体テストを作成するための要件を含める必要があります。ビジネスマンはユニットテストを直接必要とする要件を作成しませんが、品質の暗黙の要件があり、将来の変更がバグに悩まされたり、同じプログラマーがソースを変更したりする必要がないことを要求します。
1
rupjones

これは私に何かを修正する立場を残します

どうして?

彼らは問題を引き起こした。彼らはそれを解決する必要があります。

どのマネージャーがこれを可能にしていますか?なぜ他の誰かのバグのあるコードがあなたの問題になっているのですか?

あなたには、これを実現している同僚およびマネージャーがいます。そして、彼らの混乱を片付けることによって、あなたは進んで積極的に参加します。

品質の悪さを感じなければ、何も変わりません。

1
S.Lott

現在量産コードを実行しているものとして話して、その後にTDDではなく単体テストが続きます。これは、現在の場所には適していないようです(一部のプロジェクトでTDDを実行しましたが、それを別のツールとして表示しています)銀の弾丸ではなく古いバッグ)...

それは難しい売りになることができます。単体テストで同僚を販売することはまだできません。単体テストコードでは、運用コードよりも多くのエラーが発生する傾向があることを知っています。したがって、単体テストコードの修正に多くの時間を費やさなければならないのは少しイライラします...しかし、コードが変更された場合、それは素晴らしい保険です。エッジ条件を自動的にテストする優れた方法。

1
Brian Knoblauch

ユニットテストを自分で作成することで、ユニットテストがどれだけ役立つかを彼女に示します。

セントフランシスがかつて言ったように、「常に説教します。必要に応じて、言葉を使用してください。」

コードが単体テストを使用しており、単体テストを使用してバグをより迅速に解決できることが彼女にわかった場合、彼女の考えが変わる可能性があります。しかし、そうではないかもしれません。

結果がどうであれ、彼女はあなたがしたくないことを彼女に押し付けているとは思わない。それはあなたが変えなければならないことです、あなたが模範によって導いていないという認識。

1
George Stocker