2017-10-20 14 views
1

アサーションをプロダクションコードで使用するためのベストプラクティスを見つけようとしていますが、私が見つけた情報がどれほど少ないかに驚いています。生産コードのNUnitアサーション

第1に、本番コードにアサート文を入れることは一般に受け入れられますか?

第2に、ビルドされたDebug.Assert for .NETは本質的に本番コードで自動的に無効になり、実際には開発環境でのみ実行されることを読んでいます。それは本当ですか?NUnitにもこの機能が組み込まれていますか?

たとえば、実動コードで次のようなことがあるとしたら、アサーションは無視されますか?

+0

試しましたか?結果は何でしたか? – mason

+0

私は生産コードでNUnitアサーションを使用しません。チェックしたい場合は、独自の例外を発生させるか、コード契約を使用することができます。この場合、 'a'のクラスは' GLPeriodDateTime'が必ずnullにならないように見えます。 – Lee

答えて

2

実動コードではNUnitアサーションを使用しないでください。アサーションが失敗した場合、NUnitアサーションは常に例外をスローします。 NUnitは、DebugまたはRelease(Production)で動作しているかどうかをチェックしません。 NUnitアサーションは、NUnitテストで使用するように設計されています。

実際のコードでのアサーションについては、Debug.Assertを使用してください。それはあまり特集されていませんが、それはリリースモードでコンパイルされるので、あなたのアプリが稼動中にクラッシュすることはありません。

1

私は2番目の質問から始めます。いいえ、アサーションは無視されません。 C#プロジェクトのビルド構成では、ビルドがDEBUG定数を無視するように指定できます。これは、Debug.Assertステートメントが削除される方法です(Visual Studioはデフォルトでこのようにビルド設定を行います)。

最初の質問では、NUnitアサーションをプロダクションコードで使用することは容認できません。アサーションが例外やその他のエラー状態を持っていると、どのような利点がありますか?

GLPeriodDateTimeは、ユーザーの間違いなしでも問題が解決される可能性があります。ユーザーに不具合がある場合は、ユーザーにエラーを通知するためのより良い方法(例外など)があります。アサーションは、開発者が使用するためのものです。

+0

ありがとうございました。私は、それが引き出されるフィールドがユーザーの入力に必要であるため、これまでにはnullになるとは予想していません。私はまだ開発者のためのチェックが欲しいですが、レガシーシステムからインポートされるデータもあるし、常にそのデータを持っていなければチェックしないほうが賢明ではないためです。私は、開発者に知ってもらうために組み込みのアサーションを使用すると思いますが、ユーザーには気にしません。 –

3

NUnitリリースビルドでテストする必要があるため、アサーションはリリースビルドで機能する必要があります。いくつかの理由から、実動コードにNUnitアサーションを含めるべきではありません。

  1. NUnitのアサーション(だけでなく、Debug.Assertのは)あなたコード内の問題を検出することを意図しています。アプリケーションに提供される不正なデータは、通常のアプリケーションフローの一部であり、実動コードによって検出され処理される必要があります。

  2. アサーションは、結果の意味を知っているNUnitの制御下で動作するように意図されています。たとえば、いくつかのアサーションは失敗時に例外をスローし、他のアサーションは失敗します。あなたはそれを有効に使うために違いを知る必要があります。

  3. などの例外処理を含む不正なデータを扱うの他、十分に確立方法、カスタムエラーメッセージが、あなたはNUnitのテストとは別にNUnitの制約構文を使用しようとしている、

  4. ほとんどの場合があります。これは素晴らしい構文です。いくつかの人々は、別のパッケージとして分割するように私たちに依頼しています。私たちがそれをしたなら、あなたはそれを使うことができましたが、残念ながら私たちはまだありません。

+0

もう一つの素晴らしい答え、ありがとう。 –