タグ付けされた質問 「assertions」

3
アサートまたは単体テストはより重要ですか?
アサートと単体テストの両方は、コードベースのドキュメントとして、またバグを発見する手段として機能します。主な違いは、アサートが健全性チェックとして機能し、実際の入力を確認するのに対して、ユニットテストは特定のシミュレートされた入力で実行され、明確に定義された単一の「正しい答え」に対するテストです。正当性を検証する主な手段として、アサーションと単体テストを使用する相対的なメリットは何ですか?どちらをもっと強調すべきだと思いますか?

4
アサーションを使用するか、例外をスローするか?
多くの場合、関数を書くときは、そのようなエラーをできるだけ早く検出するために、入力を有効にする必要があります(これらは前提条件と呼ばれます)。前提条件が失敗すると、常に例外がスローされます。しかし、これがベストプラクティスであるかどうか、そしてそうでない場合はアサーションがより適切かどうかを疑い始めています。 それで、いつアサーションを使用するのが適切であり、いつ例外をスローするのが適切であるのか、どちらを行う必要がありますか?

9
あまりにも多くのアサートを書くことは可能ですか?
私は執筆の大ファンです assert開発中に発生する可能性のあるケースをキャッチする方法としてC ++コードでチェック。プログラムのロジックバグが原因で発生する可能性があります。これは一般的に良い習慣です。 しかし、私が書いたいくつかの関数(複雑なクラスの一部である)には5つ以上のアサートがあることに気づきました。それぞれが関数の事前条件と事後条件について考える必要があり、それらは本当にバグをキャッチするのに役立つので、それはまだ素晴らしいと思います。ただし、多数のチェックが必要な場合にロジックエラーをキャッチするためのより良いパラダイムがあるかどうかを尋ねるために、これをそこに置きたかっただけです。 Emacsのコメント:Emacsが私の選択のIDEであるため、アサートステートメントを少しグレー表示にして、提供できる混乱を軽減します。.emacsファイルに追加するものは次のとおりです。 ; gray out the "assert(...)" wrapper (add-hook 'c-mode-common-hook (lambda () (font-lock-add-keywords nil '(("\\<\\(assert\(.*\);\\)" 1 '(:foreground "#444444") t))))) ; gray out the stuff inside parenthesis with a slightly lighter color (add-hook 'c-mode-common-hook (lambda () (font-lock-add-keywords nil '(("\\<assert\\(\(.*\);\\)" 1 '(:foreground "#666666") t)))))


8
リリースビルドにアサーションがあるべきか
assertC ++ のデフォルトの動作は、リリースビルドでは何もしないことです。これはパフォーマンス上の理由で、おそらくユーザーが厄介なエラーメッセージを表示しないようにするために行われたものと思われます。 ただし、assert不変式が壊れているためにアプリケーションがさらに悪い方法でクラッシュする可能性があるため、が発生したが無効になった状況はさらに面倒だと主張します。 さらに、パフォーマンスに関する議論は、それが測定可能な問題である場合にのみカウントされます。assert私のコードのほとんどは、より複雑ではありません assert(ptr != nullptr); ほとんどのコードにわずかな影響しか与えません。 これは私に質問を導きます:アサーション(特定の実装ではなく概念を意味する)はリリースビルドでアクティブにする必要がありますか?何故なの)? この質問は、リリースビルドでアサートを有効にする方法ではないことに注意してください(#undef _NDEBUG自己定義のアサート実装を使用するなど)。さらに、サードパーティ/標準ライブラリコードでアサートを有効にすることではなく、私が制御するコードで有効にします。

9
アサーションコードの匂いが多すぎますか?
私は本当に単体テストとTDDに夢中になりました-私はテストに感染しています。 ただし、ユニットテストは通常​​、パブリックメソッドに使用されます。ただし、プライベートメソッドでもいくつかの仮定(アサーション)をテストする必要がある場合があります。これは、それらの一部が "危険"であり、リファクタリングがそれ以上役に立たないためです。(フレームワークをテストすることでプライベートメソッドをテストできることはわかっています)。 したがって、プライベートメソッドの最初の行と最後の行の両方がアサーションであることが私の習慣になりました。 ただし、パブリックメソッド(およびプライベートメソッド)でアサーションを使用する傾向があることに注意してください。パブリックメソッドの前提条件は、ユニットテストフレームワークによって外部からテストされるため、これは「テストの重複」でしょうか。 誰かがあまりにも多くのアサーションをコードの匂いだと考えることはできますか?

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

5
エラーのチェックと処理を改善するにはどうすればよいですか?
最近、私は適切なチェック量と適切な方法とは何かを理解するのに苦労しています。 これに関していくつか質問があります。 エラー(不正な入力、不正な状態など)をチェックする適切な方法は何ですか?エラーを明示的にチェックするか、最終コードから最適化できるアサートなどの関数を使用する方が良いでしょうか?とにかくほとんどの状況で実行されるべきではない多くの余分なコードでプログラムを乱雑に明示的にチェックしたい気がします-そして、ほとんどのエラーは言うまでもなく打ち切り/終了の失敗に終わります。中止するために、明示的なチェックで関数を混乱させるのはなぜですか?私はアサートとエラーの明示的なチェックを探しましたが、どちらを行うべきかを本当に説明するものはほとんど見つかりませんでした。 ほとんどの人は、「アサートを使用して論理エラーをチェックし、明示的なチェックを使用して他の障害をチェックします」と言います。しかし、これは私たちをそれほど遠くに連れて行っていないようです。これが実現可能であると言えますか: Malloc returning null, check explictly API user inserting odd input for functions, use asserts これにより、エラーチェックが改善されますか?他に何ができますか?私は本当に、より良い「プロフェッショナルな」コードを改善し、書きたいと思っています。
13 c  testing  assertions 

3
Python-assert vs if&return
テキストファイルに対して何かを行うスクリプトを書いています(ただし、それは私の質問とは無関係です)。そのため、ファイルに何かを行う前に、ファイルが存在するかどうかを確認します。私はこれを行うことができますが、問題はありませんが、問題は美学の問題です。 これは、同じことを2つの異なる方法で実装する私のコードです。 def modify_file(filename): assert os.path.isfile(filename), 'file does NOT exist.' Traceback (most recent call last): File "clean_files.py", line 15, in <module> print(clean_file('tes3t.txt')) File "clean_files.py", line 8, in clean_file assert os.path.isfile(filename), 'file does NOT exist.' AssertionError: file does NOT exist. または: def modify_file(filename): if not os.path.isfile(filename): return 'file does NOT exist.' …

1
Pythonでのダックタイピング、データ検証、アサーティブプログラミング
アヒルのタイピングについて: アヒルの型付けは、メソッドと関数の本体の引数の型を常にテストするのではなく、ドキュメント、明確なコード、および正しい使用を確実にするためのテストに依存することによって支援されます。 引数の検証について(EAFP:許可よりも許しを求める方が簡単です)。ここからの適応例: ...それを行うにはよりpythonicと考えられています: def my_method(self, key): try: value = self.a_dict[member] except TypeError: # do something else これは、コードを使用する他のユーザーが実際の辞書やサブクラスを使用する必要がないことを意味します。マッピングインターフェースを実装する任意のオブジェクトを使用できます。 残念ながら、実際にはそれほど簡単ではありません。上記の例のメンバーが整数の場合はどうなりますか?整数は不変です。そのため、それらを辞書のキーとして使用することは完全に合理的です。ただし、シーケンス型オブジェクトのインデックス付けにも使用されます。メンバーが偶然整数の場合、例2ではリストと文字列、および辞書を通過できます。 断定的なプログラミングについて: アサーションは、プログラムの内部状態がプログラマが期待したとおりであることを確認する体系的な方法であり、バグをキャッチすることを目的としています。特に、コードの記述中に行われた誤った仮定や、他のプログラマによるインターフェイスの悪用をキャッチするのに適しています。さらに、プログラマーの想定を明確にすることで、インラインドキュメントとしてある程度の役割を果たすことができます。(「明示的は暗黙的よりも優れています。」) 上記の概念は競合する場合があるため、データの検証をまったく行わないか、強力な検証を行うか、またはアサートを使用するかを選択するときは、次の要因を考慮します。 強力な検証。強力な検証とはApiError、たとえばカスタム例外を発生させることです。関数/メソッドがパブリックAPIの一部である場合は、引数を検証して、予期しないタイプに関する適切なエラーメッセージを表示することをお勧めします。タイプをチェックすることで、のみを使用することを意味するのではなくisinstance、渡されたオブジェクトが必要なインターフェース(ダックタイピング)をサポートするかどうかも確認します。APIをドキュメント化し、予想されるタイプを指定し、ユーザーが関数を予期しない方法で使用する可能性がある場合、想定を確認すると安全です。私は通常使用isinstanceし、後で他のタイプやアヒルをサポートしたい場合は、検証ロジックを変更します。 断定的なプログラミング。私のコードが新しい場合、私はアサートをたくさん使います。これに関するあなたのアドバイスは何ですか?後でコードからアサーションを削除しますか? 私の関数/メソッドがAPIの一部ではないが、自分で記述、調査、テストしていない他のコードに引数の一部を渡す場合、呼び出されたインターフェイスに従って多くのアサーションを実行します。これの背後にある私のロジック-私のコードでよりよく失敗し、スタックトレースのどこかで10レベル深く、理解できないエラーが発生するため、多くのデバッグを行い、とにかくアサートをコードに追加する必要があります。 型/値検証をいつ使用するべきか、または使用しないべきかについてのコメントとアドバイスは断言しますか?質問の構成が最適ではないため申し訳ありません。 たとえばCustomer、SQLAlchemy宣言モデルである次の関数を考えてみます。 def add_customer(self, customer): """Save new customer into the database. @param customer: Customer instance, whose id is None @return: merged into global session customer …

2
コードコントラクト/アサート:重複チェックとは?
私はアサート、コントラクト、または私が使用している言語で利用可能なあらゆる種類のチェックを書くことの大ファンです。少し気になることの1つは、重複チェックを処理するための一般的な方法が何なのかがわからないことです。 状況例:最初に次の関数を記述します void DoSomething( object obj ) { Contract.Requires<ArgumentNullException>( obj != null ); //code using obj } その後数時間後、最初の関数を呼び出す別の関数を記述します。すべてがまだメモリ内にあるのでDoSomething、nullオブジェクトを既にチェックしていることがわかっているので、コントラクトを複製しないことにします。 void DoSomethingElse( object obj ) { //no Requires here: DoSomething will do that already DoSomething( obj ); //code using obj } 明らかな問題:objがnullでないことを確認するためにDoSomethingElse依存しDoSomethingています。したがってDoSomething、これ以上チェックしないことを決定する必要があります。または、別の関数を使用する場合、objはもうチェックされない可能性があります。結局、私はこの実装を書くことにつながります: void DoSomethingElse( object obj ) { Contract.Requires<ArgumentNullException>( obj != null …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.