assert
作为标准代码的一部分使用而不是仅仅用于调试目的,是否存在性能或代码维护问题?
是
assert x >= 0, 'x is less than zero'
Run Code Online (Sandbox Code Playgroud)
好或坏比
if x < 0:
raise Exception, 'x is less than zero'
Run Code Online (Sandbox Code Playgroud)另外,有没有办法设置业务规则if x < 0 raise error
,总是在没有try/except/finally
这样的情况下进行检查,如果在整个代码中的任何时候x
小于0都会引发错误,就像你assert x < 0
在函数的开头设置一样,在函数内的任何地方哪里x
变得少于0则引发异常?
我已经用@Test
注释编写了一些JUnit测试.如果我的测试方法抛出一个已检查的异常,并且我想要将该消息与异常一起断言,那么有没有办法使用JUnit @Test
注释?AFAIK,JUnit 4.7不提供此功能,但未来的版本是否提供此功能?我知道在.NET中你可以断言消息和异常类.寻找Java世界中的类似功能.
这就是我要的:
@Test (expected = RuntimeException.class, message = "Employee ID is null")
public void shouldThrowRuntimeExceptionWhenEmployeeIDisNull() {}
Run Code Online (Sandbox Code Playgroud) 怎么assert
办?例如在函数中:
private static int charAt(String s, int d) {
assert d >= 0 && d <= s.length();
if (d == s.length()) return -1;
return s.charAt(d);
}
Run Code Online (Sandbox Code Playgroud) 大多数时候我会使用异常来检查代码中的条件,我想知道什么时候使用断言是合适的时间?
例如,
Group group=null;
try{
group = service().getGroup("abc");
}catch(Exception e){
//I dont log error because I know whenever error occur mean group not found
}
if(group !=null)
{
//do something
}
Run Code Online (Sandbox Code Playgroud)
你能指出断言如何适应这里吗?我应该使用断言吗?
看起来我从不在生产代码中使用断言,只在单元测试中看到断言.我知道在大多数情况下,我可以使用异常来执行上面的检查,但我想知道"专业"的适当方式.
是否有一个与NUnit平行的jUnit CollectionAssert
?
什么是在MINITEST的检查异常消息预期的语法assert_raises
/ must_raise
?
我正在尝试做出如下所示的断言,其中"Foo"
是预期的错误消息:
proc { bar.do_it }.must_raise RuntimeError.new("Foo")
Run Code Online (Sandbox Code Playgroud) 我正在实现一个除法和征服多项式算法,所以我可以将它与OpenCL实现进行基准测试,但我无法开始malloc
工作.当我运行程序时,它会分配一堆东西,检查一些东西,然后发送size/2
给算法.然后,当我malloc
再次点击它时,它会吐出这个:
malloc.c:3096:sYSMALLOc:断言`(old_top ==(((mbinptr)(((char*)&((av) - > bins [((1) - 1)*2])) - __builtin_offsetof(struct malloc_chunk,fd))))&& old_size == 0)|| ((unsigned long)(old_size)> =(unsigned long)(((__ builtin_offsetof(struct malloc_chunk,fd_nextsize))+((2*(sizeof(size_t))) - 1))~~((2*(sizeof) (size_t))) - 1)))&&((old_top) - > size&0x1)&&((unsigned long)old_end&pagemask)== 0)'失败.中止
有问题的一行是:
int *mult(int size, int *a, int *b) {
int *out,i, j, *tmp1, *tmp2, *tmp3, *tmpa1, *tmpa2, *tmpb1, *tmpb2,d, *res1, *res2;
fprintf(stdout, "size: %d\n", size);
out = (int *)malloc(sizeof(int) * size * 2);
}
Run Code Online (Sandbox Code Playgroud)
我用a检查了大小fprintf
,它是一个正整数(此时通常为50).我尝试malloc
用普通号码打电话,但我仍然得到错误.我只是对正在发生的事情感到难过,到目前为止我发现的谷歌没有任何帮助.
有什么想法发生了什么?我正在试图弄清楚如何编译一个更新的GCC,如果它是编译器错误,但我真的怀疑它.
我想知道为什么assert
关键字在Java中如此少用?我几乎从未见过它们,但我认为它们是个好主意.我当然更喜欢简洁:
assert param != null : "Param cannot be null";
Run Code Online (Sandbox Code Playgroud)
对于冗长的:
if (param == null) {
throw new IllegalArgumentException("Param cannot be null");
}
Run Code Online (Sandbox Code Playgroud)
我怀疑是因为他们未得到充分利用
我认为这应该是一个非常简单的问题.但不知何故,我无法在谷歌找到答案.
假设我有2个字符串列表.首先包含"字符串A"和"字符串B",第二个包含"字符串B"和"字符串A"(按顺序通知差异).我想用JUnit测试它们以检查它们是否包含完全相同的字符串.
是否有任何断言检查忽略顺序的字符串的相等性?对于给定的示例org.junit.Assert.assertEquals抛出AssertionError
java.lang.AssertionError: expected:<[String A, String B]> but was:<[String B, String A]>
Run Code Online (Sandbox Code Playgroud)
解决方法是首先对列表进行排序,然后将它们传递给断言.但我希望我的代码尽可能简单和干净.
我使用Hamcrest 1.3,JUnit 4.11,Mockito 1.9.5.
在我编写的测试中,如果我想断言WebElement存在于页面上,我可以做一个简单的事情:
driver.findElement(By.linkText("Test Search"));
Run Code Online (Sandbox Code Playgroud)
如果它存在,它将通过,如果它不存在它将弹出.但现在我想断言的链接本身并不存在.我不清楚如何做到这一点,因为上面的代码不返回布尔值.
编辑这就是我提出自己修复的方法,我想知道是否还有更好的方法.
public static void assertLinkNotPresent (WebDriver driver, String text) throws Exception {
List<WebElement> bob = driver.findElements(By.linkText(text));
if (bob.isEmpty() == false) {
throw new Exception (text + " (Link is present)");
}
}
Run Code Online (Sandbox Code Playgroud)