我正在拥有一个具有以下结构的测试套件
.
├── my_project
│ ├── app
│ ├── db.sqlite3
│ ├── manage.py
│ ├── my_project
│ └── static
└── venv
在上面的结构中,我想执行testmethod4()作为最后一个。即)最后执行。 有一个注释@FixMethodOrder,它执行一个方法而不是testclass。是否有任何机制来维护测试类和testmethod中的顺序。使用@FixMethodOrder,我可以通过重命名测试方法的名称来执行该方法,但我不能指示junit执行测试类作为最后一个(最后一个)。
答案 0 :(得分:7)
虽然再次引用@Andy--
您不应该关心测试订购。如果它很重要,你就得到了 测试之间的相互依赖性,因此您正在测试行为+ 相互依赖,而不仅仅是行为。你的测试应该有效 同样以任何顺序执行。
但如果需要这样做,你可以尝试Suite
@RunWith(Suite.class)
@Suite.SuiteClasses({
TestClass2.class,
TestClass1.class
})
public class JunitSuiteTest {
}
您可以指定
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class TestClass1 {
@AfterClass
public void testMethod4() {
然后注意将方法testMethod4
命名为最终执行,或者也可以使用@AfterClass
,这很快就会被Junit5中的@AfterAll
替换。
答案 1 :(得分:0)
@shiriam正如@Andy Turner已经指出的那样,在运行测试时,测试的顺序不应该存在问题。
如果您在进行任何测试之前有一个要执行的例程,则可以在其中一个类中使用静态代码块。
想想这样的事情:
class TestBootstrap {
// singleton instance
private static final instance;
private boolean initialized;
private TestBootstrap(){
this.initialized = false;
}
public static TestBootstrap getInstance(){
if (instance == null){
instance = new TestBootstrap()
}
}
public void init(){
// make the method idempotent
if (!initialzed){
// do init stuff
initialized = true;
}
}
public boolean isInitialized(){
return initialized;
}
}
然后在你的测试中使用这样的东西:
class TestClass1{
@BeforeClass
public void setup(){
TestBootstrap.getInstance().init();
}
@Test
public void testmethod1(){
// assertions
}
// ....
}
class TestClass2{
@BeforeClass
public void setup(){
TestBootstrap.getInstance().init();
}
@Test
public void testmethod11(){
// assertions
}
// ...
}
通过使用单例实例进行测试设置,您可以确保只执行一次测试环境的初始化,而与执行测试类的顺序无关。