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

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

1
カスタムClassLoaderを単体テストする方法は?
いくつかの理由で、私は子供優先ClassLoaderです。そのようなClassLoaderものはJDKには存在しないので、私はそれを書いています。これは私のユースケースの主要なコンポーネントであるため、徹底的にテストしてほしい。動作を壊さずに変更されないようにするために、私は非常に徹底して、テスト可能なすべてのものを自動的にテストしたいと考えています。 どうすればテストできますか?基本的な単体テストを行うにはどうすればよいですか?(特にsuper各メソッドに少なくとも1つの呼び出しがあるため)どこから始めればよいかわからず、開始するためのガイドラインを探しています。 私の主なアイデアは次のとおりです。何か問題がありますか? /src/main/resources/parent.jar child.jar ファイルparent.jarにcom.example.Exampleは、基本的なSupplier戻り値であるクラスが含まれています"parent"。ファイルchild.jarにcom.example.Exampleは、基本的なSupplier戻り値であるクラスが含まれています"child"。 の標準URLClassLoaderを作成しparent.jar、カスタムClassLoaderを使用してをロードしますchild.jar。それから私は、クラスをロードしたいcom.example.Exampleと、それは実際に戻っていますことを確認してください"child"代わりに"parent"。 より複雑なテストケースが考えられますが、開始するには確認が必要です。これで基本的なテストはこれで十分ですか?これは本当に単体テストでテストする必要があるのですか?そうでない場合、何ですか? これにはコードは必要ないと確信していますが、好奇心旺盛な方のために、こちらに示しておきます。 import java.io.*; import java.net.*; import java.util.*; class ChildFirstClassLoader extends URLClassLoader { ChildFirstClassLoader(ClassLoader parent) { super(new URL[0], parent); } @Override // Make this method available in this package. protected void addURL(URL url) { super.addURL(url); } @Override protected Class<?> loadClass(String name, boolean resolve) …

2
すべてのメソッドが仮想ではないのか、各クラスに少なくとも1つのインターフェイスがないのはなぜですか?
これは.NETプラットフォームに関するより哲学的な質問ですが、他の言語でも役立つかもしれません。私は多くの単体テストを行っていますが、特に私がしばしば苦労しているサードパーティのコンポーネントを使用している場合はそうです。.NETでは、コンポーネントの設計者に、どのメソッドを仮想化するかどうかを選択するという大きな主張があります。1つはコンポーネントの使用方法(仮想化する意味がある)、もう1つはコンポーネントのモック機能です。Shimsを使用してサードパーティのコンポーネントをモックアップできますが、これは多くの場合、設計や複雑さを悪化させます。.NETでのすべてのメソッドの仮想化(JAVAには最初からあります)についての議論は、パフォーマンスに関するものでした。しかし、それはまだ問題ですか?なぜすべてのメソッドが.NET virtualではないのか、または各クラスに少なくとも1つのインターフェイスがないのはなぜですか?

4
依存関係の逆転によりAPIが拡張され、不要なテストが発生する
この質問は数日間私を悩ませてきました、そしてそれはいくつかの実践が互いに矛盾しているように感じます。 例 反復1 public class FooDao : IFooDao { private IFooConnection fooConnection; private IBarConnection barConnection; public FooDao(IFooConnection fooConnection, IBarConnection barConnection) { this.fooConnection = fooConnection; this.barConnection = barConnection; } public Foo GetFoo(int id) { Foo foo = fooConection.get(id); Bar bar = barConnection.get(foo); foo.bar = bar; return foo; } } これをテストするとき、IFooConnectionとIBarConnectionを偽造し、FooDaoをインスタンス化するときに依存性注入(DI)を使用します。 機能を変更せずに実装を変更できます。 …

2
大規模なルックアップテーブルによるユニットテスト?
私たちのシステムは、計算やその他のロジックの多くの重要な情報をルックアップタイプテーブルから取得できるように構成されています。例としては、すべての種類の異なるレート(金利や拠出率など)、日付(有効日など)、およびすべての種類のさまざまなその他の情報があります。 なぜ彼らはすべてをこのように構成することに決めたのですか?この情報の一部はかなり頻繁に変更されるためです。たとえば、料金の一部は毎年変動します。彼らは、コードの変更を最小限に抑えることを試みました。期待は、ルックアップテーブルが変更され、コードが機能することだけです(コードの変更はありません)。 残念ながら、それは単体テストを困難にするだろうと思います。一部のロジックでは、100以上の異なるルックアップが行われる場合があります。私は間違いなく私たちのレートを返すモック可能なオブジェクトを作ることができますが、かなりのセットアップになるでしょう。私はそれか、統合テストを使用する(そしてそのデータベースにアクセスする)必要があると思います。私は正しいですか、それとももっと良い方法がありますか?助言がありますか? 編集: 応答が遅れて申し訳ありませんが、私は同じことで他の多くのものをジャグリングしながら、すべてを浸そうとしました。また、実装を同時に実行したいと思いました。私はさまざまなパターンを試して、満足できる解決策を構築しました。満足できないビジターパターンを試してみました。結局、私はオニオンアーキテクチャを使用することになりました。結果に満足しましたか?ちょっと。それが何かだと思います。ルックアップテーブルを使用すると、はるかに困難になります。 以下は、毎年変化するレートのテスト用のセットアップコードの小さな例です(imはfakeiteasyを使用しています)。 private void CreateStubsForCrsOS39Int() { CreateMacIntStub(0, 1.00000m); CreateMacIntStub(1, 1.03000m); CreateMacIntStub(2, 1.06090m); CreateMacIntStub(3, 1.09273m); CreateMacIntStub(4, 1.12551m); CreateMacIntStub(5, 1.15928m); CreateMacIntStub(6, 1.19406m); CreateMacIntStub(7, 1.22988m); CreateMacIntStub(8, 1.26678m); CreateMacIntStub(9, 1.30478m); CreateMacIntStub(10, 1.34392m); CreateMacIntStub(11, 1.38424m); CreateMacIntStub(12, 1.42577m); CreateMacIntStub(13, 1.46854m); CreateMacIntStub(14, 1.51260m); CreateMacIntStub(15, 1.55798m); CreateMacIntStub(16, 1.60472m); CreateMacIntStub(17, 1.65286m); CreateMacIntStub(18, 1.70245m); CreateMacIntStub(19, 1.75352m); …

3
視覚化ソフトウェアにとって意味のあるテストを作成するにはどうすればよいですか?
特定の種類のファイルを取得して視覚化したり、プロットされた画像を操作するためのボタンのホストを作成したりする、かなり大きなソフトウェアがあります。週に一度は機能しないバグ/コードの断片を見つけているように感じますが、このソフトウェアのテストを作成する方法を理解するのに苦労していますか? ライブラリやAPIなどのプロジェクトにとってテストがどのように重要であるかを理解しています。これらの関数を使用するテストを作成するだけです。 しかし、視覚化ソフトウェアはどうですか?関連する視覚要素のため、別のアプローチが必要なようです。 データで使用できるすべての操作を実行して手動で呼び出すテストプログラムまたはテストハーネスを作成する必要がありますか? バグを修正したことを検証し、コードが再度壊れた場合に警告するために、テストの作成を開始するにはどのアプローチを使用すればよいですか? ユニットテストをいつ行うべきかに関して、関連するが重複していない質問があります。私はバグを発見しているので、ソフトウェアが再び後退するのを防ぐためのテストを作成したいと思います。

4
クラスの単体テストを分離することは悪い習慣ですか?[閉まっている]
休業。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善してみませんか?この投稿を編集して、事実と引用で回答できるように質問を更新してください。 5年前休業。 私のクラスは通常、最大で約5〜20のメソッドを持っています。これは、単体テストを持つクラスがメソッドの約2倍(counting dataProviders、setUpなど)を持っていることを意味します 私は、テストを2〜3つのクラスに分けようと考えました。単一の責任の原則に従っても、20のメソッドではなく、それぞれ10のメソッドを持つ2つのテストクラスを好むからです。 それは悪い習慣ですか?テストクラスは垂直に成長しますが、クラスのすべてのテストを1つだけにするとよいですか?

2
コマンドにどれだけのロジックを入れることができますか?または別の言い方をすると、コマンドパターンはどのような種類のロジックですか?
私はかなり前からコマンドパターンを使用していますが、実際にExecuteメソッドにどれだけのロジックを入れることができるか本当にわかりません。 コマンドパターンの現在の実装は次のようになります。 public abstract class Command { public static event EventHandler Completed = delegate { }; public bool Success { get; private set; } public Exception Exception {get; private set; } public abstract bool Execute(); protected bool OnCompleted(bool success, Exception ex = null) { Success = success; Exception = ex; …

5
開発テストケース(ユニットおよび開発統合)をQA(テスト)チームと共有しますか?
テストチーム(一部の組織では、いわゆるQAチーム)は、開発チームが(開発チームの)テストケースを彼らと共有する必要があると主張しています。彼らの主張は、開発テストケースがQAテストの出発点であるということです。 開発チームのメンバーとして、私は要求を理解していません。私自身、テスターは要件に基づいてソリューションをテストする必要があります。テストチームを詳細設計(低レベル設計)ドキュメントと共有する必要があるかどうかはわかりません。ただし、詳細設計は共有しています。 私はここでいくつかの投稿を読みました。QAチームは、より良いソリューションとスループットのために、テストケースを開発チームと共有する必要があると述べています。しかし、テストケースをQAテストチームと共有する開発チームはありません。 開発ユニットと統合テストケース、およびテスト結果を共有できれば、QAチームは非常に満足しているようです。

2
複雑なゲームのテスト駆動開発
暇なときにゲームのコーディングをしていますが、プログラミングに関しては、まだ初心者です。この質問がトピックから外れている場合や、他の人に役に立たない場合は、申し訳ありませんが、うまくいけば、役に立ちます。 コードの設計や、コーディングのさまざまな方法論やアプローチについての本を読むのに多くの時間を費やしてきました。この調査の過程で、私はテスト駆動開発の概念に出会います。このアイデアを支持する人々は通常、それについて非常に情熱的です。私はそれがソフトウェアを書くスピードと効率を助けることができると信じています。時間は非常に貴重なリソースであるため、プログラミングクラフトの知識を広げようとせずに、何とかやり過ごすのではなく、最善の方法で学ぶことを学びたいと思います。 とにかく、私は初心者だからといって、テスト駆動開発をゲームにどのように適用するか想像できません。この件についていくつかの記事を見つけましたが、あまり役に立ちませんでした。私が見た単体テストの例のほとんどは、非常に単純な定型の例、またはまったくゲームに似ていないソフトウェアの例です。 私自身のコーディングでは、同様の考え方でテスト駆動開発に取り組みますが、実際にはTDDとしての資格はないと確信しています。ゲームに追加する機能を実装するための最小限のコードを記述し、すぐにゲームをテストして、機能するかどうかを確認します。意図したとおりに起こらない場合は、すぐに変更を加えて、自分が望むものに近づけます。機能していないか壊れている場合、およびコードを読み取ってもバグを見つけることができない場合は、予期しない動作が見つかるまでデバッガーのメソッドを順に実行し、それを削除します。私が言おうとしているのは、ほぼすべての増分変更の後で、常にゲームをテストしているということです。テストは私の開発を推進します。「単体テスト」は私の頭の中にあります、 私の実際の質問に移ります。複雑なゲームの単体テストを作成するにはどうすればよいですか?複雑に言うと、ゲームプレイの多くの創発的な側面を意味します。つまり、ゲームプレイの本質は、プレイヤーの選択と組み合わされたゲーム内のさまざまな要素間の相互作用から生まれます。たとえば、手続き型の世界を持つローグライクなRPG。そのようなゲームのためにどんなユニットテストを書くでしょうか?このようなゲームにテスト駆動開発をどのように適用できますか?

2
ユニットテスト、工場、そしてデメテルの法則
これが私のコードの仕組みです。サードパーティのショッピングAPIに保存されている、ショッピングカートの注文に似たものの現在の状態を表すオブジェクトがあります。私のコントローラーコードで、私は呼び出すことができるようにしたいです: myOrder.updateQuantity(2); 実際に、第三者にメッセージを送信するためには、第三者にも同様THISために固有のいくつかのことを、知っている必要がありorderID、かつloginID、アプリケーションの存続期間中に変化しないであろう。 私が作成したときにmyOrder、もともと、私は注射MessageFactory知っています、loginID。次に、updateQuantityが呼び出されると、Orderパスがを通過しorderIDます。制御コードは簡単に記述できます。別のスレッドがコールバックを処理し、Order変更が成功した場合は更新Orderし、変更が失敗した場合は変更が失敗したことを通知します。 問題はテストです。のでOrder、オブジェクトが依存するMessageFactory、それが必要MessageFactory実際返すようにMessageSを(それが呼び出すこと.setOrderID()例えば、上)、今私は非常に複雑に設定する必要がMessageFactoryモックを。さらに、「モックがモックを返すたびに妖精が死ぬ」ので、私は妖精を殺したくありません。 コントローラーのコードを単純に保ちながら、この問題を解決するにはどうすればよいですか?私はこの質問を読みました:https : //stackoverflow.com/questions/791940/law-of-demeter-on-factory-pattern-and-dependency-injectionしかし、それはテストの問題について話していなかったので助けにはなりませんでした。 私が考えたいくつかの解決策: どういうわけか、ファクトリメソッドが実際のオブジェクトを返す必要がないようにコードをリファクタリングします。おそらく、それは工場ではなく、MessageSender? のテスト専用実装を作成しMessageFactory、それを注入します。 コードはかなり複雑です。sscceでの私の試みは次のとおりです。 public class Order implements UpdateHandler { private final MessageFactory factory; private final MessageLayer layer; private OrderData data; // Package private constructor, this should only be called by the OrderBuilder object. Order(OrderBuilder builder, OrderData initial) { this.factory = builder.getFactory(); …

1
使用するテストフレームワークを決定するにはどうすればよいですか?
状況はこれです。 私は小さな政府ITプロジェクトのジュニア開発者です。継続的な統合や自動テストフレームワークはありません。しかし、アイデアはこの種のものを開発すること/私たちの開発環境を改善することです。 この製品はデータ処理アルゴリズムであり、Webアプリケーションを介してエンドユーザーに情報を表示します。 そのため、WebアプリケーションのJavaScriptを変更する作業がたくさんあります。そのため、JavaScriptの単体テストを実装したいと考えています。 このスタックオーバーフローの質問を見て、javascriptのいくつかの異なるユニットテストフレームワークの概要を説明しました。 問題は、どのフレームワークを使い始めるかをどのように決めるのですか? テストフレームワークを選択するための基準のリストは何ですか? それらをすべて試すのは現実的ですか? フォーラムなどの使用方法について、フォーラムなどをよく読んでください。

1
BDDを使用してコンパイラを単体テストする方法
私のチームは、IDEに統合されるドメイン固有言語(DSL)のコンパイラを作成しています。現在、私たちはコンパイラーの分析フェーズに集中しています。リアルタイムのパフォーマンスと非常に詳細なエラー/警告/メッセージ情報が必要なため、既存のパーサージェネレーター(ANTLRなど)は使用していません。我々は持っています 各クラスは、言語の具体的な構文ツリーのノードを表します。 各ノードの注釈として機能するクラス(つまり、エラーや追加情報)、および 具体的な構文ツリー(つまり、レクサー、パーサー、文字列のキャッシュ、構文ビジター)を構築および操作する内部クラス。 テストを整理するための全体的な戦略を決定しようとしています。当社は、行動主導型開発(BDD)とドメイン主導型設計(DDD)を推進しています。弊社のドメイン用にDSLを構築していますが、コンパイラのドメインはプログラミング言語です。 私たちはまだコンパイラーを構築中であり、すでにいくつかのテストを行っています。100%ステートメントカバレッジを目指しています。 現在、構文ツリービルダーにソースコードを入力し、結果の構文ツリーのすべてのノードの各プロパティで検証を実行して、期待される情報(行番号、関連するエラー、子/親トークン、トークンの幅、トークンのタイプなど)。ここで、各ノードは独自のクラスであり、ノードに添付された特定の注釈とエラーは個別のクラスであるため、このテストは多くのクラスを参照することになります。 現在、入力(文字列)と出力(トークンのリスト)を他のクラス(構文ツリーのノードのクラスなど)から分離できるレクサーなどの特定のクラスのテストがあります。これらのテストはより詳細です。 これで、すぐ上の段落のテストを、テスト中のクラス(レクサー、文字列キャッシュなど)に対応させることができます。ただし、上記の2番目の段落のテストは、コンパイラーの分析フェーズ全体を実際にテストします。つまり、入力ソースコードが与えられている場合、各テストは構文ツリーに対して300以上のアサーションを持つことができます。テストは、分析フェーズの動作のためのものです。 これは適切なテスト戦略ですか?そうでない場合、私たちは何を別の方法で行うべきですか?テストにはどのような組織戦略を使用する必要がありますか?

4
現実的なデータに依存するクラスを単体テストするにはどうすればよいですか?
科学的測定の結果をカプセル化するクラスがあります。私は最初から単体テストを構築していますが、単体テストの経験があまりなく、どの動作をどのようにテストするべきかわかりません。 私のクラスは次の3種類のことを行います。 ファイル(または文字列)からそのインスタンス変数に測定データを読み込みます 測定データをファイルまたは文字列に書き込みます データに対して計算を実行します(例:一連の数値の平均を取得) 私の現在のアプローチは、既知の良好なサンプルデータファイルをtestディレクトリに含めることです。1つのテストでは、ファイルからデータを読み取り、それをクラスに渡し、いくつかの基本的な健全性チェックを満たしていることを確認します。別のテストでは、ファイルのファイル名をクラスに渡し、クラスにそれを読み取らせ、同じテストを実行します。テストの残りの部分では、ファイルからデータを読み取り、それをクラスに渡し、データ処理方法の結果が正しいことを確認します。 しかし、これはかなり絡み合っているようです。(3)をチェックするテストは、(1)の動作が正しいことを暗黙的に想定しています。そして、(1)のテストは、(3)のテストによって行われた広範なチェックから利益を得ることができます。単体テストの構造が不十分ですか、それともテストで特定のデータセットを使用する必要があるという事実の自然な結果ですか?

1
視覚化(3Dグラフィックス)フレームワークの単体テスト
これはこの質問のフォローアップです。科学的アルゴリズムのライブラリがあるときに、ユニットテストを行う方法を尋ねていました。現在、同様の問題がありますが、プロジェクトが異なります。 私は、DirectX、OpenGl、WebGl、Silverlight、WPFの3Dグラフィックエンジンフレームワークの抽象化に取り組んでいます。シナリオは次のとおりです。このプロジェクトは、同じオフィスで作業している私の同僚の小さなチームによって開発されています。私たちは皆、コンピューターサイエンティストであり、ソフトウェアエンジニアリングコミュニティや実践にはあまり関与していません。SubversionからGitに切り替えて、プロジェクトをCodeplexに公開することを説得するのに苦労しました。プロジェクトは大きくなり(C#の約80K行)、現在はShader Model 5.0までのほとんどのDirectXとOpenGlをカバーしているため、リンクされた質問で説明されているような1人のプロジェクトではありません。また、オープンソースコミュニティとのコラボレーションを促進したいと考えています。 これまでのところ、すべてのデバイスとリソースの初期化、シーンの設定、描画を含む小さなアプリケーションを作成してテストしてきました。問題は、それを異なるものにする方法がわからない、つまり、リソースの割り当て、プリミティブテセレーション、シェーダーコンパイルなど、フレームワークの特定の機能をテストする小さなテストケースを設計する方法です。エンジン全体の初期化。これらのケースのいくつかでは、便利なモックを考えることができますが、一般的に、出力がビジュアル(イメージ、またはアニメーションシーン)の場合、レンダリングアルゴリズムの正確さをどのようにテストできますか?現在、私たちが考え出した最も賢いことは、同じシーンをソフトウェアレンダラーであるDirectXとOpenGlにレンダリングし、それらをピクセルごとに比較することです。 では、ここでの「正しい」テストアプローチとは何でしょうか。
8 c#  unit-testing  tdd 

2
経過時間を考慮に入れるメソッドで単体テストを行う方法は?
私は現在、レガシーシステムの重要なメソッドをリファクタリングしている最中です。作業を始めるまでテストはほとんどありませんでした。リファクタリング後に正しい作業ができるように、かなりの数のテストを追加しました。 今、私は最も重要な部分に遭遇しました:インジケーターを計算するアルゴリズム。それは何かのようなものです indicator = (OneNumberFromA + AnotherNumberFromB) / elapsedTime; ユニットテストでこの関数の正しい動作をテストするにはどうすればよいですか? 関数には、プログラムが到達するいくつかのわずかに異なるアルゴリズムもありますが、すべての場合において、これelapsedTimeは結果に不可欠です。

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