我们正在使用Java Plugin 4.1运行Sonarqube 5.6.1,并在使用Sonar规则S2699时遇到了一些麻烦(测试应包括断言)。
使用此示例测试类
import mypackage.Citit1543Dummy;
import mypackage.Citit1543OtherDummy;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.mockito.MockitoAnnotations;
import java.util.Arrays;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.isIn;
import static org.hamcrest.Matchers.lessThan;
import static org.hamcrest.core.IsNot.not;
import static org.mockito.Matchers.notNull;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.junit.Assert.assertThat;
public class Citit1543Test {
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
}
@Test
public void test1() {
assert true;
}
@Test
public void test2() {
Assert.assertTrue(1 > (2-3));
}
@Test
public void test3() {
Assert.assertFalse(1 > (100-1));
}
@Test
public void test4() {
Assert.assertThat("test", 1, is(1));
}
@Test
public void test5() {
Assert.assertArrayEquals(new String[0], new String[0]);
}
@Test
public void test6() {
Assert.assertEquals(1 > 0, true);
}
@Test
public void test7() { // asserts in another method
test7asserts(1, 1);
}
private void test7asserts(int a, int b) {
Assert.assertTrue(a == b);
}
@Test
public void test8() {
test8asserts(1, 2);
}
private void test8asserts(int a, int b) {
Assert.assertNotSame(a, b);
}
@Test
public void test9() {
Citit1543Dummy dummy = new Citit1543Dummy();
dummy.otherDummy = mock(Citit1543OtherDummy.class);
dummy.doSomething();
verify(dummy.otherDummy, times(1)).doSomething();
}
@Test
public void test10() {
Citit1543Dummy dummy = new Citit1543Dummy();
dummy.otherDummy = mock(Citit1543OtherDummy.class);
dummy.doSomething();
test10verifies(dummy.otherDummy);
}
private void test10verifies(Citit1543OtherDummy otherDummy) {
verify(otherDummy, times(1)).doSomething();
}
@Test
public void test11() {
Assert.assertThat("test", "", not(1));
}
@Test
public void test12() {
Assert.assertThat("test", 1, lessThan(2));
}
@Test
public void test13() {
Long[] arr = new Long[] { 1L, 2L, 3L, 4L };
assertThat("Just testing", arr, is(new Long[] {
1L, 2L, 3L, 4L
}));
}
}
我们的Sonarqube实例将测试用例
test1
(无法识别断言),test7
(在另一种方法中断言),test8
(相同),test10
(在另一种方法中为Mockitos verify
),test11
和test13
标记为没有断言的方法。我非常确定还有很多未被识别的方法(是的,不幸的是,我们在项目中使用了许多不同的模拟/测试框架)。现在,无论何时未确认到一个断言/验证,我们都开始使用
//NOSONAR
。有没有简单的方法可以将这些方法包括为有效的断言?
最佳答案
您提到的许多问题都是已知的,并且确实(以某种形式)标记为FP:
test1:当前流分析将忽略断言语句。请参见this post。
案例test7,test8和test10与缺乏跨过程分析有关:它们是有效的案例,但是当前流程不知道(例如)test7assert是另一种方法的有效断言语句。请参见this post。
您的其他情况在S2699的测试中也会产生误报。我希望SonarSource开发人员阅读此主题后,他们将创建票证以解决test11/13中的问题。但是因为我不是他们的开发者,所以我当然不能保证。
关于:
不,有效的断言在S2699的代码中定义,而不是参数。您的某些情况将需要进行更复杂的流程分析,而最后几个似乎只是归结为一些缺少的定义或过于严格的定义,但是我没有深入探讨它们产生FP的原因。
关于java - Sonar 规则S2699 : Not all asserts are recognized as valid assertions,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39178348/