0

我有以下用于 JUnit 测试的代码:

import static org.junit.Assert.assertEquals;
import org.junit.Before;
import org.junit.Test;
public class JUnitHelloWorld {
    protected String s;
    @Before
    public void setup() {
        s = "HELLO WORLD";
    }
    @Test
    public void testHelloWorldSuccess() {
        s = s.toLowerCase();
        assertEquals("hello world", s);
    }
    // will fail even if testHelloWorldSuccess is called first
    @Test
    public void testHelloWorldFail() {
        assertEquals("hello world", s);
    }
}

现在,根据评论,为什么即使先调用第一种方法,第二种方法也会失败?第一种方法不是将 s 的值更改为小写吗?

4

3 回答 3

4

@Before发生在每次测试之前。这意味着您运行它们的顺序无关紧要,因为它将始终执行设置然后进行测试。

该标签@BeforeClass将为您提供您所期望的行为。这会在您的任何测试开始之前运行一次。

于 2012-06-21T04:15:19.353 回答
1

JUnit 不会按照您的代码顺序运行每个测试用例(使用 @Test 的方法)。这就是为什么每个测试用例必须相互独立的原因。

此外,带有@Before 标签的设置方法将始终在您的每个测试方法之前运行。

因此,您的代码执行顺序可能(但不一定)是:

  1. 设置()
  2. 测试HelloWorldSuccess()
  3. 设置()
  4. 测试HelloWorldFail()

但它也可能运行:

  1. 设置()
  2. 测试HelloWorldFail()
  3. 设置()
  4. 测试HelloWorldSuccess()
于 2012-06-21T04:18:28.387 回答
0

对于 JUnit ,测试用例的执行顺序是不固定的。您可能会在方法 m1 之后编写方法 m2 并且在执行时 m2 首先执行。最好的方法是你的测试用例不应该基于测试用例的执行顺序。如果您只想为整个班级执行一次,请尝试@BeforeClass。

对于上述情况,试试这个:

    protected String s;
    private int flag ;
       @BeforeClass
       public beforeClass(){
           flag = 0;
       }
        @Before
        public void setup() {
            s = "HELLO WORLD";

        }
        @Test
        public void testHelloWorldSuccess() {
        flag = 1;
            s = s.toLowerCase();
            assertEquals("hello world", s);
        }
        // won't fail even if testHelloWorldSuccess is called first
        @Test
        public void testHelloWorldFail() {
        if(flag == 1)
            assertEquals("hello world", s);
        else
        assertEquals("HELLO WORLD", s);
        }
于 2012-06-21T04:23:34.983 回答