我正在使用Visual Studio,开发本机应用程序,我在使用__asm int 3或__debugbreak放置的代码中有一个程序断点(断言).有时当我点击它时,我想禁用它,以便在同一个调试会话中的连续命中不再进入调试器.我怎样才能做到这一点?
我只需要运行ship build,我需要在发布版本中断言某些条件以查看问题是否已修复.我该怎么做?
假设我们通过使用预期结果对象的属性断言结果对象的所有属性的相等性来测试方法的结果.我们应该实现equals方法并使用Assert.AreEqual(expectedResult,actualResult)......但是equals可能意味着生产代码中存在不同的东西.
哪种是最佳做法?
要么
在我的脑海中,我可以想到4种方法来检查空参数:
Debug.Assert(context != null);
Contract.Assert(context != null);
Contract.Requires(context != null);
if (context == null) throw new ArgumentNullException("context");
Run Code Online (Sandbox Code Playgroud)
我总是使用最后一种方法,但我刚看到一个使用过的代码片段,Contract.Requires我对此并不熟悉.每种方法有哪些优点/缺点?还有其他方法吗?
在VS2010 w/Resharper中,
Contract.Assert 警告我表达式总是正确的(它怎么知道,我不太确定...... HttpContext不能为空吗?), Contract.Requires 变得淡出它告诉我编译器不会调用该方法(我假设因为前一个原因,它永远不会为null),并且 context != null以下所有代码都会逐渐消失,它会告诉我代码是启发式无法访问的.因此,似乎最后3种方法在VS静态检查器中内置了某种智能,并且Debug.Assert只是愚蠢.
有什么区别:
Assert.Equals 和 Assert.AreEqualAssert.NotNull 和 Assert.IsNotNull?
如何在groovy中显示值是真还是假?我正在使用Eclipse作为我的IDE.
assert 4 * ( 2 + 3 ) - 6 == 14 //integers only
Run Code Online (Sandbox Code Playgroud)
而且我也不理解Groovy中的"断言".它是否像Java中的if()语句/ boolean?
"断言"在Groovy中扮演什么角色?
当在Windows上使用Visual C++断言失败时,调试器会停止,显示消息,然后让您继续(或者,如果没有运行调试会话,则提供为您启动Visual Studio).
在Linux上,似乎assert()的默认行为是显示错误并退出程序.由于我的所有断言都通过宏,我试图使用信号来解决这个问题,比如
#define ASSERT(TEST) if(!(TEST)) raise(SIGSTOP);
Run Code Online (Sandbox Code Playgroud)
但是虽然GDB(通过KDevelop)停在正确的位置,但我似乎无法继续通过信号,并且在GDB内手动发送信号只会让我感到不知所措,无论是GDB还是调试过程都无法控制.
每个C程序员都可以使用这个众所周知的宏来确定数组中元素的数量:
#define NUM_ELEMS(a) (sizeof(a)/sizeof 0[a])
Run Code Online (Sandbox Code Playgroud)
这是一个典型的用例:
int numbers[] = {2, 3, 5, 7, 11, 13, 17, 19};
printf("%lu\n", NUM_ELEMS(numbers)); // 8, as expected
Run Code Online (Sandbox Code Playgroud)
但是,没有什么能阻止程序员意外地传递指针而不是数组:
int * pointer = numbers;
printf("%lu\n", NUM_ELEMS(pointer));
Run Code Online (Sandbox Code Playgroud)
在我的系统上,这打印2,因为显然,指针是整数的两倍.我想过如何防止程序员错误地传递指针,我找到了一个解决方案:
#define NUM_ELEMS(a) (assert((void*)&(a) == (void*)(a)), (sizeof(a)/sizeof 0[a]))
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为指向数组的指针与指向其第一个元素的指针具有相同的值.如果改为传递指针,指针将与指向自身的指针进行比较,这几乎总是假的.(唯一的例外是递归的void指针,也就是指向自身的void指针.我可以忍受它.)
意外地传递指针而不是数组现在在运行时触发错误:
Assertion `(void*)&(pointer) == (void*)(pointer)' failed.
Run Code Online (Sandbox Code Playgroud)
太好了!现在我有几个问题:
我的用法是assert逗号表达式的左操作数有效标准C吗?也就是说,标准是否允许我assert用作表达式?对不起,如果这是一个愚蠢的问题:)
可以在编译时以某种方式完成检查吗?
我的C编译器认为这int b[NUM_ELEMS(a)];是一个VLA.有没有办法说服他呢?
我是第一个想到这个吗?如果是这样,我可以期待在天堂等待多少处女?:)
我有功能,有时返回NaNs float('nan')(我不使用numpy).
我怎么为它写一个测试,因为
assertEqual(nan_value, float('nan'))
Run Code Online (Sandbox Code Playgroud)
就像float('nan') == float('nan')总是假的.可能有类似的东西assertIsNan吗?我找不到任何关于它的东西......
assert ×10
c ×3
unit-testing ×3
c++ ×2
arrays ×1
assertions ×1
c# ×1
constraints ×1
debugbreak ×1
debugging ×1
equals ×1
gdb ×1
groovy ×1
javascript ×1
linux ×1
nan ×1
node.js ×1
nunit ×1
pointers ×1
python ×1
release ×1
sizeof ×1
x86 ×1