2017-05-18 1 views
3

J'essaie de créer des tests fonctionnels dans Kotlin pour faire des demandes à un service Cart Java en utilisant la bibliothèque Rest Assured. Puisque je veux que les tests se comportent de manière procédurale, j'espérais pouvoir stocker le résultat de la première demande d'API et le passer au prochain test d'unité.Écrire des tests unitaires à Kotlin, en partageant des variables?

-à-dire

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()) 
    } 
} 

jamais vraiment utilisé Kotlin, recherche donc des conseils dans ce qui serait la meilleure façon de tester tous les Les points de terminaison API fonctionnent.

Ou serait-il préférable de faire une autre demande à l'intérieur de la même fonction et passer le résultat à l'étape suivante?

Quelle est la meilleure façon de partager des variables entre les tests?

Merci

Répondre

3

JUnit ne aucune garantie quant à la commande des tests et les essais ne devraient pas dépendre les uns des autres, ni muter l'état partagé.

La solution la plus simple est, en effet, d'effectuer les deux requêtes dans le même test.

De plus, vous pouvez utiliser JUnit test fixtures pour configurer les objets dont vous avez besoin pour un ensemble de tests. Si vous avez besoin du cartId dans plusieurs tests, c'est l'option préférée.

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() { /* ... */ } 
} 

Voir: Delegates.notNull(), un autre question about @Before and @BeforeClass.

2

Les tests unitaires sont conçus pour être autonomes. Par défaut, vous ne pouvez pas contrôler l'ordre d'exécution de test unitaire ont lu ici: How to run test methods in specific order in JUnit4?

« Ou serait-il préférable de faire une autre demande dans la même fonction et passer le résultat à l'étape suivante? »

Ce serait exact, nous fournissons l'habitude d'appeler ce voyage Tests

0

Si vous avez des procédures d'installation communes à travers de nombreux tests, j'aurais tendance à être d'accord avec @Before suggestions ci-dessus, mais sinon, vous devriez rendre chaque test autonome. Kotlin peut rendre cela très agréable - voir https://gjesse.github.io/post/unit-testing-with-kotlin---mini-dsls/ pour une description des types d'opérations communes d'emballage pour des tests individuels.