在Kotlin编写单元测试,共享变量?

时间:2017-05-18 12:26:55

标签: java unit-testing kotlin rest-assured

我正在尝试在Kotlin中创建一些功能测试,以使用Rest Assured库向Cart Java服务发出请求。

由于我希望测试在程序上表现,我希望我可以存储第一个A​​PI请求的结果并将其传递给下一个单元测试。

createCartTest() - > cartId - > getCartForWebsiteTest(cartId)

class CartTest : RestAssuredSupport {

    val port = 8080
    val url = "http://localhost:"
    val cartId = null

    /**
     * Create a cart object
     */
    @Test fun createCartTest() {

        given().
                now().
                body("websiteId=1").
                contentType(ContentType.URLENC).
                post(url + port + "/orders/cart/create.do").
                then().
                statusCode(200).
                body("summary.numItems", equalTo(0)).
                body("summary.visibleNumItems", equalTo(0)).
                body("summary.cartId", notNullValue()).
                body("summary.version", notNullValue())
    }

    /**
     * Fetch a cart object created by websiteId and cartId
     */
    @Test fun getCartForWebsite() {

        given().
                now().
                body("websiteId=1&cartId=" + cartId).
                contentType(ContentType.URLENC).
                post(url + port + "/orders/cart/getCartForWebsite.do").
                then().
                statusCode(200).
                body("summary.numItems", equalTo(0)).
                body("summary.visibleNumItems", equalTo(0)).
                body("summary.cartId", equalTo(cartId)).
                body("summary.version", notNullValue())
    }
}

从未真正使用过Kotlin,因此寻找有关测试所有API端点的最佳方法的建议正在发挥作用。

或者在同一个函数中发出另一个请求并将结果传递给下一步会更好吗?

跨测试分享变量的最佳方法是什么?

由于

3 个答案:

答案 0 :(得分:3)

JUnit不提供有关测试排序的任何保证,测试不应相互依赖,也不应改变共享状态。

最简单的解决方案是在同一测试中执行这两个请求。

此外,您可以使用JUnit test fixtures设置一组测试所需的对象。如果您在多个测试中需要cartId,那么这是首选选项。

class CartTest : RestAssuredSupport {
    // ...
    var cartId: Int by Delegates.notNull()

    @Before fun setUp() {
        // Set up the cartId. This will run before each test. Use @BeforeClass to run once
    }

    @Test fun getCartForWebsite() { /* ... */ }
}

请参阅:Delegates.notNull(),另一个question about @Before and @BeforeClass

答案 1 :(得分:2)

单元测试意味着自包含。 默认情况下,您无法控制单元测试的执行顺序 已在此处阅读:How to run test methods in specific order in JUnit4?

"或者最好在同一个函数中发出另一个请求并将结果传递给下一步?"

这是正确的,我们通常将其称为Journey Tests

答案 2 :(得分:0)

如果您在许多测试中有共同的设置程序,我倾向于同意上面的@Before建议,但是否则您应该使每个测试都自包含。 Kotlin可以做到这一点非常好 - 请参阅https://gjesse.github.io/post/unit-testing-with-kotlin---mini-dsls/以获取有关包装单个测试的常见操作类型的说明。