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

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

3
手動テストと自動テストの相対的な価値
私が働いている組織では最近、手動テストを実行するためにテスト担当者を雇っていますが、開発者としてユニットテストを書く時間を与えられるかどうかを尋ねたところ、手動​​テストの方が費用が大きくなると回答しました。それは私には間違っていると感じているものであり、手動と自動のテストを相互に評価する手段を探しています。手動テストの場所がないと言っているわけではありませんが、自動テストは、少なくとも、繰り返しの多い退屈なタスクのいくつかを取り除くように思えます。いくつかの単体テストといくつかのセレンテストを実行するビルドサーバーがあるので、自動テストのアイデアは無意味ではありませんが、投資収益率が低いと見なされています。 システムの完全なエンドツーエンドテストを誰かに行わせることで最終製品がテストされ、最終的にそれがユーザーの関心事であることが理解できますが、それは時間がかかり、非常に反復的です。手動回帰テストとは、以前のすべてのテストを繰り返し、何も変更されていないことを確認することです。プロセスに4つのパスがある場合、それはそれぞれ5分かかる4つの手動テストです。 それで、自動テストの時間の予算を立てるために使用できる検証可能な事実と数値はありますか?さらに言えば、リンクにあるもの以外の自動テストの欠点は何ですか?

7
このシナリオでは、単体テストのモックが適切ですか?
私はJavaで約20のメソッドを作成し、それらすべてがいくつかのWebサービスを呼び出します。これらのWebサービスはまだ利用できません。サーバー側のコーディングを続行するために、Webサービスが提供すると予想される結果をハードコーディングしました。 これらのメソッドを単体テストできますか?私の知る限り、単体テストは入力値を模倣しており、プログラムがどのように応答するかを確認しています。入力値と出力値の両方をモックすることは意味がありますか? 編集: ここでの答えは、私が単体テストケースを書くべきであることを示唆しています。 さて、既存のコードを変更せずにそれをどのように書くことができますか? 次のサンプルコード(架空のコード)を考えます。 public int getAge() { Service s = locate("ageservice"); // line 1 int age = s.execute(empId); // line 2 return age; // line 3 } では、出力をどのようにモック化しますか? 現在、「行1」をコメントアウトして、行2をに置き換えていint age= 50ます。これは正しいですか ?誰かが私にそれを行う正しい方法を教えてもらえますか?

2
TDDアプリケーションで依存関係を初期化するのは誰ですか?
私はモック/偽のオブジェクトでTDDを実装することを学ぼうとしています。私が持っている質問の1つは、TDDを実装するアプリケーションで依存関係を初期化する方法です。この記事の例 Moq 3でモックを開始すると、次のようになります。 public class OrderWriter { private readonly IFileWriter fileWriter; public OrderWriter(IFileWriter fileWriter) { this.fileWriter = fileWriter; } public void WriteOrder(Order order) { fileWriter.WriteLine(String.Format("{0},{1}", order.OrderId, order.OrderTotal)); } } この例では、コンストラクターがIFileWriterパラメーターを取ります。実際のアプリケーションの場合は実際のファイルライターを、単体テストの場合は偽のファイルライターを提供するためです。私の質問は、実際のアプリケーションでは、誰がこのパラメーターを提供するのですか?このアプリケーションの呼び出し元になると思います。コンストラクタにも依存関係がある場合はどうなりますか?呼び出し元のコードもそれに責任がありますか? たぶん、より良い方法は、ファクトリーを使用することです。この工場はどのように機能しますか?そして、工場はどのように分配されますか?上記の方法のようにコンストラクターパラメーターにありますか?


3
サービス層とDAO層のあるアプリケーションのテストでは、何をモックする必要がありますか?
私のクラスはこの構造に従っています サービス層(InputDTOを作成してDBデータにマップ) DAO層(実際にDB呼び出しを実行します) サービス層のJUnitテストを作成すると、DAO層が呼び出され、実際のDB接続とDBからのデータの取得が期待されます。 DAO層をサービス層から完全にモックする必要がありますか、それともDB接続とDBから受信したデータをモックする必要がありますか? 次に、アプリはキャッシュから特定のデータを期待します。 JUnitランタイムの場合、キャッシュがないので、これをどのように処理する必要がありますか?サービス層メソッドには、詳細を取得するためのキャッシュの検索が含まれます。

3
単体テストをすべきか
私のWebサービスのロジックのほとんどは、サプライヤーのWebサービスとの対話(可用性の確認、注文など)を含みます。それらにはテスト環境がなく、ほとんどの呼び出しは任意に実行できません(たとえば、停止は1回実行され、実際にサービスを停止します)。 この環境で単体テストを実行することは可能ですか?一般的な応答をシミュレートすることはできますが、サプライヤの応答をハードコーディングすると単体テストのポイントが損なわれるのではないかと心配しています。

4
テストデータベースに入力して使用するためのベストプラクティスは何ですか?
そこで、HibernateとMySQLを使用して、データベース駆動型のRESTful Java Webサービスをいくつか開発しています。テスト目的で、私はH2インメモリーデータベースを使用しています。H2は素晴らしく高速なので、これは非常にうまくいきました。唯一の問題は、テストの前にDBテーブルにデータを入力するのが面倒なことです。基本的には、一連のオブジェクトを手動で作成して永続化します。多分私は間違った道を行くのではないかと思っています。 教えてください、私がやろうとしていることをするためのベストプラクティスは何ですか?私を助けることができるツールはありますか?一般的な戦略やヒントはありますか?

7
TDDで常にユニットテストを記述していますか?
私は長い間、TDDスタイルのコードを設計および開発してきました。TDDについて私を悩ませているのは、ビジネスロジックや興味深い動作を含まないコードのテストを作成することです。TDDはテスト以上の設計アクティビティであることは知っていますが、これらのシナリオでテストを記述することは役に立たないと感じることがあります。 たとえば、「ユーザーがチェックボタンをクリックすると、ファイルの有効性をチェックする」という簡単なシナリオがあります。このシナリオでは、通常、以下のようなプレゼンター/コントローラークラスのテストの作成を開始します。 @Test public void when_user_clicks_check_it_should_check_selected_file_validity(){ MediaService service =mock(MediaService); View view =mock(View); when(view.getSelectedFile).thenReturns("c:\\Dir\\file.avi"); MediaController controller =new MediaController(service,view); controller.check(); verify(service).check("c:\\Dir\\file.avi"); } ご覧のとおり、動作を検証するための設計上の決定や興味深いコードはありません。MediaServiceに渡されたビューから値をテストしています。私はいつも書いていますが、この種のテストは好きではありません。これらの状況についてどうしますか?あなたはいつもテストを書いていますか? 更新: 苦情の後にテスト名とコードを変更しました。一部のユーザーは、このような些細なケースのテストを記述して、将来誰かが興味深い動作を追加する可能性があると述べました。しかし、「今日のコード、明日のデザイン」についてはどうでしょう。?私を含む誰かが将来さらに興味深いコードを追加した場合、そのテストを作成できます。ささいなことでなぜ今やらなければならないのですか?

6
ストアドプロシージャの単体テストまたは統合テストですか?
最近、複雑なストアード・プロシージャーおよび関数を維持する必要がある多くの機会がありました。これらはすでに壊れており、通常はかなり微妙な方法で行われます。有効なパラメーターを指定してSPを呼び出すことはほとんどなく、単純に機能しませんでした。 私の解決策は、データベースを必要な初期条件に初期化した後、トランザクション内でストアドプロシージャを実行するフレームワークを進化させ、同じトランザクション内で期待される結果をテストすることでした。トランザクションはテストの最後にロールバックされました。 これは非常にうまくいきました。しかし、データベースとの統合を伴うため、これを「統合テスト」と呼ぶ人もいます。個々のコンポーネントとそれらのコンポーネントの個々のテストケースをテストし、データベースの初期状態を完全に制御したため、これを単体テストと呼びます。 しかし、どこに線を引くべきでしょうか?これは統合テストですか、それとも単体テストですか?この種のテストが悪い考えである実際的な理由はありますか?これが「唯一の」統合テストである場合、これらのストアドプロシージャに対して実際の「単体テスト」を行う方法についての提案はありますか? 更新、3年半後。私の現在のプロジェクトでは、SSDT単体テストの使用を開始しましたが、成功した可能性もありますが、より優れている場合もあります。SQL Server単体テストを使用したデータベースコードの確認を参照してください。これらは通常、SQL Server LocalDBのインスタンスにデータベースプロジェクトを展開するので、これにより、テストに影響を与えるデータベース環境に関する質問がなくなります。事前テスト中に、データベースに必要なデータを入力します。これにより、データベースの内容に関する質問が削除されます。実際、私はこれを行うためにMERGEステートメントを使用して、現在のテストに必要のないすべてのデータがテストの前にデータベースから削除、挿入、または更新されていることを確認しています。彼らには問題があります: 彼らは速くない テスト条件を再利用することはできません 事前テストを再利用することはできません(プロジェクト内のすべてのテストにそれらを共通にしない限り) ユーザーインターフェイスを改善できる 上記の問題の理由の1つは、まだそれらについて不満を述べていないことです。興味のある方はこの機能を試してみて、不満を言うことをお勧めします。これが改善の方法です。

2
インターフェイスのプロバイダーは、テスト用のモック実装も提供する必要がありますか?
単体テストで発見されたはずのバグについて、前回の統合テストで多くの時間を無駄にしました。問題は、呼び出したインターフェイス/サービスが予期したとおりに動作せず、ユニットテストがこの問題を見つけられなかったということでした。ユニットテストのためにそのインターフェイスをモックしたため、モックは当然、インターフェイスが何を間違って解釈するかに基づいていました。行う。インターフェイスの説明/仕様(簡潔なJavaDocコメント)があいまいであり、私たちの誤解の原因となったため、今では、インターフェイスを提供してくれた親愛なる同僚に少し怒る可能性があります。一方、同じ同僚がインターフェースのモック実装を提供してユニットテストで呼び出すことができれば、問題は回避できると思いました。 さて、共有インターフェースを提供して使用するチーム間でモックオブジェクトの作成を整理する上でのベストプラクティスは何でしょうか。あなたの経験は何ですか?

9
チェックイン前に開発者が実行するテストスイートを何と呼びますか?[閉まっている]
休業。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善してみませんか?この投稿を編集して、事実と引用で回答できるように質問を更新してください。 4年前休業。 私は、既存のプロジェクトに自動テストを追加するプロジェクトに取り組んでいます。中央コンポーネントから始めて、開発者環境ではありますが、コードモジュールレベルでの単体テストと、コンポーネント全体で実行されるテストの両方をセットアップします。このテストスイートは、コードチェックインの前に合格する必要があり、各開発ブランチの継続的インテグレーションシステムによって実行されることを意図しています。 これは何と呼ぶべきでしょうか?現在、これを「開発ユニットテスト」と呼んでいますが、ユニットテスト以上のものが含まれているため、私の知識の面では、それは完全に適切ではないと述べています。そして、私たちのビジョンは、このスイートが時間とともに成長し、完全な製品受け入れテストを含めることです。 ここに何か入力はありますか?それとも、名前についての議論をやめて、テストを書くべきでしょうか? 更新 みなさん、良い議論をありがとう!私が結論を下しているのは、実際には「共通の」定義は存在しないということだと思います。各プロジェクト/チームには、テクノロジー(Java、C#、Rubyなど)に応じて、そのプロジェクトに最も意味のある名前が付けられますおよび使用中の方法論(古い学校の滝、スクラム、XPなど)。

2
実際のオブジェクトが動的に作成されるときに、テストオブジェクトをどのように注入しますか?
依存関係注入を使用してクラスをテスト可能にしたい。しかし、クラスは実行時に複数のオブジェクトを作成し、コンストラクターに異なる値を渡します。簡単な例を次に示します。 public abstract class Validator { private ErrorList errors; public abstract void validate(); public void addError(String text) { errors.add( new ValidationError(text)); } public int getNumErrors() { return errors.count() } } public class AgeValidator extends Validator { public void validate() { addError("first name invalid"); addError("last name invalid"); } } (Validatorには他にも多くのサブクラスがあります。) これを変更する最良の方法は何ですか?ValidationErrorの代わりに偽のオブジェクトを注入できますか? …

5
テストが他の開発者によって削除されていないことを確認するにはどうすればよいですか?
仕事中に興味深い協調コーディングの問題に遭遇しました。 私はいくつかのユニット/機能/統合テストを書き、アプリケーションに新しい機能を実装しました。これにより、最大20人の開発者が作業します。すべてのテストに合格し、コードをチェックインしました。翌日、プロジェクトを更新したところ、(偶然に)テストメソッドの一部が他の開発者によって削除されていることに気付きました(開発者側で問題をマージしています)。新しいアプリケーションコードは変更されませんでした。 このような問題を自動的に検出するにはどうすればよいですか?つまり、コードが引き続き機能する(または削除されなかった)ことを自動的にチェックするテストを作成します。テストに対して同じようにするにはどうすればよいですか? 必要に応じて、Java、JUnit、Selenium、SVN、Hudson CIを使用しています。

1
壊れた単体テストを使用して新しい言語を学ぶ[終了]
閉まっている。この質問はトピックから外れています。現在、回答を受け付けていません。 この質問を改善してみませんか? 質問を更新して、ソフトウェアエンジニアリングスタック交換のトピックになるようにします。 4年前休業。 先日、ドットネットロックについて聞いていましたが、彼らは、ほとんどの場合、新しい言語を学習するための本当に興味深いツールについて言及していました。彼らは特にF#について話していたと思います。 それはあなたが開いたソリューションであり、壊れた単体テストがたくさんあります。それらを修正すると、言語を学習する手順がわかります。 確認したいのですが、車の中で車を運転していたので、プロジェクトの名前が何なのか、どのドットネットロックのエピソードだったのかわかりません。グーグルはあまり役立っていません。何か案が?

3
ストアドプロシージャがデータベースから行を削除していることを確認するための単体テストの作成方法
ユニットテストは初めてですが、以下についてサポートが必要です。 ユニットテストの作成方法を学ぶための小さなプロジェクトを作成しました。アプリケーションのいずれかのフォームの機能により、ユーザーがユーザーテーブル(およびマッピングテーブルの他の行)から削除されます。 現在、これをテストするために作成した単体テストは、必要なオブジェクトを設定し、次にデータアクセスメソッドを呼び出すビジネスルールメソッド(ユーザーIDを渡す)を呼び出して、テーブルの行を削除するストアドプロシージャを実行します。 これは、何かが正常に削除されているかどうかをテストする正しい方法ですか?単体テスト/セットアップメソッドは、最初にいくつかのテストデータを挿入する必要がありますか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.