私のチームのすべてのプログラマーは、単体テストと統合テストに精通しています。私たちは全員それで働いてきました。私たちはすべてそれで書かれたテストを持っています。私たちの中には、自分のコードに対する信頼感の向上を感じる人もいます。
ただし、何らかの理由で、ユニット/統合テストを作成することは、チームのどのメンバーにとっても反射的ではありません。実際のコードと同時にユニットテストを記述しないと、実際に気分が悪くなる人はいません。その結果、コードベースはほとんどユニットテストでカバーされず、プロジェクトはテストされずに本番環境に入ります。
もちろん、その問題は、プロジェクトが本番環境に移行し、すでに適切に機能していると、ユニット/統合テストを追加するための時間や予算を取得することが事実上不可能であることです。
私のチームのメンバーと私はすでにユニットテストの価値に精通しています( 1 、 2 )が、ユニットテストを自然なワークフローに組み込むのに役立っていないようです。 。ユニットテストやターゲットカバレッジを必須にした私の経験では、これらのテストを作成するための自己生成の動機がないため、チームメンバーの速度が低下し、テストの質が低下します。また、プレッシャーが和らぎ次第、単体テストは書かれなくなります。
私の質問は次のとおりです。チーム内でダイナミック/モメンタムを構築し、人々が自然にそれらのテストを作成して維持したいと思うようになる、実験した方法はありますか?
実際のコードと同時にユニットテストを記述しないと、実際に気分が悪くなる人はいません。
これはあなたが取り組む必要があるポイントです。チームのカルチャーは、スプリント中にテストを記述しないこと(または使用する時間の単位が何か)がハードコーディング値と同じくらいコードの匂いになるように変更する必要があります。その多くは仲間からのプレッシャーを伴います。だれも本当に標準以下として見られることを望んでいません。
自分でテストしてください。あなたがそれらをしないときは、目に見えて自分を非難します。 「良い」プログラマーが単体テストを作成した場合、そのバグをどこで見つけたのかを指摘します。誰も悪くなりたくない。この望ましくない振る舞いは悪いことであり、人々は続くでしょう。
チーム全体を実際にwantすることは、同じことは非常に難しい場合があります。何かの価値を見ることだけでは、人々に根本的な行動を変えるよう促すのに十分ではない場合がよくあります。変化を大切にし、特にそれを望んでいる人でさえ、無意識のうちにそれと戦う責任がある場合があります。
問題は実際には個人のモチベーションの1つであり、チームのモチベーションそのものではありません。あなたが最終的に理解したと感じた何かの結果として、または平均的なプログラマーがすべてを投入してプロセスを完全に変更させるいくつかの新しいツールまたは他の主観的なもののために、明確な瞬間があなたに届く時が来ます。あなたの仕事-あなたがそれを除外することを選択するべきか-あなたやチームがどのものがトリガーになるかを見つける方法があるかどうかを確認することです個々のチームメンバーの明確さ。
私個人的には、それは単にDotNetで [〜#〜] bdd [〜#〜] の StoryQ フレームワークを発見するだけでした。私は完全にテストファースト対テストの同時「バリア」を乗り越えました。後でVisual Studioの NCrunch を見つけたときに、選択を再確認しました。戦いの半分は、アイデアを販売することではなく、習慣に根本的な変化をもたらすために必要な労力を減らすことである場合もあります。それでも、少しの時間と作業が必要になる場合があります。しかし、これらの同じ個人的なトリガーは、同時に、または実装コードの後でさえ、同じくらい多くのテストコードをまだ書いている私の同僚のアプローチを揺るがすのに十分ではありませんでした。
また、変更の理由が正しい場合でも、何かを変える方法を学ぶために必要な努力に対する固有の恐怖、不信、または不快な見解のために、物事のやり方を変更することをためらう場合もあります。テストプラットフォーム全体が特定の方法で機能するようにツールされている場合、物事の実行方法を変更し、toolingを変更する可能性を正当化するのは難しい場合があります。特に、古いテストと新しいテストがプロジェクトの存続期間中共存し続ける必要がある場合-そして、これまでに作成したすべてのテストを書き直す必要はないでしょう。奇妙なのは、これが新しいテスト方法を採用する唯一の方法であると人々が感じることであり、それ自体、そのような人々が賢明な変更をより良く受け入れることを難しくします。
本当に、何かが再帰的になる唯一の方法は、自分が方法に過度に集中する必要がないことに気付かなくなるまで、自分に何度も何度もそれを強制することです。時々、チームでこれを行う唯一の方法は、少し厳しいと思われるポリシーを設定し、ペアプログラミングとコードレビューを練習すること、およびチームメンバーがお互いに文字通りforce発生する動作の変更。しかし、そのような戦略が本当に成功するためには、必要に応じてそのような措置を受け入れ、プロセスに参加するために、個々のチームメンバー全員からの確固たる誠実な取り組みが必要です...そして関係者全員からの多くの忍耐。
実際のコードと同時に単体テストを記述しないと、実際に気分が悪くなる人はいません
「同時に」とはどういう意味かわかりませんが、実際のコードの前にbefore書いてみませんか?
心理学の観点からは、コードの後に単体テストを書くことに煩わされたくない人間がいるのはなぜでしょうか。その時点でコードは既に機能しているので、いったいなぜそれをテストする必要があるのでしょうか。面倒で、一見役に立たないようで、テストを書かないのは危険ではないので、ある種の遅延が自動的に発生します。その結果、長期間にわたってテスト後のアプローチを続けてきた多くのチームを知りません。
しかし、私の経験では、テストファースト(TDDスタイル)は、すぐに中毒になる可能性があります。これには、少なくとも2つの即時的で具体的なエンドルフィン放出の利点があるからです。
これは、具体的な実行可能要件に直面するコードを設計し、リファクタリングするにつれて設計をますます改善するのに役立ちます。
TDDサイクルは、頻繁に「緑のバー」の瞬間で中断され、すぐに成功の味を楽しむことができます。それはあなたの心を常に満足させ、次の機能を実装する準備ができています。
だから私はあなたのチームを作ろうとはしません悪い気分彼らがテストを書かなかったとき。代わりに、私はそれらを気分が良いにしようと思います。 TDDはこれを行う1つの方法です。
すべてが自然に何かをしたいプログラマのグループを持つことは、(特に大規模なグループについて話すとき)おかしなことです。
単体テストと統合テストは標準のものです。ワークフローの標準を作成し、チームの各メンバーはそれを尊重する必要があります。標準はQAの専門家の助けを借りて作成する必要があります。プログラマーは標準を尊重する必要があります。あなたができることは、標準をきれいに、理解しやすくそして従うようにすることです。
それはあなた自身のコードへの信頼と使用したいということではなく、誰もが良いことをするために使用するコーディングとテストの標準を必要とすることであり、プログラマーはこれを理解するべきです。
最初から人に基準を守らせると反射になって従います。単体テストなしではコードをコードベースに入れることができないというルールを作ることは、それをしなければならないことを人々に納得させるでしょう。プロジェクトリポジトリには、さらに制限の厳しいルールがあります。たとえば、企業は実際にユニットをコーディングする前に(モジュール仕様を作成するときに)ユニットテストを実行しますが、これは非常に優れた方法です。プログラマーがプロジェクト/コードベースにコードを配置すると、コードはテストモジュール全体で実行され、ユニットテストに合格しなければ、作業に戻ります。
現時点で標準とルールを追加するのが難しい場合は、少なくとも将来のプロジェクトに追加することを検討してください。
最初に、テストの記述と実行が簡単であることを確認し、現在のプロジェクトでフレームワークをセットアップし、そのセットアップ手順を将来のプロジェクトに簡単に組み込むことができるようにする必要があります。
このようにして、プログラマーがデバッグしようとしている新しい機能をユニットテストする場合、テストを適切に実行するために数十のループを飛び越える必要はありません。
何かをするのが厄介であるほど、習慣を作る可能性は低くなります
文化の変化を促すのにある程度成功している私がやったことの1つは、「ユニットテストキュレーション」セミナーを毎週開催することです。これの公式の目的は、単体テストスイートを高速で最新の状態に保つのを助けることですが、私の心の中でより重要な目的は、人々が立ち寄り、質問し、テストを実践するための低圧の方法を提供することです。テストに1時間または1週間あたり何でも独占的に費やす気があるという事実も、これが重要であるというメッセージを送信します。
この方法で少し文化の変化が生じ、それを「反射的に」行うための障壁を取り除き始めると思います。人々は逆境の最初の兆候で古い習慣に戻る傾向があります-このようなミーティングを行ってもそれは一気に解決するわけではありませんが、文化の変化を開始し、実際にはないことから生じる障壁を取り除くと思いますあなたが何をしているかを知っています。