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

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

3
内部でテストせずにDIを使用するクラスのユニットテスト
1つのメインクラスと2つの小さなクラスにリファクタリングされたクラスがあります。メインクラスはデータベースを使用し(多くのクラスと同様)、メールを送信します。メインクラスが持つようにIPersonRepositoryし、IEmailRepository彼の順番に2つのより小さいクラスに送信する注入しました。 ここで、メインクラスの単体テストを行い、クラスの内部動作を単体テストしないことを学びました。ユニットテストを壊すことなく内部動作を変更できるはずだからです。 クラスが使用するようしかし、IPersonRepositoryとIEmailRepository、私はHAVEのためのいくつかの方法について(モック/ダミー)の結果を指定しますIPersonRepository。メインクラスは、既存のデータに基づいていくつかのデータを計算し、それを返します。それをテストしたい場合、IPersonRepository.GetSavingsByCustomerId戻り値x を指定せずにテストを作成する方法がわかりません。しかし、それから私のユニットテストは、どのメソッドをモックするか、そしてどのメソッドをモックしないかを「知っている」ので、内部動作を「知っている」。 テストは内部を知らずに、依存関係を注入したクラスをどのようにテストできますか? バックグラウンド: 私の経験では、このような多くのテストはリポジトリのモックを作成し、モックに適切なデータを提供するか、実行中に特定のメソッドが呼び出されたかどうかをテストします。いずれにせよ、テストは内部について知っています。 今、私はテストが実装について知るべきではないという理論についてのプレゼンテーションを見ました(以前聞いたことがあります)。第一に、それがどのように機能するかをテストしていないためです。また、実装を変更すると、実装を「知っている」ためすべての単体テストが失敗します。私はテストが実装に気付かないという概念が好きですが、それを達成する方法がわかりません。

2
テストと仕様の違い
私はこの時点でコンセプトの問題があり、テスト(UnitTestなど)と仕様(Rspecなど)の違いに関する情報を見つけることができません。 私の知る限り、仕様は統合テストにあり、テストはUnitTestにありますが、それだけです。 違いは何ですか?

2
通常、ユニットテストの属性にパブリックメソッドが必要なのはなぜですか?
最近、.NETアセンブリの保護されたメソッドに[TestInitialize]を追加することは考慮されていませんが、メソッドをパブリックにすると、ユニットテストランナー(この場合はResharper)によって呼び出されました。過去に何度かテスト方法でこれに気づきました。 技術的に言えば、パブリックメソッドと同様にプライベートメソッドについても簡単に反映できます。実際のところ、リフレクションはプライベートメソッドの単体テストに使用される方法です。 では、なぜユニットテストメソッドをすべて公開する必要があるのですか?

3
ユニットテストコンテスト
私の雇用主は、毎月の単体テストの日の競争を実施しています。1日は単体テストの作成に専念します。明らかに、1か月を通してより多くのテストを行いますが、これは1日であり、コンテストの「勝者」には賞が与えられます。しかし、勝者が誰であるかを判断するのは難しいと感じています。 各テストケースにポイントを割り当てていました。したがって、このような単体テストを作成した場合... for (int i = 0; i < 100; i++) { assertTrue(i*i, square(i)); } 100ポイントが与えられます。明らかにこれは単純な例ですが、各テストケースに「ポイント」を割り当てる際の問題を示しています。 私たちは主にJavaとJavascriptのショップです。そのため、テストしたコードブランチの数をメトリックとしてカウントすることをお勧めします。コードカバレッジツール(EclEmmaなど)を使用して、テストしたブランチを簡単にカウントできます。ただし、Seleniumテストでこれをどのように行い、Javascriptソースのコードカバレッジを取得するのかわかりません(アイデアはありますか?) このコンペティションの勝者をどのように決定できるかについての提案はありますか? 編集 私は単体テストの書き方を知っています。効果的な単体テストの書き方を知っています。何をテストするか決めるのに助けは必要ありません。私はこの競争をコントロールすることはできません。競争は続きます。それで、私はそれを改善するためにいくつかの入力を追加するか、テストをゲームで続けます(はい、私はそれらをゲームします。もちろんそれらをゲームします。賞品があります) 編集 この質問ここでは、明らかに重複していない、それは良いテストケースを見つける方法に関する有用な情報が含まれているものの、それが競争を評価するための任意の有用な指標を提供していません。

2
ETLおよびレポートプロジェクトにTDDメソッドを使用してユニットテストを行うにはどうすればよいですか?
ETLプロジェクトは、SSIS、PowerCenterなどのETL(抽出-変換-ロード)ツールを使用して作成されたプロジェクトです。 これらには通常、外部ソースからのデータの読み取り、ステージングデータベースへのデータの読み込み、特定の変換の実行、最終データベースへの読み込みが含まれます。 簡単な例は、SSISを使用して、SSISを使用して学校の先生が提供するExcelファイルを読み取り、データベースにロードすることです。次に、ストアドプロシージャまたは複数のSSISパッケージを作成して各生徒の成績を計算し、そのデータをデータマート\ウェアハウスにロードします 次に、マートの上にストアドプロシージャを構築して、レポートツール(SSRS \ Excel \ etc)が視覚化を生成するために使用する出力を生成します。 このシナリオでTDDと適切な単体テストを実行する方法を理解しようとしています。ETLのテストは、主にステージングテーブルにロードされたデータがソースからのデータの正しいサブセットであることを確認することに関するものです。そのため、テストを実装すると、ETLのミニバージョンが実装されます。レポートSPの出力はテーブル自体のデータに依存するため、スクラブされたテストデータを含むデータベースを作成したとしても、メンテナンスの悪夢がなければ安定した出力データのセットを持つことはできません。 例: スプリント1:学生テーブルには名前、年齢、成績が含まれます このテーブルのテストデータを作成し、それに基づいて単体テストを作成します スプリント2:性別フィールドがテーブルに追加されます。 学生フィールドのデータを更新して性別属性を設定すると、データが変更されたため、テストケースは無効になります。しなければ、性別の列を必要とするテストケースを作成できません
12 unit-testing  sql  tdd 

4
一連の「AssertEquals」よりも優れた単体テストの作成方法はありますか?
qunitを使用して、ユニットテストに必要な基本的な例を次に示します。 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> <link rel="stylesheet" href="qunit/qunit-1.13.0.css"> <script src = "qunit/qunit-1.13.0.js"></script> <script src = "../js/fuzzQuery.js"></script> <script> test("Fuzz Query Basics", function() { equal(fuzzQuery("name:(John Smith)"), "name:(John~ Smith~)"); equal(fuzzQuery("name:Jon~0.1"), "name:Jon~0.1"); equal(fuzzQuery("Jon"), "Jon~"); //etc } ); </script> </head> <body> <div …

4
テストされたクラスをスパイするのは悪い習慣ですか?
私はクラスの内部呼び出しが通常であるプロジェクトに取り組んでいますが、結果は何回も単純な値です。例(実際のコードではありません): public boolean findError(Set<Thing1> set1, Set<Thing2> set2) { if (!checkFirstCondition(set1, set2)) { return false; } if (!checkSecondCondition(set1, set2)) { return false; } return true; } このタイプのコードの単体テストを書くのは、実際の条件の実装ではなく、条件システムをテストするだけなので、非常に困難です。(私は別のテストでそれを行います。)実際、条件を実装する関数を渡した方が良いでしょうし、テストではモックを提供するだけです。このアプローチの問題は騒々しいです:ジェネリックを多く使用します。 実用的なソリューション。ただし、テスト対象のオブジェクトをスパイにし、内部関数の呼び出しを模擬することです。 systemUnderTest = Mockito.spy(systemUnderTest); doReturn(true).when(systemUnderTest).checkFirstCondition(....); ここでの懸念は、SUTの実装が効果的に変更されることであり、テストを実装と同期させておくことが問題になる場合があります。これは本当ですか?この内部メソッド呼び出しの混乱を避けるためのベストプラクティスはありますか? アルゴリズムの一部について説明していることに注意してください。そのため、いくつかのクラスに分割することは望ましい決定ではない場合があります。

1
Djangoでのユニットテスト
私は大規模なDjangoプロジェクトの効果的な単体テストを書くのに本当に苦労しています。私はかなり良いテストカバレッジを持っていますが、私が書いてきたテストは間違いなく統合/受け入れテストであり、ユニットテストではないことに気付きました。これをできるだけ早く修正したいと思います。 これが私の問題です。私のスキーマは深いリレーショナルであり、非常に時間指向であり、モデルオブジェクトに高い内部結合と多くの状態を与えます。私のモデルメソッドの多くは、時間間隔に基づいてクエリを実行auto_now_addし、タイムスタンプ付きのフィールドで多くのことを行っています。したがって、たとえば次のようなメソッドを使用します。 def summary(self, startTime=None, endTime=None): # ... logic to assign a proper start and end time # if none was provided, probably using datetime.now() objects = self.related_model_set.manager_method.filter(...) return sum(object.key_method(startTime, endTime) for object in objects) このようなものをテストする方法はありますか? ここに私がここにいます。ユニットテストの目的には、その引数にいくつかの模擬動作を与える必要がありますが、正しい結果を生成するために正しくフィルタリング/集計されていますか?by key_methodsummary datetime.now()のモックは簡単ですが、残りの動作をどのようにモックできますか? フィクスチャを使用することもできますが、データを構築するためにフィクスチャを使用することの長所と短所を耳にしました(保守性が悪いことは、私にとっては当たり前のことです)。 ORMを使用してデータを設定することもできますが、関連するオブジェクトも作成する必要があるため、制限される可能性があります。また、ORMでは、auto_now_addフィールドを手動で変更することはできません。 ORMのモックは別のオプションですが、深くネストされたORMメソッドをモックするのが難しいだけでなく、ORMコードのロジックがテストからモックされるため、モックはテストをテストの内部と依存関係に本当に依存させるようですテスト対象機能。 クラックするのが最も難しいのは、このような関数であると思われます。これらの関数は、モデルのいくつかの層と下位レベルの関数にあり、これらの関数は非常に複雑ではないかもしれませんが、時間に非常に依存しています。私の全体的な問題は、どのようにスライスしたように見えても、テストはテストしている機能よりもはるかに複雑に見えることです。

5
唯一のロジックがガードである単体テストメソッドは便利ですか?
次のような方法があるとします。 public void OrderNewWidget(Widget widget) { if ((widget.PartNumber > 0) && (widget.PartAvailable)) { WigdetOrderingService.OrderNewWidgetAsync(widget.PartNumber); } } 私のコードにはそのようなメソッドがいくつかあります(非同期Webサービス呼び出しの前半分)。 それらを単体テストでカバーすることが有用かどうかを議論しています。はい、ここにはロジックがありますが、それはガードロジックにすぎません。(つまり、Webサービスの呼び出しを許可する前に、必要なものがあることを確認します。) 私の一部は、「あなたはそれらをユニットテストできることを確認しますが、それは時間の価値がありません」と言います(私はすでに予定より遅れているプロジェクトにいます)。 しかし、私の反対側は、もしあなたがそれらを単体テストしないで、誰かが衛兵を変えれば、問題があるかもしれないと言います。 しかし、私の最初の部分は、誰かがガードを変更した場合、あなたは彼らのためにもっと仕事をしているだけだと言います(ガードとガードのユニットテストを変更しなければならないからです)。 たとえば、私のサービスがウィジェットの可用性をチェックする責任を負う場合、そのガードをこれ以上望まないかもしれません。単体テスト中の場合は、2つの場所を変更する必要があります。 私は両方の面で賛否両論を見ています。だから私は他の人が何をしたかを尋ねると思った。
12 c#  unit-testing 

2
1つの実行可能ファイル内のすべてのユニットテスト、またはそれらを分割しますか?
ライブラリなどの1つのソフトウェアのテストを作成する場合、すべてのユニットテストを1つにコンパイルするのが好きですか、それとも複数の実行可能ファイルに分けるのが好きですか? 私が求めている理由は、現在CUnitを使用して、作業中のライブラリをテストしているためです。テストは個別のスイートに分割され、1つの実行可能ファイルにコンパイルされ、障害の印刷出力が完成します。現在、そのライブラリのビルドシステムはCMake(名前にもかかわらず、CUnitとはほとんど関係ありません)であり、独自のテストフレームワークCTestが付属しています。CTestを使用すると、テストとして機能する実行可能ファイルのリストを登録できます。 自動テストの実行にCTestを使用するかどうかを考えています。ただし、これには、これまでに作成したテストを別々のコンパイルターゲットに分割する必要があります。そうしないと、テストの選択的な実行など、CTestsの高度な機能の一部を実際に利用できません。 これは、どのツールを使用するか、それらの処理と規則の問題であることがわかりますが、それとは別に、単一のテスト実行可能ファイルを個別のテスト実行可能ファイルよりも好む他の理由はありますか?またはその逆?

1
ソフトウェアのテスト方法と開発者の生産性との関係に関する調査はありますか?[閉まっている]
閉まっている。この質問はトピック外です。現在、回答を受け付けていません。 この質問を改善したいですか? 質問を更新して、 Software Engineering Stack Exchangeのトピックになるようにします。 6年前に閉鎖されました。 ソフトウェアテストプラクティス(単体テストや統合テスト)と開発者の生産性との関係に関する調査はありますか?

3
Javascriptで何をテストする必要がありますか?
仕事では、Javascriptベースのアプリケーション(実際はCoffeescriptを使用していますが、それでも)を開始したばかりで、その中にJsTestDriverとファブリックを使用した自動テストシステムを実装しています。 これほど多くのJavascriptを使用して何かを記述したことはないため、これまでJavascriptのテストは行っていません。私たちがユニットテストで何をテストすべきか正確にはわかりません。私たちはさまざまなことのためにJQueryプラグインを書いたので、JsTestDriverで可能な限り正しいことを検証する必要があることは非常に明白ですが、私のチームの他の誰もがページレベルのJavascriptもテストする必要があると考えているようです。 単体テストとしてページレベルのJavascriptをテストする必要はないと思いますが、代わりにSeleniumなどのシステムを使用して、すべてが期待どおりに動作することを確認します。私の主な理由は、現時点では、ページレベルのJavascriptテストはJsTestDriverを介して失敗することが保証されているためです。 それでは、Javascriptで単体テストを行うべきものは何ですか?

8
単体テストのライセンスを取得するのは理にかなっていますか?
ほとんどが単体テストで構成されているテストコードにライセンスを付与する(しない)ことの利点/リスクがあるかどうか疑問に思っています。どう思いますか? 特に、(L)GPL、Apache、MIT、およびBSDでのライセンスに興味があります。 編集:非テストコードは既に何らかのライセンスの下で公開されているが、テストコードは公開されていないことを前提としているため、公開するかどうか、公開する場合は同じライセンスを適用するかどうかが問題になります。

4
依存性注入への段階的なアプローチ
私は、依存性注入を使用して、クラスをユニットテスト可能にすることに取り組んでいます。しかし、これらのクラスの一部には多くのクライアントがあり、依存関係を渡すためにそれらすべてをリファクタリングする準備がまだできていません。だから私は徐々にそれをやろうとしている。現時点ではデフォルトの依存関係を維持しますが、テストのためにそれらをオーバーライドできます。 私が考えているアプローチの1つは、すべての「新しい」呼び出しを独自のメソッドに移動することです。たとえば、 public MyObject createMyObject(args) { return new MyObject(args); } 次に、単体テストでこのクラスをサブクラス化し、作成関数をオーバーライドして、代わりに偽のオブジェクトを作成します。 これは良いアプローチですか?欠点はありますか? より一般的には、テストのために依存関係を置き換えることができる限り、ハードコードされた依存関係を使用しても大丈夫ですか?私は、コンストラクタで明示的にそれらを要求することが好ましいアプローチであることを知っており、最終的にそこに到達したいと思います。しかし、私はこれが良い最初のステップかどうか疑問に思っています。 私に発生した欠点の1つは、テストする必要がある実際のサブクラスがある場合、親クラス用に作成したテストサブクラスを再利用できないことです。実際のサブクラスごとにテストサブクラスを作成する必要があり、同じ作成関数をオーバーライドする必要があります。

3
NUnit for C#とVisual Studioに統合された単体テスト機能との違い
チームで協力して、C#.NETを使用して開発された中規模のデスクトップアプリケーションを開発する必要があります。これに先立ち、私は単体テストとテスト駆動開発を適用していません。ユニットテストC#アプリケーション用の多くのツールとフレームワークが存在することを認識しています。今のところ、NunitとVisual Studioに統合された単体テスト機能を知っています。 知りたいのですが、この2つはどのように比較されますか?

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