我是JUnit
的新手。我正在JUnit
报告中修复SonarQube
,并且还会增加Junit
代码覆盖率。我遇到了class
,其中没有@Test
annotation
。抛出的异常如下:
No runnable methods java.lang.Exception: No runnable methods at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
下面的测试课程:
public class TestLimitPrice {
@BeforeClass
public static void setUpBeforeClass() {
JndiDataManager.init();
}
private LimitPriceBean limitPrice;
private LimitPriceValidator validator;
@Before
public void setUp() {
limitPrice = new LimitPriceBean();
validator = new LimitPriceValidator(limitPrice);
}}
我的问题是:
Sonar Report
中,每个JUnit
都必须至少有一个@Test
通过吗? @Test
是否是提高代码覆盖率的好方法?assertEquals(true,true)
是不错的做法还是应该避免?更新
答案 0 :(得分:3)
我的问题是:
- 在声纳报告中,每个JUnit都必须至少有一个 @Test通过?
我不明白这个问题。
- 将@Test清空是增加代码的好方法 报道?
不,有两个原因。
首先,如果@Test
方法确实为空,那么就不可能增加覆盖率。因此,我们假设您有@Test
方法 执行某些程序代码,但不包含断言。
在这种情况下,您通过在@Test
中执行程序代码来增加测试覆盖率,但是通过不对该代码的预期结果/输出做出任何声明(断言)来完全颠覆测试的目的。假设我已经
public int addTwoAndTwo() {
return 2+2;
}
并进行相应的测试
@Test public void testAddTwoAndTwo() {
MyClass mc = new MyClass();
my.addTwoAndTwo(); // this method now "covered"
}
现在addTwoAndTwo
被“覆盖”了我应该能够自信地维护它,只要单元测试继续通过,我就没有破坏任何东西。
让我们这样做。我的新版本是:
public int addTwoAndTwo() {
return 42;
}
在那次改变之后,我的单元测试仍然成功,所以一切都必须好,对吧?嗯......不。这就是你需要断言的原因:
@Test public void testAddTwoAndTwo() {
MyClass mc = new MyClass();
assertThat(mc.addTwoAndTwo()).isEqualTo(4); // this method now truly covered
}
- 如果没有执行任何测试用例,那么 assertEquals(true,true)是好的做法还是应该避免?
这个问题的答案现在应该是显而易见的,但要明确,不要这样做。