【问题标题】:Writing Unit tests in Kotlin, sharing variables?在 Kotlin 中编写单元测试,共享变量?
【发布时间】:2017-10-18 06:26:03
【问题描述】:

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

由于我希望测试按程序运行,我希望我可以存储第一个 API 请求的结果并将其传递给下一个单元测试。

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 端点是否正常工作的最佳方法的建议。

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

跨测试共享变量的最佳方式是什么?

谢谢

【问题讨论】:

    标签: java unit-testing kotlin rest-assured


    【解决方案1】:

    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

    【讨论】:

      【解决方案2】:

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

      “或者在同一个函数中再发出一个请求,然后将结果传递给下一步会更好吗?”

      没错,我们通常称之为旅程测试

      【讨论】:

        【解决方案3】:

        如果您在许多测试中都有通用的设置程序,我倾向于同意上面的@Before 建议,但否则您应该让每个测试都独立存在。 Kotlin 可以使这变得非常好 - 请参阅 https://gjesse.github.io/post/unit-testing-with-kotlin---mini-dsls/ 以了解为单个测试包装常见操作类型的描述。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-08-23
          • 1970-01-01
          相关资源
          最近更新 更多