問題タブ [assert]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - デバッグ中に特定のコード領域のアサーションを無視するように Visual Studio 2005 を設定できますか?
これがシナリオです。会社の別のチームが開発したライブラリを使用している自分のアプリ (C/C++) をデバッグしています。コードがエッジ ケースを生成すると、アサーションが失敗します。アサーションが正しく定式化されていないため、ライブラリ関数は正常に機能しているため、苦痛ですが、続行する必要がある場所でこれらすべての中断が発生するため (ループ内にあるため、多くの場合)、実際に興味のあるものに到達できます。 . 他の理由で、デバッグ時にライブラリのデバッグ バージョンを使用する必要があります。他のチームは、次のリリースまでこれを修正しません (ねえ、私たちのマシンで動作します)。
このコード セクションによってアサートされたブレークポイントを無視するようにデバッガーに指示できますか (つまり、自動的に続行できますか)。
java - assert の使用に関するいくつかの (アンチ) パターン (Java など)
最後に、Stack Overflow で質問があります。:-)
主なターゲットは Java ですが、ほとんど言語にとらわれないと思います。ネイティブ アサートがない場合は、いつでもシミュレートできます。
私は Java で書かれた一連のソフトウェアを販売する会社で働いています。コードは古く、少なくとも Java 1.3 までさかのぼり、いくつかの場所でそれが示されています... これは大きなコード ベースであり、約 200 万行に及ぶため、一度にすべてをリファクタリングすることはできません。
最近、最新バージョンを Java 1.4 構文と JVM から Java 1.6 に切り替え、次のようないくつかの新機能を保守的に使用assert
しました (以前は DEBUG.ASSERT マクロを使用していました -- assert
1.4 で導入されたことは知っていますが、使用しませんでした)。以前)、ジェネリック (型指定されたコレクションのみ)、foreach ループ、列挙型など。
このトピックに関する記事をいくつか読んだことがありますが、私は assert の使用についてまだ少し緑色です。それでも、いくつかの使用法は私を困惑させ、私の常識を傷つけます... ^_^ それで、私が何かを修正したいのが正しいかどうか、またはそれが一般的な慣行に反するかどうかを確認するために、いくつか質問する必要があると思いました. 私は言葉が多いので、ざっと目を通すのが好きな人のために、質問を太字にしました。
参考までに、SO でassert javaを検索したところ、興味深いスレッドがいくつか見つかりましたが、正確な重複はないようです。
- Javaで「!= null」ステートメントを回避するには? nullチェックはどれくらいで十分ですか?変数が null かどうかを確認するだけの多くのアサートがあるため、非常に関連性があります。コードのいくつかの場所では、null オブジェクトが使用されています (例: return
new String[0]
) が、常にではありません。少なくともレガシーコードのメンテナンスのために、私たちはそれを受け入れなければなりません。 - Java assertions underusedにもいくつかの良い答えがあります。
- ああ、SO はいつ Debug.Assert() を使用する必要があるかという理由を示していますか? 質問も関連しています(重複を減らすための優れた機能です!)。
まず、今日私の質問を引き起こした主な問題:
(はい、私たちは MS の C/C++ スタイル/コード規則を使用しています。私もそれが好きです (同じバックグラウンドから来ました)! だから私たちを訴えてください。 )
まず、フォームは呼び出しassert()
の変換に由来します。DEBUG.ASSERT()
assert は言語構造であり、(もはやここでは) 関数呼び出しではないため、余分な括弧は嫌いです。私も嫌いですreturn (foo);
:-)
次に、アサートはここで不変条件をテストしません。むしろ、悪い値に対するガードとして使用されます。しかし、私が理解しているように、ここでは役に立ちません。アサーションは、コンパニオン文字列で文書化されていなくても、アサーションが有効な場合にのみ例外をスローします。だから私たちが持っているなら-ea
オプションを使用すると、通常の NullPointerException の代わりにアサーションがスローされるだけです。とにかく最高レベルで未チェックの例外をキャッチするため、これは最大の利点のようには見えません。
それらを取り除き、それで生活できると思いますか(つまり、Javaにそのような未確認の例外を発生させます)?(または、もちろん、他の場所で行われている可能性がある場合は、null 値に対してテストします)。
補足: 上記のスニペットで主張する必要がある場合は、ゲッターに対してではなく、ci 値に対して行います。ほとんどのゲッターが最適化/インライン化されている場合でも、確信が持てないため、2 回呼び出すことは避ける必要があります。
最後に参照されたスレッドで、パブリック メソッドはパラメーターの値に対してテストを使用する必要があり (パブリック API の使用)、プライベート メソッドは代わりにアサートに依存する必要があると誰かが言いました。いいアドバイス。
現在、どちらの種類のメソッドも、別のデータ ソースである外部入力をチェックする必要があります。すなわち。たとえば、ユーザー、データベース、ファイル、またはネットワークからのデータ。
私たちのコードでは、これらの値に対するアサートが見られます。私は常にこれらを実際のテストに変更するので、アサーションが無効になっていても機能します。これらは不変条件ではなく、適切に処理する必要があります。
たとえば、リレーションで使用される定数で満たされたデータベーステーブルなど、入力が定数であると想定される例外が1つだけあります。このテーブルが変更されても、対応するコードが更新されないと、プログラムが壊れます。
他の例外はありますか?
私が見た別の比較的頻繁な使用は、問題ないようです: スイッチのデフォルトで、または else if
すべての可能な値をテストする一連の最後で (これらのケースは、列挙型を使用する前にさかのぼります!)、多くの場合、assert false : "Unexpected value for stuff: " + stuff;
正規の Lookがあります。私(これらのケースは本番環境では発生しないはずです)、どう思いますか?(ここでは関係のない「スイッチなし、OOを使用する」というアドバイスを超えて)。
最後に、ここで見逃した便利なユースケースや厄介な落とし穴は他にありますか? (おそらく!)
unit-testing - 単体テスト中のアサートのデバッグのベスト プラクティス
単体テストを頻繁に使用すると、デバッグ アサートの使用が妨げられますか? テスト中のコードで発生するデバッグ アサートは、単体テストが存在してはならないか、デバッグ アサートが存在してはならないことを意味しているようです。「存在できるのは 1 つだけ」というのは合理的な原則のように思えます。これは一般的な方法ですか?それとも、単体テスト時にデバッグ アサートを無効にして、統合テストに使用できるようにしますか?
編集:「Assert」を debug assert に更新して、テスト中のコードの assert を、テストの実行後に状態をチェックする単体テストの行と区別しました。
また、ジレンマを示していると思われる例を次に示します。単体テストは、入力が有効であると主張する保護された関数に対して無効な入力を渡します。単体テストは存在すべきではありませんか? 公務ではありません。おそらく、入力をチェックするとパフォーマンスが低下するでしょうか?または、アサートが存在しない必要がありますか? 関数は非公開ではなく保護されているため、安全のために入力をチェックする必要があります。
sql - SQL 選択リストのブール式
MS SQL Server 2005 で単体テストを実行するために SQL Select を作成したいと考えています。基本的な考え方は次のとおりです。
「foo」列の値が「Result」の場合、true/1 の値が得られるという考えです。そうでない場合は、false/0 になります。
残念ながら、T-SQL はこの式を好みません。等号で窒息します。
SQL 選択リスト内の式を評価して、返される結果を取得する方法はありますか? (または、私が望む単体テストを達成する他の方法はありますか?)
編集:3つの素晴らしい回答、すべてCASEを中心に構築されています。彼は担当者が最も少なく、したがって最も必要としているため、私はフェイトシーフを受け入れます。:-) みんなありがとう。
c++ - アサート マクロのカスタマイズ
Windows/c++ では、アサーションを永久に無視するようにアサーション ダイアログ ボックスをカスタマイズしたいので、アサーションをより積極的に使用できます。正しい assert マクロを記述するのがいかに難しいかは理解していますが、これはしたくありません。ダイアログ コードをフックするだけです。これを行う簡単な方法 (または簡潔なハック) はありますか?
assert マクロの危険性に関する記事(googlecache)
更新: より積極的 => はるかに頻繁に使用し、クラッシュしないバグに使用します。アサーションを永遠に無視できるようにしたいので、ループでマイナーなバグ アサーションが発生しても、プロセスが効果的に停止することはありません。
c# - Assert.AreNotEqual と Assert.AreNotSame の違いは何ですか?
C#では、違いは何ですか
と
c# - BoostまたはSTLでカスタム文字列を表示できるC++アサーション?
私は本当に行きたいです:(C ++で)
C# XNA には、まさにこれを行うメソッドがあります。
ランタイムが「アサーション失敗」エラーだけでなく、意味のある完全なエラーを表示するように、これを行う方法はありますか?
c++ - C/C++ でアサートをリリース ビルドに入れる方法
出荷ビルドのみを実行する必要があり、問題が修正されたかどうかを確認するために、リリース ビルドの特定の条件でアサートする必要があります。どうすればいいのですか?
php - PHP で assert がそのように動作する理由を誰かが教えてくれますか?
PHP の assert ステートメントは、他のほとんどの言語とは異なります。
assert('return false');
実際に文字列を評価し、その結果 (false) をアサートします。
パラメーターを true と比較する代わりに、引数を調べるという追加の手順を実行し、引数が文字列である場合はそれを評価してから比較を実行します。
本当に奇妙です。
私の問題は、動作を理解することではありません。私の問題は、この動作の正当な理由を考え出すことです。あなたは今、思考の余分な精神的な仕事をしなければならないので... 「それは文字列に評価されますか?」.