如果我使用assert()并且断言失败assert()则会调用abort(),突然结束正在运行的程序.我的生产代码中负担不起.有没有办法在运行时断言但能够捕获失败的断言,所以我有机会优雅地处理它们?
我最近经历了一些代码,并考虑是否需要小心处理Debug.Assert语句中的表达式,例如昂贵的操作或带有副作用的表达式.但是,看起来编译器在完全删除Assert语句和内部表达式方面非常聪明.
例如,以下内容仅在调试版本上打印:
static void Main(string[] args)
{
Debug.Assert(SideEffect());
}
private static bool SideEffect()
{
Console.WriteLine("Side effect!");
return true;
}
Run Code Online (Sandbox Code Playgroud)
这会抱怨o在发布版本初始化之前使用它:
static void Main(string[] args)
{
object o;
Debug.Assert(Initialize(out o));
o.ToString();
}
private static bool Initialize(out object o)
{
o = new object();
return true;
}
Run Code Online (Sandbox Code Playgroud)
它甚至可以表达这样的表达(在两种情况下打印"After"):
static void Main(string[] args)
{
if (false) Debug.Assert(true);
Console.WriteLine("After");
}
Run Code Online (Sandbox Code Playgroud)
我对编译器的智能程度以及Debug.Assert删除时正确检测案例的能力感到有些惊讶.所以,它让我好奇..
if语句.System.Diagnostics.Debug这里的类是特殊的,还是可以用类似的处理来构建自己的方法?我正在尝试为我的安装程序创建回归测试.回归测试是用Python编写的脚本.测试检查是否在正确的位置安装了正确的文件.
有没有办法断言文件/文件夹存在?我收到以下代码的AssertionError错误:
assert os.path.exists(LOCAL_INSTALL_DIR) == 1
Run Code Online (Sandbox Code Playgroud)
为什么我会收到此错误,如何解决?我的功能:
def check_installation_files_exist():
assert os.path.exists(LOCAL_INSTALL_DIR) == 1
assert os.path.exists(INSTALL_DIR) == 1
correct_install_files = normalise_file_names( os.listdir( LOCAL_INSTALL_DIR ) )
installed_files = normalise_file_names( os.listdir( INSTALL_DIR ) )
Run Code Online (Sandbox Code Playgroud) 为什么我们不能将断言用于公共方法?
我在某处读过
"断言在公共方法中是不合适的,因为该方法保证它总是强制执行参数检查.公共方法必须检查其参数是否启用断言.此外,断言构造不会抛出指定类型的异常.它只能抛出一个
AssertionError".
那么,它也不适用于私人方法吗?
我没有清楚地理解上述陈述
我们应该assert()具体使用这个功能的地方有哪些?如果确定整数值是否大于零或指针是否为空,我们可以简单地使用私有函数来检查它.在这种情况下,我们应该在哪里使用assert()自定义书面支票?
什么是以下MSTest代码的xUnit等价物:
Assert.Inconclusive("Reason");
Run Code Online (Sandbox Code Playgroud)
这给出了黄色测试结果,而不是通常的绿色或红色.我想断言由于某些条件而无法运行测试,并且在满足这些条件后应该重新运行测试.
我收到以下错误:
Both assertEquals(Object, Object) in Assert and assertEquals(double, double) in Assert match
Run Code Online (Sandbox Code Playgroud)
对于我的Junit测试中的这行代码,请注意getScore()返回一个double:
assertEquals(2.5, person.getScore());
Run Code Online (Sandbox Code Playgroud)
这是我的断言导入:
import static org.junit.Assert.*;
Run Code Online (Sandbox Code Playgroud)
造成这种情况的原因是什么?如何解决这个问题?
我有一个宏在我的代码中使用,在调试模式下:
#define contract(condition) \
if (!(condition)) \
throw exception("a contract has been violated");
Run Code Online (Sandbox Code Playgroud)
...但在发布模式下:
#define contract(condition) \
if (!(condition)) \
__builtin_unreachable();
Run Code Online (Sandbox Code Playgroud)
这样做的原因assert()是,在发布版本中,由于UB传播,编译器可以大量优化代码.
例如,使用以下代码进行测试:
int foo(int i) {
contract(i == 1);
return i;
}
// ...
foo(0);
Run Code Online (Sandbox Code Playgroud)
...在调试模式下抛出异常,但return 1;在释放模式下为无条件生成程序集:
foo(int):
mov eax, 1
ret
Run Code Online (Sandbox Code Playgroud)
条件以及依赖它的一切都已经过优化.
我的问题出现在更复杂的条件下.当编译器无法证明条件没有副作用时,它不会将其优化出来,与不使用合同相比,这是一个严重的惩罚.
有没有办法表明合同中的条件没有副作用,所以总是优化出来?
我想问你的问题很广泛但同时它非常具体.首先,我必须说,我最感兴趣的是适用于.net环境的答案.
好吧,我想提高我生成的代码级别.现在我主要使用TDD和静态代码分析来确保我的代码是正确的.最近我听了Dino Esposito关于代码合同的演讲,现在我想将它与其他技术结合使用.在听Dino的同时我也回忆起了Debug.Assert()和Trace.Assert().
具体来说,我会问几个问题:
Debug.Assert()吗?什么时候可以使用它们?(例如,请注意.net中的不变量仅在公共方法/属性出口处进行检查.那么,通过简单方法在方法中间进行一些检查是否可以Assert()?)