java - 为所有 Junit 测试创建一个参数

标签 java rest junit rest-assured

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

我正在为我们网站的销售流程(包含 4 个步骤)创建一个自动化 API 测试。当您启动销售流程时,您会得到一个 key ,需要在销售流程的每个步骤中传递该 key 。

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

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;

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

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

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

谢谢

最佳答案

前提:您希望所有四个测试都使用一个相同的 key ,尽管它们是四个不同的测试。

考虑到这一点,我必须指出,如果您的四个单独测试必须协同工作以完成单个业务任务,则它们不是单元测试。换句话说,如果这四个步骤中的任何一个失败,您的业务任务就失败了。

这不适合 @Before 因为它用于设置每个单独的测试,如果您使用 JUnit 之类的东西进行测试,您会发现该类可能会为每个单独的个体重新实例化测试,因此即使预先分配变量也可能不起作用。

这就是您描述的情况。

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
}

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

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

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

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 实现仍将履行契约(Contract),因为任何 Assert.fail() 调用都会使该测试失败。如果每个单独的测试仍然可以作为独立单元工作,您可以将 @Test 符号添加回它们并删除 private 签名。

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

关于java - 为所有 Junit 测试创建一个参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43925025/

相关文章:

java - 如何创建自定义 Android 单选按钮?

python - CCXT okex5 掉期合约 - 参数 posSide 错误

java - 单元测试架构问题

junit - 如何过滤一些要分析代码覆盖率的方法

java - 多个 Maven 项目,单个 JaCoCo 站点?

java - webView的scrollTo始终不工作

java - Quartz 不会从调度中删除已删除的作业

java - 为什么这个 Java 8 流示例不能编译?

java - Jersey REST 客户端 : How to add XML file to the body of POST request?

java - 无法使用从浏览器发布的 Base 64 编码字符串创建图像