web-dev-qa-db-ja.com

「早期リリースが頻繁にリリースされる」環境での単体テストの関連性は何ですか?

過去1年ほどの間、私はチームをリリース-早期リリース-多くの場合開発モード(別名:アジャイルではなく高速アプリケーション開発)に向けて推進してきました。ビルドを閉じる方法の詳細については、ここの私の回答を参照してください: RAD environment でリリース品質を向上させる簡単な方法)

RADを採用したとき、人々は完全に独立していて、最初に単体テストを行っていました。統合テストはプロセスのかなり後の方で行われました。それは、正式な強制をあまり行わない自然なプロセスでした。今の状況はかなり異なります:

  1. プラットフォーム全体は、ホットスポットなしでクライアント側で機能する確立されたビルド/リリースと十分に統合されています。

  2. 新しい機能要件が次々と登場し、私たちはそれらを段階的に構築していきます。

  3. システムの全体的なダイナミクスは非常に重要です。独立した開発グループがプロセスを正しく実行している一方で、複雑で非自明な状況が原因で重大な障害が発生しているためです。

  4. システムの多くの部分には新しいアルゴリズムと研究入力が含まれるため、明確に定義されたソフトウェアでの機能テストのように、課題(およびテストのメカニズム)が常に正しく予測されるとは限りません。

最近、私はプロセスの改善が必要かどうかを確認するために全体像を改善しようとしていました。チームと一緒に座ったとき、彼らの多くは「私たちはもうユニットテストをしません!」他の人は、それが決して効果的ではないので、今から始めるべきではないと考えました。

単体テストは比較的成熟したシステムで役立ちますか?ユニットの成熟度に応じて、少なくともテストスコープを比較検討する必要がありますか?単体テストは開発のペースを遅くしますか?別の方法でユニットテストを評価する必要がありますか?

リリース-アーリー-リリース-多くの場合環境で成熟したプラットフォームをテストするためのベストプラクティスは何ですか?

10
Dipan Mehta

単体テストは、主にバグを見つけるためのものではありません。システムの次のリリースが前のリリースと同じくらい安定していることを確認するためのものです。リリースサイクルが短いほど、このテストを手動で実行する代わりに自動的に実行できることが重要になります。

もちろん、いくつかの独立した部分を持つシステムがあり、システムのごく一部でのみ2つのリリース間で作業していた場合、おそらくシステムの他の部分に対するいくつかの単体テストを省略できます。ただし、作業しているパーツの単体テストを確実に使用(および拡張)する必要があります。

もう1つのことは、システムが大きくなると、追加の統合テストがますます必要になるということですが、それは、必要な単体テストが少なくなるという意味ではありません。 。

あなたの背後にある本当の質問は、おそらく別の質問かもしれません。システムがどんどん大きくなっているので、単体テストを書くのが難しくなっていますか?あなたの「ユニット」テストは本当にユニットテストですか、それとももはや単独で物事をテストしませんか?これは、時間の経過とともに安定したシステムの下位レベルの部分に依存しているためである可能性があります。

これらのことが起こるのは、開発者が既存のライブラリとコードを直接参照して再利用する傾向があるためです。多くの場合、より複雑な環境とより多くのテストデータを提供する必要があるため、単体テストの作成が難しくなるという影響があります。それが問題である場合は、重要な概念 依存性注入 および インターフェイス分離の原則 で学習する必要があります。これは、コードをよりユニットテスト可能にするのに役立ちます。

15
Doc Brown

テストが設計されているテスト駆動開発を検討することを検討する必要がありますfirstと記述されたときに新しいコードがどのように機能するかを説明します。次に、テストに合格します。

私の経験では、これにより、特にライブラリのコードをより無駄のない優れたものにする傾向があり、仕様の実行可能な部分です(つまり、常に正しいドキュメントになることを意味します)。

とはいえ、既存のテストを使用して、コードstillが期待どおりに機能することを確認します。コードの破損をキャッチし、アップグレード時にサードパーティのコードが期待どおりに機能することを確認できます。

4
user1249

Doc Brown および ThorbjørnRavn Andersen によって示唆されているように、早期リリースを頻繁にリリースする環境はメリットがあります優れた単体テストと テスト駆動開発 からのリリースサイクルが長いものよりもさらに多く

優れた 継続的インテグレーション システムが導入されており、機能を適切に表すテストが行​​われている場合は、いつでも何が機能しているか(その機能のテストに合格しているため)、何が機能しているかがわかります。まだ実装されていません(その機能のテストがないため)。

3
Mark Booth