タグ付けされた質問 「unit-testing」

ユニットテストは、ソースコードの個々のユニットをテストして、それらが使用に適しているかどうかを判断する方法です。

3
アプリケーションコードと単体テストのインターフェイス
私は、いくつかの新しいモジュールを実装してユニットテストする必要があるプロジェクトに取り組んでいます。私はかなり明確なアーキテクチャを念頭に置いていたので、メインのクラスとメソッドをすぐに書き留めてから、単体テストの作成を開始しました。 テストを書いている間、次のような元のコードにかなりの修正を加える必要がありました。 それらをテストするためにプライベートメソッドをパブリックにする プライベート変数にアクセスするためのメソッドを追加する ユニットテスト内でコードを実行するときに使用するモックオブジェクトを挿入するためのメソッドを追加します。 どういうわけか私はこれらが私たちが何か間違ったことをしている症状であると感じています、例えば 最初の設計が間違っていた(一部の機能は最初から公開されているはずでした)、 コードは、単体テストとのインターフェース用に適切に設計されていません(おそらく、かなりの数のクラスが既に設計されているときに単体テストの設計を開始したという事実が原因です)。 ユニットテストを間違った方法で実装している(たとえば、ユニットテストはAPIのパブリックメソッドを直接テスト/アドレスするだけであり、プライベートメソッドをアドレスするべきではない)。 上記の3つのポイントの混合、およびおそらく私が考えていなかったいくつかの追加の問題。 単体テストの経験はあるものの、第一人者にはほど遠いので、これらの問題についてのあなたの考えを読んでいただければ非常に興味があります。 上記の一般的な質問に加えて、より具体的で技術的な質問があります。 質問1.クラスAのプライベートメソッドmを直接テストし、それをテストするためにパブリックにすることは理にかなっていますか?または、mを呼び出す他のパブリックメソッドを対象とする単体テストによってmが間接的にテストされると想定する必要がありますか? 質問2.クラスAのインスタンスにクラスB(複合集約)のインスタンスが含まれている場合、AをテストするためにBを模擬することは理にかなっていますか?私の最初のアイデアは、BインスタンスはAインスタンスの一部であるため、Bをモック化しないことですが、それからこれについて疑い始めました。Bをモックすることに対する私の議論は、1と同じです:Bはプライベートwrt Aであり、その実装にのみ使用されます。しかし、これらの問題は設計上の欠陥を示している可能性があります。おそらく、複合集約ではなく、AからBへの単純な関連付けを使用する必要があります。 質問3.上記の例で、Bをモックすることにした場合、どのようにBインスタンスをAに注入しますか?ここに私たちが持っていたいくつかのアイデアがあります: AコンストラクターでBインスタンスを作成する代わりに、Aインスタンスの引数としてBインスタンスを注入します。 BFactoryインターフェースを引数としてAコンストラクターに渡し、Aがファクトリーを使用してプライベートBインスタンスを作成できるようにします。 AにプライベートなBFactoryシングルトンを使用します。シングルトンを設定するには、静的メソッドA :: setBFactory()を使用します。Aが設定されている場合(テストシナリオ)、ファクトリシングルトンを使用するBインスタンスを作成する場合、シングルトンが設定されていない場合(実稼働コードシナリオ)、Bを直接作成します。 最初の2つの代替案は私にはきれいに見えますが、Aコンストラクターのシグニチャーを変更する必要があります。APIを変更してテストしやすくすることは、私には不便に思えますが、これは一般的な方法ですか? 3番目の方法には、コンストラクターのシグニチャーを変更する必要がない(APIへの変更の影響が少ない)利点がありますが、テストを開始する前に静的メソッドsetBFactory()を呼び出す必要があります。これはIMOエラーが発生しやすい(テストが適切に機能するためのメソッド呼び出しへの暗黙の依存関係)。どちらを選べばいいのかわかりません。

6
情報のソースとしてユニットテストを使用する方法
私の同僚は、アジャイル開発に関するセミナーにかつて、ユニットテストを技術文書として使用することが可能だと聞いていました。クラスの使用方法の例として単体テストを使用するようなもの。 Googleのクイック検索でTDDとドキュメントが提供されました。これにより、それが可能であることが証明されます。しかし、コードを見ると、明らかにそのような方法で単体テストを実装できていないことがわかります。 私の意見では、ユニットテストは、モックおよび偽のクラスと関数の助けがあっても、最小限のユニットとしてコードをテストするためにあります。 したがって、質問は次のとおりです。 クラス(またはクラスのセット)の使用方法を示すのは、機能テストのタスクではありませんか? 単体テストを技術文書として使用できる場合、そのような単体テストの実装方法に関するガイドラインはありますか?

1
「統合テスト詐欺」の削除-コラボレーションおよび契約テストの理解[終了]
ここで何が質問されているのかを理解することは困難です。この質問は、あいまいで、あいまいで、不完全で、過度に広い、または修辞的であり、現在の形では合理的に回答することができません。再開できるようにこの質問を明確にするヘルプについては、ヘルプセンターに アクセスしてください。 8年前に閉鎖。 私は最近、統合テストが JB Rainsbergerによる詐欺であることを確認しました。この件について、さらに資料を探しています。私は、Rainsbergerによって説明されている概念に興味をそそられ、どのようにそれらを適用するかについても混乱している(つまり、単体テストを行う必要がある場合の統合テスト)ことにどれほどの誤りがあるかについてショックを受けました。説明したコラボレーションテストとコントラクトテストの詳細を知りたいのですが、どこから始めればよいかわかりません。 私の心に残った唯一のことは、テストが尋ねる必要がある4つの質問です: サイドA: Do I ask the right question? Can I deal with the answer? サイドB: Can I answer a question? Do I answer correctly? しかし、これをアプリケーションスタックのランダムなメソッドにどのように適用すればよいのでしょうか。 実世界の例を取り、孤立したマイクロテストのこれらのアイデアを適用する本、チュートリアル、または例がありますか?理想的には、この例ではJava、Spring + PowerMock / Mockito / EasyMoockを使用しています これらの概念を一般的に扱っており、それらをよりよく理解するのに役立つ任意の文献をいただければ幸いです。 また、適切なユニットテストを行う方法、さらには既存のコードをリファクタリングしてサンプルを投稿する方法について、より詳細な質問をすることができるフォーラムがある場合は、すばらしいでしょう。 ありがとう! 編集-いくつかの追加の考え: モックを使用する場合と、スタブを使用して、テスト対象のクラスをそのコラボレーターから分離する場合の一般的なルールはありますか?4つの質問に適用できますか? 最良のモックフレームワークはPowerMockのようで、モックしたいクラスとそれが返す必要があるクラスをテストごとに正確に定義できますか、それとも上記の質問に使用したものがありますか?PowerMockを使用して、DAOやGUIなど、実際のアプリケーションスタックの一部に特定の原則の一部またはすべてを適用する優れたチュートリアルはありますか? 編集2-例 テストしたいメソッドの種類と私の考えのほんの一例 注文を保存するWebサービスがあります。この段階では、最高のセキュリティについてあまり心配していません。そのため、いくつかのセキュリティを確保するために、サービスはユーザー名とパスワードを使用して保存要求を認証します。認証さOrderManagerれると、を保存するためにが呼び出されますOrder。内部的には、マネージャーは、新しい注文を作成する必要があるか、既存の注文を更新する必要があるかを決定します。(それはWebSericeにとって重要ではありませんよね?) @WebService public class …

2
HTMLマークアップ用のユニットテストフレームワークはありますか?[閉まっている]
閉まっている。この質問はトピックから外れています。現在、回答を受け付けていません。 この質問を改善してみませんか? 質問を更新して、ソフトウェアエンジニアリングスタック交換のトピックになるようにします。 5年前休業。 私はウェブデザインショップで働いています。私たちのワークフローは2つの部分に分かれています。フロントエンドプログラマーがサイトデザインの静的なhtmlおよびcssテンプレートを作成し、バックエンドプログラマーがテンプレートをCMSに結び付けます。 私たちのサイトには一連の共通機能があり、この機能のテストに使用できる単体テストフレームワークがあるかどうか疑問に思っています。 たとえば、共通の機能ガイドラインの1 つでは、PDFへのすべてのリンクを新しいウィンドウで開く必要があると規定されています。このようなユニットテストを書きたいのですが if(a.class = 'pdf_link') assert(target='_blank) ウィキペディアの単体テストフレームワークのリストには、この比較的単純な機能(文字列をテンプレートに対してチェックする)を網羅するものは何もないようで、大量のbashスクリプトを作成してCIサーバーに結び付けることに傾倒しています。 しかし、これを行うより良い方法はありますか?

2
単体テストのライブラリとツールを評価するときに何を探す必要がありますか?
この投稿を改善してみませんか?この質問に対する詳細な回答を提供してください。これには、引用や、回答が正しい理由の説明が含まれます。詳細が不十分な回答は編集または削除される場合があります。 私はすぐにプロジェクトを開始するための新しい単体テストツールを選択しています。それらはたくさんあります! 私が持っている基本的な要件は、少なくともWindowsとLinuxでテストを実行でき、C ++ / C ++ 03互換であり、テストを並行して実行できることです(たとえば、マルチコアプロセッサを利用するため)。コマンドラインから実行することができます。しかし、これらはかなり広い要件であり、分野を絞り込んでいません。 それを試すために、さまざまなタイプの実装の潜在的な落とし穴と落とし穴を調べています。たとえば、Pythonなどの高レベル言語で単体テストエンジンを使用したい場合でも、C単体テストのような形式の出力を生成できますか?ここでの私の主な目的は、C ++とPythonの両方の結果テストに同じストレージツールとレポートツールを使用することです。 また、テストを実行するために特定のエンジンが必要なのか、それとも継続的インテグレーションエンジン(buildbot)に統合するのに十分なのかについても考えています。 上記の2つの懸念は有効ですか?単体テストエンジンを評価するとき、他に何を心配する必要がありますか?

8
一般的な単体テストの足場コードを作成することの利点と欠点
私のチームと私が取り組んでいるプロジェクトでは、大きな足場のコードが必要になることがよくあります。正しい値を持つドメインオブジェクトの作成、リポジトリのモックの設定、キャッシュの処理などは、すべてのテストで一般的に発生することです。多くの場合、ドメインの中心となる同じ基本オブジェクト(人、...)で作業しているため、他のオブジェクトで作業するために、多くのテストでこれらのオブジェクトのインスタンスが作成されます。基本ドメインを使用するさまざまなソリューションがたくさんあるので、この種のコードは多くの場合、それらのソリューションに分散しています。 私はこの足場の多くを行う共通のクラスを作成することを考えてきました。これにより、すべてが設定された完全にインスタンス化された人(リポジトリ経由のアクセス、キャッシングなど)をリクエストできます。これにより、個々の単体テストから重複したコードが削除されますが、テストごとに「多すぎる」コードが大量にあることも意味します(必要なパーツだけでなく、完全なオブジェクトが設定されるため)。 誰かこれをしたことがありますか?このアプローチを検証または無効にする可能性のある洞察、発言、考えなどはありますか?
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.