Spy*_*der 6 java junit junit4 test-suite
我正在尝试将JUnit添加到一个大型项目中,并且在嵌套测试套件时遇到了困难.例如:
@RunWith(Suite.class)
@Suite.SuiteClasses({Test2.class, .....})
public class Test1{
}
@RunWith(Suite.class)
@Suite.SuiteClasses({Test3.class, .....})
public class Test2{
//might have tests
}
@RunWith(Suite.class)
public class Test3{
//tests here
}
Run Code Online (Sandbox Code Playgroud)
每个类在它自己的包中运行测试,以及所有子包TestSuite
运行Test1会导致java.lang.Exception:没有可运行的方法.我如何让它工作?有没有更好的方法来组织测试而没有一个没有巨大的列表?
第一个问题是Test3使用@RunWith(Suite.class)但不包含@Suite.SuiteClasses({Test3.class, .....}).这产生了一个IntializationError: class 'Test3' must have a SuiteClasses annotation.由于您不打算在Test3下面有任何类,因此应删除此注释.
第二个问题Exception: No runnable methods几乎总是由于忘记添加@Test测试.你没有把测试放在你的样本中,所以我不知道是否真的如此,但这是最可能的原因.
以下是代码的工作版本,允许从任何类运行测试:
Test1.java
import org.junit.runner.*;
import org.junit.runners.*;
import org.junit.runners.Suite.SuiteClasses;
@RunWith(Suite.class)
@SuiteClasses({Test2.class})
public class Test1 {
}
Run Code Online (Sandbox Code Playgroud)
Test2.java
import org.junit.runner.*;
import org.junit.runners.*;
import org.junit.runners.Suite.SuiteClasses;
@RunWith(Suite.class)
@SuiteClasses({Test3.class})
public class Test2 {
}
Run Code Online (Sandbox Code Playgroud)
Test3.java
import static org.junit.Assert.*;
import org.junit.*;
public class Test3 {
@Test
public void testTrue(){
assertTrue(true);
}
}
Run Code Online (Sandbox Code Playgroud)
至于是否有比组织事物更好的方法,我想这只取决于你决定如何创建类.由于您可以向套件添加套件,如此演示,您可以创建较小的套件,这些套件依赖于所有内容,例如树.例如,我通常做的是:
AllTestSuite
TextParsingSuite
GuiSuite
SwingSuite
JavaFXSuite
FileIOSuite
Run Code Online (Sandbox Code Playgroud)
测试被添加到最相关的套件中.最后,我认为我没有任何超过10个测试类/套件的套件.如果我这样做,是时候制作一个新的子套件了.换句话说,没有"某处的巨大列表",只是为了有效地制作一个大列表,将很多较小的列表组合到另一个列表中.
我想你可以使用一些工具来动态查找所有包含测试的Java类,但是JUnit本身不支持这种行为(它只运行你告诉它的测试,我个人认为这是一件好事).