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

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

1
データベースロジックを単体テストするにはどうすればよいですか?
TDDに関しては、まだ小さな問題を乗り越える問題があります。 データレイヤー(linq2SQL)からフィルター処理されたデータの特定のレコードセットを取得するメソッドが必要です。DBMLから生成されたlinq生成クラスを使用していることに注意してください。問題は、このためのテストを書きたいということです。 私は: a)最初にテストにレコードを挿入し、次にメソッドを実行して結果をテストします b)データベースにある可能性のあるデータを使用します。このロジックが原因で物事が壊れる可能性があることに熱心にしないでください。 c)あなたは何を提案しますか?
12 c#  unit-testing 

2
サブクラスまたは抽象親クラスを単体テストする必要がありますか?
Effective JavaのItem 18にあるように、スケルトン実装を持っています(詳細な議論はこちら)。これは抽象クラスであり、2つのパブリックメソッドmethodA()およびmethodB()を提供し、サブクラスメソッドを呼び出して、抽象化された方法では定義できない「ギャップを埋める」。 最初に具体的なクラスを作成し、そのための単体テストを作成して開発しました。2番目のクラスが来たとき、共通の動作を抽出し、2番目のクラスに「欠落したギャップ」を実装することができました(もちろん、2番目のサブクラスに対して単体テストが作成されました)。 時間が経ち、今では4つのサブクラスがあり、それぞれが具体的な実装に非常に固有の3つの短いプロテクトメソッドを実装していますが、骨格実装はすべての一般的な作業を行います。 私の問題は、新しい実装を作成するときに、もう一度テストを書くことです。 サブクラスは特定の必須メソッドを呼び出しますか? 特定のメソッドに特定の注釈がありますか? メソッドAから期待される結果が得られますか? メソッドBから期待される結果が得られますか? このアプローチの利点を見ながら: テストを通じてサブクラスの要件を文書化します 問題のあるリファクタリングの場合、高速で失敗する可能性があります サブクラス全体とパブリックAPIを使用してテストします(「methodA()は機能しますか?」ではなく、「このprotectedメソッドは機能しますか?」) 私が持っている問題は、新しいサブクラスのテストは基本的に簡単です:-テストはすべてのサブクラスですべて同じであり、メソッドの戻り値の型を変更するだけです(スケルトン実装はジェネリックです)。テストのアサート部分を確認してください。-通常、サブクラスにはそれらに固有のテストはありません テストがサブクラス自体の結果に焦点を当て、リファクタリングから保護する方法が好きですが、テストの実装が単なる「手動作業」になったという事実は、私が何か間違ったことをしていると思うようにします。 クラス階層をテストするときにこの問題は一般的ですか?どうすればそれを回避できますか? ps:スケルトンクラスのテストについて考えましたが、抽象クラスのモックを作成してテストできるようにするのも奇妙に思えます。そして、サブクラスが予期していない動作を変更する抽象クラスのリファクタリングは、それほど速くは気付かれないと思います。私の勇気は、サブクラスを「全体として」テストすることがここで好ましいアプローチであることを教えてくれますが、間違っていると教えてください:) ps2:私はグーグルで調べて、このテーマに関する多くの質問を見つけました。そのうちの一つがこれ一つであり偉大な答えナイジェルソーンからの、私の場合は彼の「ナンバー1」になります それは素晴らしいことですが、この時点ではリファクタリングできないので、この問題に耐えなければなりません。リファクタリングできれば、各サブクラスを戦略として使用できます。それは問題ありませんが、「メインクラス」と戦略をテストしますが、メインクラスと戦略の統合を壊すリファクタリングは見当たりません。 ps3:抽象クラスをテストすることは「受け入れられる」という回答をいくつか見つけました。これは受け入れられることに同意しますが、この場合にどちらが好ましいアプローチであるかを知りたいと思います(私はまだ単体テストから始めています)

3
シングルアサートユニットテストはDRYの原則に違反しませんか?
ユニットテストを書くときはいつでも、テストが失敗したときにデバッグを容易にするために、テストごとに1つのアサートをしようと常に試みてきました。しかし、この規則に従うと、各テストで同じコードを常にコピーしているように感じます。テストを増やすことで、読み取りと保守に戻るのが難しくなります。 シングルアサーションテストはDRYに違反していますか? そして、メソッドごとに1つのテストを行うなど、良いバランスを見つけるために従うべき良いルールはありますか?* *私はおそらく、これに対するすべてのソリューションに適した1サイズではないことを認識していますが、これにアプローチする推奨方法はありますか?


5
RSpecとCucumberは本当に価値がありますか?
私はほとんどのRoRプログラマーがテスト中毒者であり、大規模なテストスイートの利点を理解していますが、テストを開始したとき、そのような大規模なスイートを取得することはなく、「正しい方法でテストしていますか?本当に効率的ですか?」多くの場合、アプリケーションの動作のみをテストする統合テストを扱っています。 まず、テストする価値は本当にありますか?つまり、テストの作成に費やした時間は本当に価値があるのでしょうか? 次に、RSpecを使用し、最近Cucumberを発見し、しばらく使用しましたが、これらすべての手順を書くことが本当に面倒な価値があるかどうかわかりませんか?私はステップを再利用できることは知っていますが、これらのステップが完了しすぎているかどうかはわかりません:たとえば、aを使用していますが、作成した場合にユーザーを複製する可能性があるためGiven I am logged in as (.+)、その定義で言う必要があるかどうかはわかりませんGiven there's a user called $1しかし、それは常に一歩前にある価値はありませんGiven I am logged in as (.+)。非常に多くのコードであり、おそらくほとんど役に立たないでしょう。毎日テストされた部品に新しいバグはないのではないかと思います...それで、CucumberはRSpecと比較して本当に価値がありますか?

2
従来のプレーンなCプロジェクトへの単体テストの追加
タイトルはそれをすべて言います。私の会社は、完全にプレーンCで記述されたマイクロコントローラーデバイス用のレガシーファームウェアプロジェクトを再利用しています。 明らかに間違っており、変更が必要な部分があります。C#/ TDDのバックグラウンドから来たので、機能を変更しないことを保証するためのテストなしでランダムにリファクタリングするというアイデアは好きではありません。また、バグを見つけるのが難しいことは、わずかな変更(多くの場合、回帰テストを使用した場合に修正されると思います)によって導入されたことがわかりました。これらの間違いを避けるために、多くの注意を払う必要があります。コードの周りの多くのグローバルを追跡するのは難しいです。 要約する: リファクタリングする前に、既存の密結合コードに単体テストをどのように追加しますか? どのツールをお勧めしますか?(それほど重要ではありませんが、知っておくといいです) 私はこのコードの作成には直接関与していません(私の責任はさまざまな方法でデバイスと対話するアプリです)が、使用できる可能性がある場合、良いプログラミングの原則が残されていると悪いでしょう。

1
すべてのメソッドがユニットテストの値を返す必要がありますか
最終的に(そしてうまくいけば)TDDのみを開始するための単純な単体テストを作成する方法を学んでいます。今のところ、問題の原因を調べるために、すでに記述されているコードのテストを記述しようとしています。これはその1つです。 私がこの単純なクラス(Typescript-> JavaScript)を持っているとしましょう: class PrivateStuff { greeting: string; private _thisIsPrivate; constructor(isPrivate: boolean) { this._thisIsPrivate = isPrivate; } setPrivate(option) { this._thisIsPrivate = option; console.log("_thisIsPrivate changed to : " + option); } getPrivate() { console.log("_thisIsPrivate is : " + this._thisIsPrivate); return this._thisIsPrivate; } } そして私はそれをこのように使用します: let privateStuff = new PrivateStuff(false); let buttonSet …
12 unit-testing  tdd 

2
ドメインオブジェクトの作成をテストする単体テスト
次のような単体テストがあります。 [Test] public void Should_create_person() { Assert.DoesNotThrow(() => new Person(Guid.NewGuid(), new DateTime(1972, 01, 01)); } ここでPersonオブジェクトが作成された、つまり検証が失敗しないと断言しています。たとえば、Guidがnullの場合、または生年月日が1900年1月1日より前の場合、検証は失敗し、例外がスローされます(テストが失敗したことを意味します)。 コンストラクターは次のようになります。 public Person(Id id, DateTime dateOfBirth) : base(id) { if (dateOfBirth == null) throw new ArgumentNullException("Date of Birth"); elseif (dateOfBith < new DateTime(1900,01,01) throw new ArgumentException("Date of Birth"); DateOfBirth = dateOfBirth; } これはテストのための良いアイデアですか? 注:ドメインモデルの単体テストに古典的なアプローチを採用している場合は、それが何らかの意味を持っています。

3
Pythonでユニットテストのグローバルパラメータを適切に処理する方法は?
私たちは多くのアルゴリズムを実装していますが、それらは通常、多くの共有され、公に知られており、セキュリティ関連のパラメーターを持っています。 現在、すべてのパラメーターと2つの定義済みグローバルオブジェクトを保持するクラスを使用しています。 class PublicParams(object): p = q = 0 def __init__(self, p, q): self.p = p self.q = q # used for tests publicParams_test = PublicParams(15,7) # Some 2048 bit numbers for example publicParams_secure = PublicParams(128378947298374928374,128378947298374928374) その後、アルゴリズムはPublicParamsオブジェクトを引数として受け取り、デフォルトで生産的になりますpublicParams_secure def AlgoOne(n, publicParams = publicParams_secure): # do stuff with publicParams.p # ... AlgoTwo(x, …

2
複数の、または正しい正解を証明するのが困難な(決定論的な)アルゴリズムのテスト
この質問が似ていることを序文にしたいと思いますが、私の質問にはランダム性は関係せず、単なる決定的な決定論なので、「既知のシードを使用する」という答えは実際には当てはまりません。同様に、この質問は似ていますが、再び、アルゴリズムが失敗することを期待していません-どの方法が正しいかわかりません。 この質問は、グラフアルゴリズムのテスト中に発生しました。しかし、決してそれらに限定されません。A *などの一部のアルゴリズムには、複数の正解があります。正確な実装に応じて、いくつかの回答のいずれかが得られる場合がありますが、それぞれが同じように正しいです。ただし、どちらを先に吐き出すのかわからないため、テストを難しくする可能性があります。また、回答を手作業で計算するのは非常に時間がかかります。 私の特定のケースでは、Floyd-Warshallを修正して可能な限りすべての最短経路を吐き出すことで回避し、それを手作業でテストしました。それ自体が優れた機能であるという利点がありました。次に、FWからの既知の正しいパスに関して他の機能をテストできます(返されたパスが、その開始/終了ペアに対してFWによって返されたパスのいずれかである場合、それは正しいです)。もちろん、これは、FWの動作方法が原因で、密なグラフでのみ機能しますが、それでも優れています。 ただし、この特性を備えたすべてのアルゴリズムで常に実行できるとは限りません。これまでのところ、私が思いついた最良の答えは、正解そのものではなく、正解の特性をテストすることです。最短パスアルゴリズムに戻るには、返されたパスのコストを既知の正しいコストと比較し、パスが有効であることを確認できます。 これは機能しますが、特に検証自体が複雑な場合(たとえば、正しいアルゴリズムが存在する場合、最小スパニングツリーの検証は既知の難しい問題であり、おそらく以下よりも難しい場合)、すべてが正しく検証されないというリスクがありますMST自体の構築)、この場合、テストコードを広範囲にテストする必要があります。さらに悪いことには、MST検証アルゴリズムをテストするためにMSTを構築する必要があるため、MSTテストがMST検証アルゴリズムの動作に依存し、MST検証アルゴリズムのテストがMST生成コードの動作に依存するという素晴らしいシナリオになります。 最後に、出力を観察し、手作業で検証し、検証したばかりの出力をテストするためにテストをハードコーディングする「簡単な方法」がありますが、毎回テストを修正する必要があるため、それは素晴らしいアイデアではありません実装を少し変更します(これは自動テストで回避することになっています)。 明らかに、答えはある程度テストしている正確なアルゴリズムに依存しますが、いくつかの明確で決定的な「正しい」出力を持つアルゴリズムを検証するための「ベストプラクティス」があるかどうか疑問に思っていましたが、それらの正確な正しい出力は事前に知っていて、事実を確認することすら難しいかもしれません。

3
ハードコードされたオブジェクトでメソッドをモックする方法は?
私は複数のレイヤーを持つアプリケーションに取り組んでいます。データソースからデータを取得して保存するデータアクセスレイヤー、データを操作するビジネスロジック、画面にデータを表示するユーザーインターフェイス。 ビジネスロジックレイヤーの単体テストも行っています。唯一の要件は、ビジネスレイヤロジックのフローをテストすることです。そこで、Moqフレームワークを使用してデータアクセスレイヤーをモックし、MS Unitでビジネスロジックレイヤーを単体テストします。 インターフェイスプログラミングを使用して、ユニットテストを実行できるように、設計を可能な限り分離します。インターフェイスを介したビジネスレイヤコールデータアクセスレイヤ。 ビジネスロジックメソッドの1つをテストしようとすると、問題に直面しています。このメソッドはいくつかの作業を行い、オブジェクトを作成してデータアクセスレイヤーに渡します。そのデータアクセスレイヤーメソッドをモックしようとすると、正常にモックできません。 ここでは、問題を示すデモコードを作成しようとしています。 モデル: public class Employee { public string Name { get; set; } } データアクセス層: public interface IDal { string GetMessage(Employee emp); } public class Dal : IDal { public string GetMessage(Employee emp) { // Doing some data source access work... return string.Format("Hello {0}", emp.Name); …

10
コードカバレッジ品質の議論に反論する方法に関するツール/提案
今、私は人々がこの質問を複製したり何度も質問したりすることを考えることができることを知っています。その場合、関連する質問へのリンクと私の質問への回答に感謝します。 私は最近、コードカバレッジについて何人かの人々と意見が分かれています。私は、100%のカバレッジは高品質のテスト、したがって高品質のコードを意味しないという議論に基づいて、チームにコードカバレッジを完全に削除することを希望する人々のグループがいます。 私は、コードカバレッジがテストされていないことを確かに伝えており、それらの領域に集中するのに役立つという議論を売り払うことによって押し戻すことができました。 (上記は、このような他のSO質問で同様の方法で議論されています-/programming/695811/pitfalls-of-code-coverage) これらの人々からの議論は次のとおりです。そして、チームは低品質のテストをすばやく作成することで反応し、重要な品質を追加することなく時間を無駄にします。 私は彼らの視点を理解していますが、より多くのカバレッジ基準を処理するより堅牢なツール/フレームワークを 導入することにより、コードカバレッジのより堅牢なケースを作成する方法を探しています(Functional, Statement,Decision, Branch, Condition, State, LCSAJ, path, jump path, entry/exit, Loop, Parameter Value etc)。 私が探しているのは、このようなコードカバレッジツールとプラクティス/プロセスの組み合わせを提案して、それらに合うようにすることです。 主観的ではあるが、コードカバレッジによりコードの品質とテストの価値をより意識できるようになったため、このような議論に対抗する方法に関するあなたの経験/知識に基づいた付随するコメント/提案も歓迎します。 編集:典型的なコードカバレッジの弱さに対する私の理解に関する混乱を減らすために、ツール(または実行されたコードの行)を参照しているわけではない ことを指摘したいと思いStatement Coverageます(たくさんあります)。実際には、ここでそれが間違っているすべてに関する良い記事があります:http : //www.bullseye.com/statementCoverage.html 複数のカバレッジの基準とレベルにさらに踏み込んで、ステートメントまたはラインカバレッジ以上のものを探していました。 参照:http : //en.wikipedia.org/wiki/Code_coverage#Coverage_criteria アイデアは、ツールが複数の基準に基づいてカバレッジを教えてくれれば、それがテスト品質の合理的な自動評価になるということです。私は決して回線カバレッジが良い評価だと言っているわけではありません。実際、それが私の質問の前提です。 編集: わかりました、多分私はそれを少し劇的に投影しすぎたかもしれませんが、あなたはポイントを得ます。問題は、すべてのチームに共通のプロセス/ポリシーを同種/一貫した方法で設定することです。また、テストの品質をどのように保証するのか、何の対策も講じずに保証時間をどのように割り当てるのかという懸念が一般的です。したがって、適切なプロセスと適切なツールでバックアップすると、無駄なプロセスに時間を費やしていないことを認識しながら、コードの品質を改善できる測定可能な機能が好きです。 編集:これまでのところ私が答えから持っているもの: コードレビューは、テストの品質を確保するためにテストをカバーする必要があります Test First戦略は、事実の後に書かれたテストを回避して、カバレッジを単純に増加させるのに役立ちます% 単純なステートメント/行以外のテスト基準をカバーする代替ツールの探索 カバーされたコード/見つかったバグの数の分析は、カバレッジの重要性を評価し、より良いケースを作るのに役立ちます 最も重要なことは、正しいことを行い、彼らの信念のために戦うというチームのインプットを信頼することです。 対象ブロック/テスト数-議論の余地あり これまで素晴らしい答えをありがとう。本当に感謝しています。このスレッドは、その能力を持つブレインストーミングの時間よりも優れています。

3
モックコンクリートクラス-非推奨
私は、「Growing Object-Oriented Software」の本の抜粋を読んだところです。これは、具象クラスのモックが推奨されない理由を説明しています。 以下に、MusicCentreクラスの単体テストのサンプルコードを示します。 public class MusicCentreTest { @Test public void startsCdPlayerAtTimeRequested() { final MutableTime scheduledTime = new MutableTime(); CdPlayer player = new CdPlayer() { @Override public void scheduleToStartAt(Time startTime) { scheduledTime.set(startTime); } } MusicCentre centre = new MusicCentre(player); centre.startMediaAt(LATER); assertEquals(LATER, scheduledTime.get()); } } そして彼の最初の説明: このアプローチの問題は、オブジェクト間の関係が暗黙的に残されることです。モックオブジェクトを使用したテスト駆動開発の目的は、オブジェクト間の関係を発見することであることを明確にしたことを願っています。サブクラスを作成する場合、ドメインコードにはそのような関係を表示するものはなく、オブジェクトのメソッドだけです。これにより、この関係をサポートするサービスが他の場所に関連しているかどうかを確認するのが難しくなり、次回クラスで作業するときに分析をやり直す必要があります。 彼が言うとき、彼が何を意味するのか正確に理解することはできません。 これにより、この関係をサポートするサービスが他の場所に関連しているかどうかを確認するのが難しくなり、次回クラスで作業するときに分析をやり直す必要があります。 サービスはMusicCentreのメソッドに対応することを理解していますstartMediaAt。 「他の場所」とはどういう意味ですか? …

3
ユニットテストと統合テストの間のどこに線を引くべきですか?それらは分離すべきですか?
私が取り組んできた小さなMVCフレームワークがあります。コードベースは決して大きくはありませんが、2、3のクラスではありません。私はついに思い切ってテストを書き始めることにしました(はい、私はずっとそれをやっていたはずですが、APIはこれまで非常に不安定でした) とにかく、私の計画は、統合テストなど、テストを非常に簡単にすることです。統合テストの例は、次のようなものに沿って進みます。 偽のHTTP要求オブジェクト-> MVCフレームワーク-> HTTP応答オブジェクト->応答が正しいことを確認 これは状態や特別なツール(ブラウザの自動化など)なしですべて実行できるため、実際には通常の単体テストフレームワーク(私はNUnitを使用)で簡単に実行できます。 さて、大きな質問です。ユニットテストと統合テストのどこに正確に線を引くべきですか?ユニットテストで一度に(可能な限り)1つのクラスのみをテストする必要がありますか?また、統合テストは、ユニットテストプロジェクトと同じテストプロジェクトに配置する必要がありますか?

3
BDDの概念を採用したがらないチームに「販売」するために、どのような議論を使用できますか?
私は、行動駆動開発方法論(別名BDD)の声明的な支持者です。私は数年前からBDDを適用してきましたが、DotNetアプリケーションを開発する際の選択のフレームワークとしてStoryQを採用しました。私は長年ユニットテストを行っており、以前はテストファーストのアプローチに移行していましたが、BDDフレームワークを使用することでより多くの価値が得られることがわかりました。コード内の英語をクリアします。テストはテストを途中で終了することなく複数のアサーションを実行できるため、デバッグすることなく、どの特定のアサーションが合格/失敗するか一目で確認できます。 これは本当に私にとって氷山の一角でした。テストコードと実装コードの両方をより的を絞った方法でデバッグできることにも気づきました。その結果、生産性が大幅に向上し、ビルドログに出力されるために問題が統合ビルドに至るまでに発生した場合、障害が発生した場所を簡単に判断できます。さらに、StoryQ apiには、習得が容易で、非常に多くの方法で適用できる美しい流な構文があり、使用するために外部の依存関係を必要としません。 したがって、これらすべての利点があれば、チームの他のメンバーにこのコンセプトを簡単に導入できると思います。残念ながら、他のチームメンバーはStoryQを見てそれを適切に評価することを嫌がり(BDDを適用するというアイデアを楽しまないでください)、お互いの説得力のあるテストフレームワークから多くのStoryQ要素を削除しようと互いに確信していますただし、元々StoryQの使用をサポートしており、削除したいコードがテストシステムの他の部分に影響を与えることはありませんでした。そうすると、特定の作業環境でテストファーストで作業するより良い方法であり、より大きな結果につながるだけであると実際の経験から確信しているので、全体的にワークロードが大幅に増加し、実際に穀物に反することになります私のソフトウェアの品質の改善 veは、BDDを使用して最初にテストに固執する方が簡単だと感じました。さらに明確にするために、私たちが行った単体テストの大部分は非常に脆弱で維持が難しい傾向があります。テスト駆動型プロセスに固執することを嫌がって開発者が古い習慣に戻り、プロジェクトの最後にすべてのテストを行います(同じ人がアジャイルだと主張しています!)。 したがって、質問は次のようになります。 このチームがStoryQを使用すること、少なくともBDD方法論を採用することの方が良いと主張するために、どのような議論を使用できますか? BDDを標準的な選択方法として採用するという私の主張を裏付けるために使用できる事例証拠を教えてください。 チームがBDDを採用することを奨励したいという私の希望が間違っている可能性があることを示唆する反論はありますか?はい、議論が健全なものであれば、間違っていることが証明されてうれしいです。 注:テスト全体を書き直すことを推奨するのではなく、将来のすべてのテスト作業のために、できればお客様と交わる方法で異なる方法で作業を開始することを推奨します。 また、BDDの詳細については、次のリンクが役立ちます。 http://dannorth.net/introducing-bdd/ http://en.wikipedia.org/wiki/Behaviour_driven_development http://behaviour-driven.org/Introduction 詳細に興味がある人のために、私たちは4人の小さなチームで約5つの大きなプロジェクトに取り組んでいます。BDDの「パイロットトライアル」は、最初は約2か月間、その後約4か月間実行されました。チームは、私がこの方法で作業を続ける必要があることを受け入れ、独自のトライアルを行うことになりました。トライアルが終了してから約2年間BDDを行っていますが、他の人は問題をうまく解決することができました。この問題について「対立」を強要するのではなく、私はチームを優しく説得して、集団の背後から抜け出し、少し時間をとる方法を探しています。

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