为所有Junit测试创建单个参数

时间:2017-05-11 20:32:54

标签: java rest junit rest-assured

我想不出一个更好的标题抱歉。

我正在为我们网站的销售流程创建一个自动api测试(有4个步骤)。当您启动销售流程时,您将获得一个需要在销售流程的每个步骤传递的密钥。

我想为每4个步骤创建一个单独的Junit测试。我已经写了一个方法启动并返回密钥:

public String initiate_salesflow() throws Throwable {

       RestAssured.baseURI = "http://localhost:8080";

        String res = given().

                when().
                get("/salesflow/initiate").
                then().
                contentType(ContentType.JSON).
                extract().
                path("stackId");

        return res;

我创建了一个实例变量来保存返回的密钥,并创建其他测试的url:

private String URL = "http://localhost:32768/salesflow/"+initiate_salesflow();

然而,每当我的每个junit测试运行上面的方法时,都会创建一个新密钥,当我希望它们全部匹配时。我理解@BeforeClass可以运行一次该方法但是有没有办法将返回的值传递给其他测试?

由于

2 个答案:

答案 0 :(得分:1)

前提:您需要一个IDENTICAL键用于所有四个测试,尽管它们是四个不同的测试。

考虑到这一说法,我必须指出,如果他们必须共同完成单个业务任务,那么您的四个单独测试不是单元测试。换句话说,如果这四个步骤中的任何一个失败,那么您的业务任务就失败了。

这不适用于@Before,因为它用于设置每个单独的测试,如果您使用类似JUnit的测试,您会发现可以为每个单独的测试重新实例化Class,所以甚至预先分配变量可能不起作用。

这就是你所描述的情况。

public class Test {
    private String testKey;

    private String generateKey() {
        return String.valueOf(new Date().getTime());
    }

    @Before
    public void setUp() {
        testKey = generateKey();
    }

    @Test
    public void testA() {
        System.out.println(testKey);
    }

    @Test
    public void testB() {
        System.out.println(testKey);
    }

    //... etc
}

最终发生的事情是每个测试最终都会获得一个新密钥,因此testA的密钥和testB的密钥在这种情况下是不同的时间戳。

testKey对于这两个测试永远不会相同,因为时间戳会改变。

解决方案是将四个单独的步骤提取到单个超级测试中。

public class Test {
    private String testKey;

    private String generateKey() {
        return String.valueOf(new Date().getTime());
    }

    @Before
    public void setUp() {
        testKey = generateKey();
    }

    @Test
    public void superTest() {
        testA();
        testB();
        testC();
        //...
    }

    private void testA() {
        System.out.println(testKey);
    }

    private void testB() {
        System.out.println(testKey);
    }

    //... etc
}

假设如果四个步骤中的任何一个失败,您的测试将失败,superTest实施仍将履行合同,因为任何Assert.fail()调用都将无法通过该测试。如果每个单独的测试仍然可以作为独立单元运行,您可以将@Test符号添加回它们并删除private签名。

如果您使用像EasyMock这样的模拟框架,则可能需要在每次方法调用后重置模拟状态。

答案 1 :(得分:0)

public class Test {
    private String key;

    @BeforeClass
    public void setUp(){
      key = yourMethod();
    }

    @Test
    public void test1(){
       // another test using the key
    }

}