web-dev-qa-db-ja.com

単体テストを書くように同僚に動機を与えるには?

約5年間生産されている大型製品に取り組んでいます。コードベースは動作しています。あまりよくないがそれは働いている。新しい機能が本番環境に投入され、小さなQAでテストされます。バグが修正された、など。しかし、私を除いて誰もユニットテストを書いていません。ユニットテストを作成してバグを「追跡」する力を利用して、この特別なバグ(テストケース)が二度と発生しないようにすることはできません。

経営陣と話しました。開発者と話しました。私は会社全体の全員と話しました。 「はい、もっとユニットテストを書かなければなりません!」それは約1年前でした。それ以来、コミット前のコードレビュー( Gerrit )と継続的インテグレーション( Jenkins )の導入を余儀なくされました。

ユニットテストに関するミーティングをいくつか開催し、ユニットテストを書くことの利点も示しました。しかし、誰も興味がないようです。

Q1:同僚に単体テストを書くように動機を与えるにはどうすればよいですか?

Q2:どうすれば自分の個人的なコード品質基準に準拠する意欲を維持できますか?(時には本当にイライラします!)

PS:イライラする事実(1年で到達):

  • 単体テストの総数:1693
  • 「単体テストの例」の合計:約50
  • 私が完了:1521

編集:期待しすぎですか?それが私の最初の職場であり、私は最善を尽くそうとしています。

編集2:すべての回答に基づいて、自分用に小さなチェックリストを作成しました。私はプライベートで2人の開発者と話をしました、そして私達は良いそして正直な話をしました。

Telastyn が言ったように、彼らの1人はユニットテストに本当に不快だと言っていました。 「もっとプロフェッショナルになりたい」と彼は言ったが、彼にはキックスタートが必要です。彼はまた、すべての開発者とのユニットテストミーティング(約9〜11日)は良かったが、混雑しすぎたと述べました。ええ。批評家もいますが、そこから学びます。 (tdd kataミーティングについての以下の回答をご覧ください!)

もう一人は、ユニットテストを書くことに興味がないと言いました。彼の仕事は彼の給料には十分だと彼は思っている。彼はもっと努力したくありません。私はまったく言葉がありませんでした。典型的な9-5「労働者」。

来週は他の開発者と話をします。

素晴らしい回答(これまでのところ!)とサポートに感謝します。ほんとうにありがとう!たくさん学びました、ありがとうございました!

94
lurkerbelow

TDDについて話すことはほとんど機能しないことに気づきました。人々は生の結果を見たいです。 「テストを書くことで開発時間を短縮できる」と言うのが本当である可能性が高いですが、だれでも納得させるには十分ではないかもしれません。

私は同様の立場にありました(まあ、あなたのものほど悪くはありません)。人々が私のコードに取り組み始めたとき、それは一種の解決策でした(注:私のコードは単体テストされ、他のものはそれほど多くありませんでした)。何かが機能しなくなったとき、地元の調査の後の自然なフォローアップは私に理由を尋ねることでした。次に、座って、単体テストを実行し、何が起こったかを確認しました。テストに合格した場合、問題はほとんどの場合、テストされていない新しいコードにあります。そうでない場合、テストは通常​​、問題を特定することができました(または、少なくとも正しい方向に向かっています)。私たちはバグを修正しました、テストは再びアップしました、誰もが幸せでした。

簡単に言えば、このようないくつかの状況が発生し、さらに2人の開発者がTDD /テスト愛好家になりました(まだいくつか残っていますが、有望に見えます)。

アドバイスとしては、TDD kataを試してみてください。 no testsとは対照的に、テストファーストアプローチを使用して実装する簡単なタスク。タスクがどれほど複雑かにもよりますが、非テストアプローチは、特に必要な増分変更がある場合、通常は遅くなるはずです。

編集:OPのコメントにより、彼の自由論にはさらに強力な議論があることがわかりました-regressionakaバグを返す。このような状況は、単体テストがいかに有益かを示す完璧な例です。数字が好きな人-私が言ったように、「ユニットテストは良い」と言うと説得力がないかもしれませんが、以下のようなデータの配置は確かに次のようになります。

  • 機能の実装に費やされた時間(テストは記述されていません。これは頻繁に発生したため、そのような例を見つけるのは比較的簡単です)
  • tDDを使用して機能を実装するための推定時間(またはをテストした後のアプローチ;重要ではありません-重要なのはユニットテストの存在です)
  • テストされていないコードとテストされたコードのバグの解決に費やされた時間

警告する1つのこと(この移行は明白ですが、注意する価値があります): 結果バイアス -テストでバグを見つける唯一の方法がそのためのテストを書くことであった例を選択しないようにしてくださいバグ。通常、バグが事前に発生することは誰にもわかりませんが、「Xのテストを行っていれば、このバグは取るに足らないものです」と言うのは魅力的です。それが終わった後の戦争。

これらの例の結果は簡単な質問になります-機能Yの開発にx時間費やすことができるなら、なぜ2x

48
k.m

まず、なぜ彼らがテストを書いていないのかを知る必要があります。

厳しい開発スケジュールが原因であることがよくありますが、それがないと言います。

次の理由は、テストされていない既存の大規模なコードベースでは、テストを書くのはおそらく圧倒的で、終わりのない仕事(洗濯など)に思えるからです。だから人間の本性は、それは向き合うには多すぎると思うことなので、スキップします。

別の理由としては、テストは良いアイデアであると考えている一方で、特にテストを作成した場所で作業したことがない場合は、テストの開始方法に自信がないことが考えられます。

もう1つの強力な可能性は、アイデアにリップサービスを提供しているにもかかわらず、仕事の価値を実際に見られないためです。

では、さまざまな理由にどのように対処しますか?

理由の1つは単純です。開発時間を節約する方法の例を示してください。

理由2-1年間に作成したテストの数と、カバーするコードベースの割合を示します。計算して、来年のこの時点で彼らがこれを行うと、さらに多くのテストを実行できることを示します。日々の進歩のほんの少しが実際に追加されることを彼らが見ると、全体のアイデアはそれほど圧倒的ではありません。システムからデータを引き出すことができる場合は、コードのテストされていない部分の繰り返しバグであるバグの数と、ユニットテストでコードに表示される繰り返しバグの数を示します。

理由3はトレーニングであり、表示するだけではありません。トレーニングクラスでテストを書いてもらいます。

理由4、これが問題の核心です。まず、問題点を選択します。これは、何度も戻ってきたバグの1つです。それが来たら、今こそ、このアイテムのユニットテストがあったとしても、悪いペニーのように戻ってくることはないだろうと経営陣に提案するときです。

理由4に対処するもう1つの方法は、管理者にそれをプロセスの一部にして、テストもコードレビューに合格しない限り、コードがコードレビューに合格しないようにすることです。これらの問題点の1つが発生した直後に、またはできれば数日のうちにいくつかの問題が発生した直後に、これをポリシーにしてアプローチすることをお勧めします。

開発者として私たちは自己管理(LOL)していると思っていますが、意欲的なことは、管理者が気にする必要があることを管理者が強調することや、実際に自己管理を行う専門家がすでにテストを作成していることを気にかけていることです。彼らが製品を改善したり、マネージャーに昇進(または解雇されない)を印象づける方法を気にしたりして、彼らがプロであることやベストプラクティスを行うことを気にしない場合は、これがあなたにとって適切な場所かどうかを検討する必要があります。経営陣にベストプラクティスを気にかけることができない場合は、ずっと困難な戦いに直面することになります。これがあなたにとって適切な企業文化であるかどうかを評価するかもしれません。すべての職場に問題があります(そして、逃げることが常に答えであるとは限りません)が、この場所はあなたのプロ意識のレベルに適合していないようです。

28
HLGEM

TDDの利点を示すことで、開始します。単体テストの利点を紹介してみてください。

通常の人間と同様に、開発者は利益に動機付けられています。彼らは単に仕事を増やすだけのことをしたくないのです。 単体テストは少ない作業を意味します。もっと友達と出かけることです。毎晩23時までコーディングする必要がないので、もっと楽しくなるということです。それは、安心して休暇を過ごすことを意味します。

TDDの最大の利点の1つは、プログラムをrefactorより良い設計に変更したり、名前を変更したりできることです...その設計はテストを壊さないので、変更が何も壊さなかったという100%の自信を持つことができます。

TDDのもう1つの優れたケースは、レガシーコードのユニットテストの作成です。これは、悪のリファクタリングを開始するための最良の方法の1つです。長い目で見れば、これはコードベースの知識を向上させ、その長所と短所を理解し、コードにハードコーディングされたビジネスロジックを見つけて、品質を向上させる良いスタートを切るのに役立ちます。

さらに読むための良い参考文献:

9
Yusubov

これは、主導の例の大きなケースのようです。

あなたが戦っている人間の本性には2つの固有の側面があります:

  • 創造的な人々はプロセスを好まない。
  • ほとんどの人は、自分の品質に対する外部の否定的な判断を好みません。

これを講義、経営者の宣言、または論理でさえ戦うことは非常に困難です。あなたは人間の本性の別の側面を利用して勝つ必要があります。

  • 人々は最高の従業員の行動を模倣しています

優秀な従業員がTDDを使用して機能する場合、プロセスは拡大します。そうでない場合は、そうなりません。誰かを説得する必要がある場合、それはトップ1または2の従業員です。

7
MathAttack

http://blog.jtimothyking.com/2006/07/11/twelve-benefits-of-writing-unit-tests-first

ジェフ・アトウッドの記事のリンクを少し前にブックマークしたと思います[編集: はい、ここにあります) 。古いが関連。これらの利点と他の答えで間違いなく概説される他の利点のために、プログラマーは自分自身をやる気にさせることができるはずです!それは彼らがより効率的に働くことを可能にし、したがって彼らの仕事を少し簡単にします。誰がそれを望まないのですか?

2番目の質問について:コードの品質基準に対する所有者の意識と誇りが、それを順守してくれるはずです。そのような基準を設けることによって達成したいことと、その基準から誰が恩恵を受けるかについて考えてください。私の個人的なコード標準も同様に苛立たしいものになる可能性がありますが、私は常にそれらを実装することで世界/会社/チームに好意を抱いているように感じています。だからあなたがやりすぎているとは思いません-結果は場所によって異なりますが、少なくともあなたは努力しています。

7
gws2

質問してください

あなたは人々が言われたと言って、彼らはより多くのテストを書くべきであることに同意します。なぜそうではないのですか?

単純な動機の問題ではない場合があります(多くの場合、そうではありません)。彼らはそれらを忘れるかもしれません。彼らは時間のプレッシャーの下で感じるかもしれません。彼らは良いテストの書き方を知らないかもしれません。彼らはあなたがとても上手で、彼らがそれをする必要がないと思っているかもしれません。根本原因を知ることは、問題をよりよく解決するのに役立ちます。

3
Telastyn

あなたはユニットテストが自分自身を売ることだと思うでしょう。貴社の仕組みはわかりませんが、運用展開中に問題が発生した場合は、修正されるまで対応させていただきます。日曜日の午前2時に発生するかどうかは関係ありません。これは私たちにとって非常にまれですが、そうなるとひどいです。

最初に、自動テストで簡単に見つかる可能性のあるいくつかの大きな問題を修正するために、夜中に何回起きなければならなかったかを尋ねます。つまり、自動テストですべてが修正されるわけではありませんが、それによって問題が軽減されるはずです。

2番目の売り手はQAサイクルです。私の会社でTDDを開始する前に、新しいリリースをQAにプッシュして毎週テストしていました。彼らはそのリリースから大量のバグを作成します。それらのバグを修正し、別のリリースをプッシュします。完了するまで繰り返します。私たちが最初に行ったTDDプロジェクトでは、数週間後までQAへのプッシュアウトは必要ありませんでした。見つかったバグの数はごくわずかです。同様のプロジェクトと比較して10%。とにかくあなたのチームのためにそれらの統計をまとめる方法はありますか?

もう1つの大きなセールスポイントは、TDDが採用された後のコードの外観です。テストを簡単にしたかったので、読みやすかったです。単体テスト用に記述されたコードと記述されていないコードの比較を表示します。

最後に、自信を持ってコードをリファクタリングできる方法を説明します。

テストを書きたくない場合は、これらすべてを覚えておいてください。 :)

2
bwalk2895

私はいくつかのテクニックを使用しました:

a)自動ビルドをセットアップします。あなたがテストしたものを誰かが破ったとき、テストがそれをどのように検出したか、そしてバグがどれほど悪かったかを彼らに示してください。

b)テストで複雑なプロジェクトを実行します(運転します)。これにより、そのプロジェクトに存在するバグの数が示されます。完璧に動作し始めた1つの複雑なサーバー対話プロジェクトがありました。 QAに失敗することはなく、すべての統合テストは100%スムーズに進みました。そのシステムは非常に安定したものとして知られるようになり、全体的な管理はそれに満足しました。これらの状況で行うことは、ユニットテストがそれをどのように有効にしたかを示しています。

c)一度に1人ずつ引き込みます。あなたの言うことを聞く人。バグを取り、テストがどのように深く困難な問題を明らかにするかを示します。これは役立ちます。それは決して簡単なことではありません。しかし、あなたがファンを獲得すると、彼は助けるだけです。それはドミノ効果です。

1
user84575

HLGEMの答え について詳しく説明したいと思います。特にこのセクションは次のとおりです。

次の理由は、テストされていない既存の大規模なコードベースでは、テストを書くのはおそらく圧倒的で、終わりのない仕事(洗濯など)に思えるからです。だから人間の本性は、それは向き合うには多すぎると思うことなので、スキップします。

テストを書くつもりで書くコードは、テストを書くつもりがないコードよりもはるかに優れたコードであることがわかりました。自分に問いかけるこの関数をどのようにテストしますか?は、すべての関数の設計を改善します。 (グローバルデータまたはセミグローバルデータへの依存度の低下; IO、関数は1つのことだけを実行します;一貫したエラー処理など)

テストを念頭に置いて書かれていないoldコードに対してテストを実行しようとすると、イライラするだけでなく、.

1
sarnold

プロセスでユニットテストをベイクします。ユニットテストで把握できないほど明白なバグが本番環境で発生した場合は、この人が責任を負います。作成した各テストを書くように割り当てます。ランダムにケースを選択し、毎週いくつかのケースの実行を監視します。ユニットテストを行うことにより、人々は要件について尋ね、最終的には要件を開発に結び付け、うまくいけば、必要で機能するソフトウェアを開発します:)

0
NoChance