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

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

5
ユニットテストは時期尚早の一般化につながりますか(特にC ++のコンテキストで)?
予備メモ さまざまな種類のテストの違いについては説明しませんが、これらのサイトには既にいくつかの質問があります。 私はそこに何を取るだろうと、それは言う:単位は、「アプリケーションの最小単離ユニットテスト」の意味でのテストこの質問は、実際に由来します 分離の問題 プログラムの最小の分離可能な単位は何ですか。さて、私が見ているように、それは(非常に?)あなたがコーディングしている言語に依存します。 Micheal Feathersは縫い目の概念について語っています:[WEwLC、p31] シームは、その場所で編集せずにプログラムの動作を変更できる場所です。 そして、詳細に立ち入ることなく、私は、ユニットテストのコンテキストで、あなたの「テスト」があなたの「ユニット」とインターフェースできるプログラムの場所であると理解しています。 例 特にC ++の単体テストでは、テスト対象のコードから、特定の問題に対して厳密に要求される継ぎ目を追加する必要があります。 例: 非仮想実装で十分な仮想インターフェースを追加する 分割-generalizing(?)-テストを追加しやすくするための(さらに小さな)クラス 単一の実行可能プロジェクトを、一見「独立した」ライブラリに分割し、テストのためにそれらを独立してコンパイルしやすくするために「ちょうど」。 質問 同じことを願ういくつかのバージョンを試してみましょう。 ユニットテストでアプリケーションのコードを構造化する必要があるのは、ユニットテストに「のみ」有益であるか、実際にはアプリケーション構造に有益ですか。 必要とされるコードの一般化は、それがユニット・テスト可能な何のために有用にすることですが、ユニットテスト? 単体テストを追加すると、不必要に一般化されますか? シェイプユニットテストは、コードに「常に」強制することも、問題の領域から見た一般的なコードの良い形ですか。 コードを使用する2番目の場所が必要になるまで/必要になるまで一般化しないと言った経験則を覚えています。単体テストでは、コードを使用する2番目の場所、つまり単体テストが常にあります。それで、この理由は一般化するのに十分ですか?

2
組み込みC開発者向けの優れた単体テストの例[終了]
閉まっている。この質問はトピック外です。現在、回答を受け付けていません。 この質問を改善したいですか? 質問を更新して、 Software Engineering Stack Exchangeのトピックになるようにします。 6年前に閉鎖されました。 来週、ユニットテストとテスト駆動開発について私の部署に講演する予定です。その一環として、最近書いたコードから実際の例をいくつか紹介しますが、講演で書く非常に簡単な例をいくつか紹介したいと思います。 私はウェブ上で良い例を探してきましたが、開発分野に特に当てはまるものを見つけるのに苦労していました。私たちが作成するソフトウェアのほとんどは、小型のマイクロコントローラーで実行される埋め込み型の制御システムです。ユニットテストに簡単に適用できる多くのCコードがあります(ターゲット自体ではなくPCでユニットテストについて説明します)。「下」の層から直接離れている限り:直接話すものマイクロコントローラー周辺機器に。しかし、私が見つけたほとんどの例は文字列処理に基づいている傾向があります(たとえば、優れたDive Into Python Romanの数字の例)。文字列を使用することはほとんどないため、これは実際には適切ではありません(コードが通常使用する唯一のライブラリ関数について)ありmemcpy、memcmpそしてmemset、strcat または正規表現は正しくありません)。 では、質問に答えてください。ライブセッションで単体テストのデモンストレーションに使用できる機能の良い例を提供してくれる人はいますか?私の(変更される可能性がある)意見での適切な答えは、おそらく次のとおりです。 誰でも(たまにコードを書くだけでも)理解できるほど単純な関数。 無意味に見えない関数(つまり、パリティまたはCRCを計算することは、おそらく2つの数値を乗算してランダムな定数を追加する関数よりも優れています)。 人の部屋の前に書くのに十分短い関数(エラーを減らすためにVimの多くのクリップボードを利用するかもしれません...); 文字列を処理するのではなく、数値、配列、ポインター、または構造体をパラメーターとして受け取り、類似のものを返す関数。 単純なエラー(例えば)>ではなく、簡単に入力できる関数は、>=ほとんどの場合は動作しますが、特定のエッジケースで破損する可能性があります。ユニットテストで簡単に識別および修正できます。 何かご意見は? おそらく関連性はありませんが、テスト自体はおそらくGoogle Test Frameworkを使用してC ++で記述されます。すべてのヘッダーには既に#ifdef __cplusplus extern "C" {ラッパーがあります。これは、これまでに行ったテストでうまく機能しました。

8
単一クラスの単体テスト用の単一または複数のファイル?
組織のガイドラインをまとめるための単体テストのベストプラクティスを調査する際、テストフィクスチャ(テストクラス)を分離するか、1つのクラスのすべてのテストを1つのファイルに保持する方が良いか便利かという問題に直面しました。 ちなみに、純粋な意味での「ユニットテスト」とは、単一のクラス、テストごとに1つのアサーション、モックされたすべての依存関係などを対象とするホワイトボックステストのことです。 シナリオの例は、CheckInとCheckOutという2つのメソッドを持つクラス(Documentと呼ばれる)です。各メソッドは、動作を制御するさまざまなルールなどを実装します。テストごとに1つのアサーションルールに従って、メソッドごとに複数のテストがあります。およびのDocumentTestsような名前を持つ単一のクラスにすべてのテストを配置できます。CheckInShouldThrowExceptionWhenUserIsUnauthorizedCheckOutShouldThrowExceptionWhenUserIsUnauthorized または、2つの個別のテストクラスを持つことができます:CheckInShouldとCheckOutShould。この場合、テスト名は短縮されますが、特定の動作(メソッド)のすべてのテストが一緒になるように整理されます。 私はどちらのアプローチにも賛否両論があると確信しており、誰かが複数のファイルでルートを行っているのかどうか疑問に思っています。または、単一ファイルのアプローチを選択した場合、なぜそれが良いと感じるのですか?

1
Java 8コードの条件付きカバレッジを測定するのは理にかなっていますか?
Java 8が登場して以来、現在のJava用ツールによる条件付きコードカバレッジの測定は時代遅れではないのかと思っています。Javaの8のではOptionalとStream私たちはしばしば、それが簡単にすべての可能な実行パスをテストすることなく、非常に高い条件カバレッジを取得することができますコード分岐/ループを回避することができます。古いJavaコードとJava 8コードを比較してみましょう。 Java 8より前: public String getName(User user) { if (user != null) { if (user.getName() != null) { return user.getName(); } } return "unknown"; } 上記のメソッドには3つの実行パスがあります。条件付きカバレッジを100%取得するには、3つの単体テストを作成する必要があります。 Java 8: public String getName(User user) { return Optional.ofNullable(user) .map(User::getName) .orElse("unknown"); } この場合、ブランチは非表示になり、100%のカバレッジを得るために必要なテストは1つだけで、テストするケースは関係ありません。カバーすべき3つの論理ブランチはまだありますが、信じています。最近の条件付きカバレッジ統計は完全に信頼できないものになっていると思います。 Java 8コードの条件付きカバレッジを測定するのは理にかなっていますか?十分にテストされていないコードを発見する他のツールはありますか?

4
データの配置が面倒すぎる場合のテスト方法
私はパーサーを書いており、その一部として、Expander単一の複雑なステートメントを複数の単純なステートメントに「拡張」するクラスがあります。たとえば、これはこれを展開します: x = 2 + 3 * a に: tmp1 = 3 * a x = 2 + tmp1 今、私はこのクラスをテストする方法、具体的にはテストを配置する方法を考えています。入力構文ツリーを手動で作成できます。 var input = new AssignStatement( new Variable("x"), new BinaryExpression( new Constant(2), BinaryOperator.Plus, new BinaryExpression(new Constant(3), BinaryOperator.Multiply, new Variable("a")))); または、文字列として記述して解析することもできます。 var input = new Parser().ParseStatement("x = 2 + 3 * a"); …

1
ファイルリーダーをテストするにはどうすればよいですか?
私はいくつかのファイル形式のプロジェクトに取り組んでいます。一部の形式は.xsdsによって指定され、他の形式はそれぞれのWebサイトのドキュメントによって指定され、一部はドキュメントのないカスタムの社内形式です。ムワハハハハ。 どうしたの? ファイルリーダーをテストしたいと思いますが、これを実行する方法が完全にはわかりません。アプリケーションのフローは次のとおりです。 file.___ ===> read by FileReader.java ===> which creates a Model object どこFileReaderインタフェースがあります public interface FileReader { public Model read(String filename); } Modelファイルが読み込まれたときに移入された属性の数を持っています。次のように見えます public class Model { List<String> as; List<String> bs; boolean isAPain = true; // ... } 私は何を試しましたか? 私の唯一のアイデアは、各ファイル形式のファイル「ジェネレーター」を作成することでした。これらのジェネレーターは基本的に、いくつかの変数(たとえば、ファイルで生成するコメントの数)を受け取り、サンプルファイルを出力してから読み込み、結果Modelを最初にファイルの生成に使用した変数と比較するビルダーです。 ただし、これにはいくつかの問題があります。 生成されるファイルは、実際のファイルのようには見えません。ジェネレーターはコンテキストをまったく認識しません。 私が手動で変数を設定しているので、ジェネレータがエッジケース用に生成したかどうかを認識するのは困難です。この方法は、1ダースのサンプルファイルを作成するよりもましです。 これを行うためのより良い方法はありますか? 編集:それは私が実際に意味するものなので、ユニットを統合に変更しました。 EDIT2:これは私が言及したエッジケースの例です。 各ファイルは、頂点とエッジで構成されるグラフを表します。これらの頂点とエッジはさまざまな方法でアタッチできます。 v1 …

6
リポジトリメソッドをテストするためにユニットテストが必要なのはなぜですか?
私は経験不足のためにそれをうまく防御できないので、この質問について少し主張する悪魔を演じる必要があります。これが契約です。概念的には、単体テストと統合テストの違いを理解できます。永続化メソッドとリポジトリに特に焦点を当てる場合、単体テストでは、おそらくMoqなどのフレームワークを介してモックを使用し、検索された順序が期待どおりに返されたと主張します。 次の単体テストを作成したとしましょう。 [TestMethod] public void GetOrderByIDTest() { //Uses Moq for dependency for getting order to make sure //ID I set up in 'Arrange' is same one returned to test in 'Assertion' } したがって、セットアップしOrderIdExpected = 5て、モックオブジェクトが5IDとして返されると、テストに合格します。わかった。コードを単体テストして、コードのプリフォームが期待するオブジェクトとIDを返し、他の何かは返さないことを確認しました。 私が得る議論はこれです: 「なぜ単体テストをスキップして統合テストを行わないのですか?データベースのストアドプロシージャとコードを一緒にテストすることが重要です。テストに時間がかかることはわかっていますが、テストを実行してテストする必要があるので、両方を持っていても意味がありません。重要なことをテストするだけです。」 「まあ、それは統合テストであり、ユニットテストとしてコードを個別にテストする必要があります。やだ、やだ、やだ...」などの教科書の定義でそれを守ることができます。対現実は失われつつあります。私は時々これに出くわし、最終的に外部依存関係に依存する単体テストコードの背後にある理由を擁護できない場合、それを主張することはできません。 この質問に関するヘルプは大歓迎です、ありがとう!

4
実施していない会社で単体テストを実装する
私の会社のソフトウェア開発責任者は「辞任」(解雇)しましたが、現在、当社の開発慣行の改善を検討しています。これから作成されるすべてのソフトウェアに単体テストを実装したいと考えています。 開発者からのフィードバックはこれです: テストは価値があることを知っています ただし、仕様は常に変更されるため、時間の無駄になります。 そして、あなたの締め切りは非常に厳しいので、とにかくテストするのに十分な時間がありません CEOからのフィードバックは次のとおりです。 私たちの会社に自動化されたテストをしてもらいたいのですが、それを実現する方法がわかりません 大きな仕様書を書く時間がない 開発者はどのように仕様を入手しますか?口コミまたはPowerPointスライド。明らかに、それは大きな問題です。私の提案はこれです: また、開発者に一連のテストデータと単体テストを提供しましょう それが仕様です。それが望むものについて明確で定量的であるかどうかは、管理者次第です。 開発者は、必要と思われる他の機能は何でも配置でき、テストでカバーする必要はありません さて、あなたがこのような状況にあった会社にいたことがあれば、どのように問題を解決しましたか?このアプローチは合理的ですか?
19 unit-testing  tdd 

1
クラスをユニットテストしましたが、統合テストを開始する方法を教えてください。
この質問は、Software Engineering Stack Exchangeで回答できるため、Stack Overflowから移行されました。 7年前に移行され ました。 MailChimpRecipientと呼ばれるMailChimpリストの受信者を管理するクラスを作成しました。サードパーティのAPIラッパーであるMCAPIクラスを使用します。 http://apidocs.mailchimp.com/api/1.3/ http://apidocs.mailchimp.com/api/downloads/ MCAPIオブジェクトをMailChimpRecipientオブジェクトのコンストラクターに渡すため、PHPUnitを使用して、独自のクラスのすべてのロジックをテストする単体テストを作成しました(MCAPIクラスはテストしていません)。コードカバレッジは100%で、すべてのテストに合格しています。これは、MCAPIオブジェクトのモックとスタブ化によって行われます。 次のステップでは、PHPUnitを使用して統合テストを作成し、実際のMCAPIオブジェクトを使用してMailChimpRecipientフィクスチャを構築し、実際のMailChimpリストを使用するように設定しました。 私は、次のように、基本的にオブジェクトのパブリックインターフェイスに対してテストを実行する統合テストだと思うものを書きました。 public function testAddedRecipientCanBeFound() { $emailAddress = 'fred@fredsdomain.com'; $forename = 'Fred'; $surname = 'Smith'; // First, delete the email address if it is already on the list $oldRecipient = $this->createRecipient(); if($oldRecipient->find($emailAddress)) { $oldRecipient->delete(); } unset($oldRecipient); // Add the …
19 php  unit-testing 

9
保守性の問題があるプロジェクトで新しいチームリーダーとして何をすべきか?
この質問は、Software Engineering Stack Exchangeで回答できるため、Stack Overflowから移行されました。 8年前に移行され ました。 保守性の問題を抱えたコードプロジェクトを担当しました。プロジェクトを安定した足場にするために何ができますか? 私は、単体テスト、IOC、MEF、静的クラス、純粋なデータセットなど、多くの重要なものが欠けている非常に大きな多層.NETシステムで作業している場所にいることに気づきました。わずか24年ですが、私はここに3年近く滞在しました(このアプリは5年間開発中です)。主に時間の制約により、他のがらくたに合うようにたわごとを追加しています。空き時間に多くのプロジェクトを行った後、これらすべての概念がどれほど重要かを理解し始めました。また、従業員の交代により、私はこのプロジェクトのチームリーダーになりました。このアプリを改善するためのスマートな方法を考え出したいと思います。経営陣に価値を説明できる方法。私は何をしたいのかというアイデアを持っていますが、それらはすべて前もって大きな利益を得ることができず、とても圧倒的です。人々がどのようにこれに対処したか、または対処したかについての物語は、非常に興味深い読み物です。ありがとう。

1
Visual Studio 2010で単体テストを設定する方法は?[閉まっている]
閉まっている。この質問はトピック外です。現在、回答を受け付けていません。 この質問を改善したいですか? 質問を更新して、 Software Engineering Stack Exchangeのトピックになるようにします。 4年前に閉鎖されました。 私は最初の大きなプロジェクトを行っていますが、プロのプログラミング環境での経験はあまりありません。プログラミング関連の何かを調査していると、ユニットテストへの参照がよく見られますが、それらの設定方法について、またはそれが自分にとって有益であるかどうかについては、まだわかりません。 誰かがユニットテストについて説明してくれますか?また、複数のプロジェクトがあるVisual Studio 2010ソリューションでユニットテストを設定する方法はありますか?プロジェクトのソリューション内で発生するものですか、それとも別のソリューションですか?また、小規模な開発チームに推奨するものですか、それともセットアップに時間の無駄ですか? 現在、プログラム全体を実行して現在作業中のものをテストしていますが、デバッグが容易ではない問題が発生することがあります。コードのサブセットを他の場所で実行すると便利な場合があります。プログラムの一部をテストするために参照されるいくつかのライブラリを使用したプロジェクトですが、それを設定するよりも、関連するすべての依存関係のためにプログラム全体を実行するのに時間がかかると感じます

6
ユニットテストフレームワークは本当に必要ですか?
現在、私の仕事では、C ++アプリケーション用の単体テストの大規模なスイートを用意しています。ただし、単体テストフレームワークは使用しません。それらは、基本的にassertとcoutをラップするCマクロを単に利用します。何かのようなもの: VERIFY(cond) if (!(cond)) {std::cout << "unit test failed at " << __FILE__ << "," << __LINE__; asserst(false)} 次に、次のような各テストの関数を作成します。 void CheckBehaviorYWhenXHappens() { // a bunch of code to run the test // VERIFY(blah != blah2); // more VERIFY's as needed } CIサーバーは「ユニットテストに失敗しました」を選択し、ビルドに失敗し、開発者にメッセージを送信します。 また、セットアップコードが重複している場合は、本番環境にある他の重複コードと同じようにリファクタリングします。ヘルパー関数の背後にラップし、いくつかのテストクラスをラップして、頻繁に使用されるシナリオを設定します。 CppUnitやboostユニットテストのようなフレームワークがあることは知っています。これらはどのような価値をもたらすのだろうか?これらがテーブルにもたらすものを見逃していますか?それらから得ることができる何か有用なものはありますか?私たちが持っているものは非常にシンプルでうまく機能しているように見えるので、特に本当の価値を追加しない限り、依存関係を追加することをmしています。

3
Dockerイメージにテストを含める必要がありますか?
テストに関しては、2つのオプションが考えられます。 テストとアプリケーションの両方を1つのイメージに入れます。 イメージにはアプリケーションコードのみを含めます。メインイメージの後にビルドし、いくつかのレイヤーを追加するテスト固有のコンテナーを作成します(テストコード、依存関係など)。 最初のオプションでは、コンテナをテストし、テストしたとおりに出荷できます。明らかな欠点は、不要なコード(および潜在的にテストデータ)がイメージに含まれることです。 2番目のオプションでは、出荷されるイメージはテストされるイメージとまったく同じではありません。 どちらも悪い戦略のように見えます。3番目のより良い戦略はありますか?

1
単体テスト:Linqによるアサーションの遅延
このような遅延アサーションを追加しても大丈夫ですか var actualKittens = actualKittens.Select(kitten => { Assert.IsСute(kitten); return kitten }); どうして?そのため、たとえば実体化されたコレクションを期待するステートメントでも、一度だけ反復できます。 CollectionAssert.AreEquivalent(expectedKittens, actualKittens.ToList()); また、Selectだけでなく、イテレータが定義され、多くのチェックとロジック(たとえば、いくつかのカウントとフィルタリング)を持つメソッドでもあります。 疑いの種は、テストが失敗した場合にそのようなコードを読み取り、デバッグする複雑さです。

7
グラフ構造を使用してどのようにコードを単体テストしますか?
私は、依存関係グラフをナビゲートし、依存関係のサイクルまたは矛盾を探す(再帰的)コードを書いています。ただし、これを単体テストする方法はわかりません。問題は、発生する可能性があるすべての興味深いグラフ構造のコードハンドルと、すべてのノードが適切に処理されるようにすることです。 通常、一部のコードが動作することを確信するには100%の回線またはブランチのカバレッジで十分ですが、100%のパスカバレッジであってもまだ疑問があるように感じます。 したがって、テストケースのグラフ構造を選択して、コードが実際のデータで見つかる可能性のあるすべての順列を処理できることを確信できるようにするにはどうすればよいでしょうか。 PS-問題がある場合、グラフ内のすべてのエッジに「必要」、「不可」のラベルが付けられ、自明なサイクルはなく、2つのノード間に1つのエッジしかありません。 PPS-この追加の問題ステートメントは、もともと質問の著者によって以下のコメントで投稿されました。 For all vertices N in forest F, for all vertices M, in F, such that if there are any walks between N and M they all must either use only edges labelled 'conflict' or 'requires'.

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