代码之家  ›  专栏  ›  技术社区  ›  Andreas Mattisson

使用套房时,Junit 4@beforeclass和@afterclass

  •  29
  • Andreas Mattisson  · 技术社区  · 15 年前

    当使用下面的方法时,通过设置带有套件的JUnit。当每个testclass中的所有@beforeclass都将在任何测试开始执行之前执行时,我们就遇到了问题。 (对于每个n个test class文件,@beforeclass运行,然后在执行之后,它开始执行第一个mytest.class文件@test)

    这将导致我们分配了大量的资源和内存。 我的想法是这一定是错误的,难道每个@beforeclass不应该只在实际的testclass执行之前运行,而不是在套件启动时运行吗?

    @RunWith(Suite.class)
    @Suite.SuiteClasses({ MyTests.class, Mytests2.class, n1, n2, n })
    public class AllTests {
        // empty
    }
    
    
    public class MyTests {  // no extends here
        @BeforeClass
        public static void setUpOnce() throws InterruptedException {
            ...
        @Test
            ...
    
    public class MyTests2 {  // no extends here
        @BeforeClass
        public static void setUpOnce() throws InterruptedException {
            ...
        @Test
            ...
    
    3 回复  |  直到 14 年前
        1
  •  49
  •   nayakam    15 年前

    在alltests类中编写@beforeclass方法,该方法将在套件启动时执行。

    public class MyTests1 { 
        @BeforeClass
        public static void beforeClass() {
            System.out.println("MyTests1.beforeClass");
        }
    
        @Before
        public void before() {
            System.out.println("MyTests1.before");
        }
    
        @AfterClass
        public static void afterClass() {
            System.out.println("MyTests1.AfterClass");
        }
    
        @After
        public void after() {
            System.out.println("MyTests1.after");
        }
    
        @Test
        public void test1() {
            System.out.println("MyTests1.test1");
        }
    
        @Test
        public void test2() {
            System.out.println("MyTests1.test2");
        }
    }
    
    
    
    public class MyTests2 { 
        @BeforeClass
        public static void beforeClass() {
            System.out.println("MyTests2.beforeClass");
        }
    
        @Before
        public void before() {
            System.out.println("MyTests2.before");
        }
    
        @AfterClass
        public static void afterClass() {
            System.out.println("MyTests2.AfterClass");
        }
    
        @After
        public void after() {
            System.out.println("MyTests2.after");
        }
    
        @Test
        public void test1() {
            System.out.println("MyTests2.test1");
        }
    
        @Test
        public void test2() {
            System.out.println("MyTests2.test2");
        }
    }
    
    
    
    
    @RunWith(Suite.class)
    @Suite.SuiteClasses( { MyTests1.class, MyTests2.class })
    public class AllTests {
    
        @BeforeClass
        public static void beforeClass() {
            System.out.println("AllTests.beforeClass");
        }
    
        @Before
        public void before() {
            System.out.println("AllTests.before");
        }
    
        @AfterClass
        public static void afterClass() {
            System.out.println("AllTests.AfterClass");
        }
    
        @After
        public void after() {
            System.out.println("AllTests.after");
        }
    
        @Test
        public void test1() {
            System.out.println("AllTests.test1");
        }
    
        @Test
        public void test2() {
            System.out.println("AllTests.test2");
        }
    
    }
    

    产量

    AllTests.beforeClass
    MyTests1.beforeClass
    MyTests1.before
    MyTests1.test1
    MyTests1.after
    MyTests1.before
    MyTests1.test2
    MyTests1.after
    MyTests1.AfterClass
    MyTests2.beforeClass
    MyTests2.before
    MyTests2.test1
    MyTests2.after
    MyTests2.before
    MyTests2.test2
    MyTests2.after
    MyTests2.AfterClass
    AllTests.AfterClass
    

    高温高压

        2
  •  1
  •   Grundlefleck anujkk    15 年前

    我不太熟悉 @RunWith 在JUnit,所以我可能做了一些错误的事情,但我似乎无法复制你描述的行为。随班就读:

    @RunWith(Suite.class)
    @Suite.SuiteClasses( { FirstTest.class, SecondTest.class, ThirdTest.class })
    public class AllTests {
        // empty
    }
    

    以及firsttest.java,如下所示:

    public class FirstTest {
        @BeforeClass
        public static void doBeforeClass() {
             System.out.println("Running @BeforeClass for FirstTest");
        }
    
        @Test
        public void doTest() {
            System.out.println("Running @Test in " + getClass().getName());
        }
    }
    

    …与secondtest.java和thirdtest.java基本相同。我得到测试输出:

    Running @BeforeClass for FirstTest
    Running @Test in FirstTest
    Running @BeforeClass for SecondTest
    Running @Test in SecondTest
    Running @BeforeClass for ThirdTest
    Running @Test in ThirdTest
    

    这是在Sun的JDK1.6.0上的JUnit4.5.0(Eclipse3.5.1中的默认JUnit)。你能发现我的例子和你的有什么不同吗?可能是不同的JDK/JVM?我对朱尼特内部的了解还不够,不知道这是否是一个因素。

        3
  •  -4
  •   nfechner    15 年前

    我想, @BeforeClass 在声明时执行。