gpt4 book ai didi

java - Sonar 规则 S2699 : Not all asserts are recognized as valid assertions

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:05:16 28 4
gpt4 key购买 nike

我们正在使用 Java 插件 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( same) , test10 (Mockitos verify in another method), test11test13 作为没有断言的方法。我很确定还有很多方法未被识别(是的,不幸的是,我们在我们的项目中使用了一堆不同的模拟/测试框架)。

现在,只要其中一个断言/验证未被识别,我们就开始//NOSONAR。有没有一种简单的方法可以将这些方法包含在内以被识别为有效断言?

最佳答案

您陈述的许多问题都是已知的,并且确实(以某种形式)标记为 FP:test1:当前流程分析忽略assert语句。参见 this post在小组中。

案例 test7、test8 和 test10 与缺乏跨过程分析有关:它们是有效案例,但当前流程不知道(例如)test7assert 是另一个方法的有效断言语句。参见 this post在小组中。

您的其他案例在 S2699 的测试中也会产生误报。我希望一旦 SonarSource 开发人员阅读此主题,他们将创建一张票来解决 test11/13 中的案例。但由于我不是他们的开发者,所以我当然不能保证这一点。

至于:

Is there an easy way to include these methods to be recognized as valid asserts?

不,有效断言是在 S2699 的代码中定义的,不是参数。你的一些案例需要更复杂的流程分析,而最后一对似乎只是归结为一些缺失的定义或过于严格的定义,但我没有深入探讨它们产生 FP 的原因。

关于java - Sonar 规则 S2699 : Not all asserts are recognized as valid assertions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39178348/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com