[英]JUnit: No runnable methods
我是JUnit
新手。 我正在SonarQube
报告中修复JUnit
,并且还增加了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)
是好的做法还是应该避免? 更新
我的问题是:
- 在声纳报告中,每个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)是好的做法还是应该避免?
这个问题的答案现在应该是显而易见的,但要明确,不要这样做。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.