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

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

1
ユニットとインテグレーションのギャップのテスト:小型コンポーネントインテグレーションのユニットインテグレーションテスト
過去数週間、私はテスト方法論のギャップを埋める方法を検討し、検討してきました。簡単に言うと、単体テストは小さすぎ、従来の統合テストは大きすぎます。 頻繁にシナリオがアップになるAとB、両方の使用コンポーネントをC。ただしA、のB要件は少し異なり、についての仮定も少し異なりますC。私が開発者である場合A、どこでどのように私の想定をテストするのCですか? 明らかにAモックされた仮定Cを使用Aした単体テストは、単独でのテストには適していますが、仮定自体はテストしません。 別の可能性は、の単体テストを追加することですC。ただし、これはA開発段階ではありますがC、仮定を進化させてテストを変更するのは非常にA不格好なため、これは理想的ではありません。実際、A開発者はC(たとえば、外部ライブラリ)の単体テストに適切にアクセスできない場合もあります。 これをより具体的な例でフレーム化するには:これがノードアプリケーションであると想定します。 AにB依存しC、(特に)ファイルを読み取り、ファイルの内容をに渡されたオブジェクトに格納しますC。最初Cは、処理するすべてのファイルが小さく、重大なブロックなしで同期的に読み取ることができます。ただし、の開発者Bは、自分のファイルが巨大になりC、非同期読み取りに切り替える必要があることを認識しています。これにより、で散発的な同期バグが発生します。Aこれは、Cファイルを同期的に読み取ることを前提としています。 これは、完全な統合テストから追跡するのが非常に難しいことで有名なタイプのバグであり、統合テストではまったく検出されない可能性があります。またA、Asの前提条件がモックされているため、sの単体テストでは捕捉されません。ただし、「」Aおよび「」のみを実行する「ミニ」統合テストで簡単に検出できますC。 このタイプのテストへの参照はわずかしか見つかりませんでした。小型の統合、コンポーネント統合テスト、ユニット統合テスト。また、正式なTDD単体テストではなく、BDDテストの方向性にも関係しています。 このテストギャップをどのように埋めますか?具体的には、そのようなテストはどこに置くのですか?どのように私はの入力あざけりないAとC「ミニ」統合テストのために?そして、これらのテストと単体テストの間でテストの懸念を分離するためにどれだけの努力を払う必要がありますか?または、テストのギャップを埋めるためのより良い方法はありますか?

2
DDDを実行するときにエンティティと値オブジェクトをモックする必要がありますか?
読んだ後、いくつかの 記事についてNewableを対注射のオブジェクトとどのようにこれらの概念は、DDDのサービス、エンティティと値オブジェクトに関連し、私は特に私のユニットテストで私のコードでnewablesの使用に関するいくつかの疑問が残りました。 Newableの主な候補は、EntitiesオブジェクトとValueオブジェクトでした。つまり、これらの依存関係を他のオブジェクトに注入する代わりにnew、これらのオブジェクトのインスタンスだけを作成して、コードで直接使用する必要があります。 ただし、適切なDDDプラクティスでは、エンティティと値オブジェクトに適切であると見なされた場合に責任を割り当てることを推奨しています。そのため、エンティティと値オブジェクトには、深刻なビジネスロジックが含まれなくなります。 ここで、サービスがエンティティまたは値オブジェクトで動作する場合、エンティティまたは値オブジェクトをモックしてサービスにモックを渡す必要があります(モックには、interface推奨されているように見える値オブジェクトまたはエンティティのが必要です)? またはnew、エンティティ/値オブジェクトだけを具体的な実装をサービスに渡して、1つのユニットのみをテストするというユニットテストの原則に違反する必要がありますか?

6
エンコーダのユニットテストはどのように行いますか?
私はこのようなものを持っています: public byte[] EncodeMyObject(MyObject obj) 私はこのようにユニットテストをしてきました: byte[] expectedResults = new byte[3]{ 0x01, 0x02, 0xFF }; Assert.IsEqual(expectedResults, EncodeMyObject(myObject)); 編集:私が提案した2つの方法は次のとおりです。 1)上記の例のように、ハードコードされた期待値を使用します。 2)デコーダーを使用してエンコードされたバイト配列をデコードし、入力/出力オブジェクトを比較します。 方法1で見られる問題は、非常に壊れやすく、多くのハードコードされた値を必要とすることです。 方法2の問題は、エンコーダーのテストがデコーダーの正常な動作に依存することです。エンコーダー/デコーダーが同じ場所で同じように破損している場合、テストで誤検知が発生する可能性があります。 これらが、このタイプのメソッドをテストする唯一の方法である場合があります。その場合は問題ありません。この種のテストにもっと良い戦略があるかどうかを確認するために質問しています。作業中の特定のエンコーダーの内部を明らかにできません。この種の問題をどのように解決するか一般的に尋ねていますが、内部は重要ではないと思います。特定の入力オブジェクトが常に同じ出力バイト配列を生成すると想定します。

5
単体テストと呼ばれる機能テストに対する適切な単体テストの具体的な利点は何ですか
私が取り組んでいるプロジェクトには、適切にモックアウトされなかった多数のレガシーテストがあります。このため、それが持つ唯一の依存関係はEasyMockであり、静的、引数付きのコンストラクターなどをサポートしていません。代わりに、テストはデータベース接続などに依存してテストを「実行」します。これらのケースを処理するためにpowermockを追加することは、それをサポートするために既存のプロジェクトをアップグレードする必要があるため、法外なコストとして撃ち落とされています(別の議論)。 私の質問は、プッシュバックに使用できる適切な単体テストの実際の具体的なメリットは何ですか?いずれかがあります?ユニットテストがうまくいかなくても、ユニットテストが悪いのは悪いことだと私は言っているだけですか?コードカバレッジは同じくらい効果的ですか?

2
単体テスト:「リファクタリングしていて、共同編集者がいない場合、コードのにおいがします」?
私はロイ・オセロベによるユニットテストの芸術を読んでいます。私はセクション7.2にいます。ここでは、作成者がコードのにおいについてこのメモを持っています。 注:外部テストから見えるように内部状態をリファクタリングする場合、それはコードのにおい(コードの設計またはロジックに問題がある可能性がある兆候)と見なすことができますか?共同編集者を公開するためにリファクタリングしているときは、コードのにおいではありません。リファクタリングを行っていて、共同編集者がいない場合は、コードのにおいです(したがって、何もスタブしたりモックしたりする必要はありません)。 編集:著者が「共同編集者」によって意味するのは依存関係です。彼の依存関係の例には、データベースにアクセスするクラスや、OSのファイルシステムにアクセスするクラスがあります。ここで、彼はスタブを定義し、コラボレーターという言葉を使い始めます。 スタブは、既存の制御置換である依存性(または 共同編集システムにおいて)。 作者にはこのコードの匂いの例はなく、これがどのように見えるか理解/描写するのに苦労しています。誰かがこれをもう少し説明して、おそらく具体的な例を提供できますか?

4
外部EXEを開始するクラスのユニットテストの記述
EXEのリストを開始するために使用するC#クラスを作成しました(私のものではありません-実行する必要のあるサードパーティのEXE)。 。 追加、削除などの基本的なロジックをテストできます。EXEを保持する実際の作業が機能することを単体テストするにはどうすればよいですか? 私の最初の考えは、1秒後に自分自身を閉じるダミーEXEを起動し、それを使用してテストすることです。それは単体テストの領域外ですか?

9
プロの開発者として、単体テストを記述しないことは許容されますか?[閉まっている]
現在のところ、この質問はQ&A形式には適していません。回答は事実、参考文献、専門知識によって裏付けられると期待していますが、この質問は、議論、議論、投票、または拡張ディスカッションを求める可能性があります。この質問を改善でき、再開できると思われる場合は、ヘルプセンターにアクセスしてください。 7年前休業。 TDD /自動化された単体テストの長所と短所について疑問に思っており、プロの開発者が単体テストをサポートせずにアプリケーションを作成することが受け入れられるかどうかについてのコミュニティの見解を探していますか?

3
複雑なステートフルクラスとそのテストを簡略化するにはどうすればよいですか?
私はJavaで書かれた分散システムプロジェクトに参加しています。このプロジェクトには、非常に複雑な現実のビジネスオブジェクトに対応するクラスがいくつかあります。これらのオブジェクトには、ユーザー(または他のエージェント)がそのオブジェクトに適用できるアクションに対応する多くのメソッドがあります。その結果、これらのクラスは非常に複雑になりました。 システムの一般的なアーキテクチャアプローチにより、多くの動作がいくつかのクラスに集中し、多くの可能な相互作用シナリオが発生します。 例として、わかりやすくするために、ロボットと車が私のプロジェクトのクラスであったとしましょう。 したがって、Robotクラスには、次のパターンで多くのメソッドが含まれます。 睡眠(); isSleepAvaliable(); 起きている(); isAwakeAvaliable(); walk(方向); isWalkAvaliable(); シュート(方向); isShootAvaliable(); turnOnAlert(); isTurnOnAlertAvailable(); turnOffAlert(); isTurnOffAlertAvailable(); recharge(); isRechargeAvailable(); 電源を切る(); isPowerOffAvailable(); stepInCar(Car); isStepInCarAvailable(); stepOutCar(Car); isStepOutCarAvailable(); 自己破壊(); isSelfDestructAvailable(); die(); isDieAvailable(); 生きている(); isAwake(); isAlertOn(); getBatteryLevel(); getCurrentRidingCar(); getAmmo(); ... Carクラスでも同様です。 オンにする(); isTurnOnAvaliable(); 消す(); isTurnOffAvaliable(); walk(方向); isWalkAvaliable(); refuel(); isRefuelAvailable(); 自己破壊(); isSelfDestructAvailable(); クラッシュ(); isCrashAvailable(); isOperational(); isOn(); …

3
同じ動作を示す複数のオブジェクトの単体テストをどのように構成しますか?
多くの場合、私はいくつかの動作を持つ既存のクラスがあるかもしれません: class Lion { public void Eat(Herbivore herbivore) { ... } } ...そして単体テストがあります... [TestMethod] public void Lion_can_eat_herbivore() { var herbivore = buildHerbivoreForEating(); var test = BuildLionForTest(); test.Eat(herbivore); Assert.IsEaten(herbivore); } さて、私はライオンの行動と同じ行動をするTigerクラスを作成する必要があります: class Tiger { public void Eat(Herbivore herbivore) { ... } } ...そして私は同じ動作をしたいので、同じテストを実行する必要があります、私はこのようなことをします: interface IHerbivoreEater { void Eat(Herbivore herbivore); } ...そして私は私のテストをリファクタリングします: …

3
アジャイル開発デプロイメントプロセス。QAとビジネスオーナーはどこでテストしますか?
私は最近、SVNまたはGITを使用したさまざまなWebアプリケーションのデプロイメントプロセスについて、多くの記事を読んでいます。 アジャイルの多くのフレーバーの方法と同様に、マスターまたはトランクにコミットしたものはすべて本番環境で使用できると想定されています。GitHubとEtsyの両方(http://codeascraft.etsy.com/2010/05/20/quantum-of-deployment/)は、これらはこれに基づいて機能すると述べています(ただし、Etsyには実際にはステージング環境があります)。 このプロセスは、すべての単体テストとCIテストが実行されていることを前提としています。ローカルおよびCIでテストを実行し、トランクにコミットします。SO、この時点であなたのコードは技術的に健全です。 あなたのコードは技術的には正しいかもしれませんが、ユーザー/機能テストは、特にフロントエンドテストに関して、より多くのバグを発掘するかもしれません。 私の質問はこれです。QAおよびビジネスオーナーは、実装した機能の変更をどこでテストしますか?トランクにコミットする前のローカルの開発マシン、またはQA /ステージングマシンで? トランクから実行されるステージングマシンがあり、トランクにコミットされたすべてのコードが本番環境で使用できると想定している場合...ええと、どの時点で、コードはサインオフされ、技術とビジネスの両方から本番環境に移行するのに適しています。視点?ステージングマシンが1つだけで、多くの開発者がいて、そこにコードがQAされる場合、多くの開発者の変更がサインオフを待機している可能性があるため、トランクからどのように展開できますか。 他の人がこれにどのように取り組んだか聞いてみたいと思いますか?

4
単体テストの「単体」で理解されること
私が理論上「ユニット」の下で理解しているように、人々は方法(OOP)を意味します。しかし、実際には、いくつかのメソッドを分離して検証するテストは、非常に壊れやすい動作テストです(結果ではなく、いくつかの依存関係メソッドが呼び出されたことを検証します)。そのため、密接に関連するクラスの小さなセットをユニットごとに理解する多くの人々を目にします。この場合、外部の依存関係のみがモック/スタブされ、ユニット内部の依存関係には実際の実装が使用されます。この場合、より多くの状態があり、(仕様によると)意味があり、それほど脆弱なテストではありません。したがって、問題はこれらのアプローチについてどのように感じていますか、2番目のアプローチの単体テストを呼び出すことは有効ですか、それとも何らかの低レベルの統合テストなのでしょうか? これらのテスト方法のいずれかによるTDDの適用に関する特定の考慮事項が表示された場合は、私はあなたの考えに感謝します。

5
新しい機能やバグ修正のために、単体テストの作成に通常どれくらいの時間を費やす必要がありますか?
新しい機能を実装したり、バグを修正したりする必要があるときは、通常、テストで状況を再現しようとします。フィクスチャを考え出し、テストを書くのに3時間ほどかかることがあります。実際の機能の実装やバグの修正には1時間もかかりません。 実際に機能を実装したり、バグを修正したりするのに比べて、テストを書くために他の誰かが少なくとも3倍長い時間を費やしていますか?コードの作成に対するテストの作成に費やした時間の許容比率はどのくらいですか?

4
単体テストの新しい名前[終了]
休業。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善してみませんか?この投稿を編集して、事実と引用で回答できるように質問を更新してください。 4年前休業。 私はユニットテストが好きではありませんでした。それは私がしなければならない仕事の量を増やすといつも思っていました。 結局のところ、これは実際に記述するコードの行数に関してのみ当てはまり、さらに、これは、テストおよびテスト駆動開発で1時間で記述できる有用なコードの行数の増加によって完全に相殺されます。 ユニットテストが便利なコードを記述できるようになった今、私はユニットテストが大好きです。(木のノック) 厳格なタイムラインの下にある場合、または他の人がそれを行わないためにそうしないために、人々がユニットテストを行うか、テスト駆動開発でプロジェクトを開始することに消極的であることがわかりました。ちょっとみたい、文化的な拒否すらしよう。 ユニットテストの最も強力な点の1つは、リファクタリングを実行できるという自信です。また、コードを他の誰かにリファクタリング/改善するために与えることができるという新しい発見の希望も得られます。ユニットテストが引き続き機能する場合は、恐らくほとんど変更せずに、変更された新しいバージョンのライブラリを使用できます。 新しい名前が必要だと思うのは、ユニットテストのこの最後の側面です。単体テストは、このコードが現在、そして将来的に何をすべきかについての契約のようなものです。 テストという言葉を聞くと、ケージ内のマウスを思い浮かべます。化合物の有効性を確認するために複数の実験が行われました。これは単体テストとは異なり、さまざまなコードを試して最も効果的なアプローチを確認するのではなく、期待する出力と入力を定義します。マウスの例では、ユニットテストは、マウスで行われた実験とは対照的に、宇宙がどのように機能するかの定義に似ています。 私はひび割れているのですか、それとも他の誰かがテストを拒否するのを見て、それを彼らがテストしたくないのと同じ理由であると考えていますか? テストしない理由は何ですか? ユニットテストではないので、彼らの動機は何だと思いますか? そして、いくつかの異論を乗り越えるかもしれないユニットテストの新しい名前として、jContractはどうですか?(私が知っている少しJava中心:)、またはユニット契約?

1
オブジェクト指向プログラミングでは、関数型プログラミングと比較して単体テストが難しいのはなぜですか?
このシリーズを進めています。作者は、オブジェクト指向プログラミングでは状態が維持されるため、単体テストを書くのは難しいと述べています。彼はまた、関数型プログラミングは(常にではない)状態を維持しないので、単体テストを書く方が簡単だとも言っています。この問題を示す例は見当たりませんでした。これに該当する場合、オブジェクト指向プログラミングと関数型プログラミングの単体テストを比較する例を教えていただけますか?

2
サービスの構成変更をテストする方法は?
新しい構成を追加するときにサービスをテストする最善の方法は何ですか?たとえば、私のサービスは顧客にサービスを提供し、顧客の構成に基づいて、異なるタイプのサービスを提供します。たとえば、顧客が特定の通貨を選択した場合、別の通貨と比較して20%の割引が提供されます。 上記の例は重要ではありません。重要なのは、CI \ CDを行うときに人々がとるアプローチです 割引を計算するロジックはドメイン内にあり、その周りに単体テストがあります。私の質問は、割引を把握するためにさまざまなルールで構成されたマーチャントがいる場合(すべて構成に基づいており、ドメインがそれを解決する場合)、構成を変更する要求が来た場合、どのように確認しますか? もっとテストを書きますか? 単体テストと同じようにテストしませんか? 変更を手動でテストしますか? その他の 私は多くの記事と共にxUnitテストパターンとテスト駆動開発の本を読みましたが、人々がこれをどのように管理するか(サービス内の構成変更と正確性の検証)に遭遇していません。 私はこれが継続的デリバリー・ブックで扱われるのを見ません。

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