2014-12-12 3 views
1

Я изучаю методы TDD и записываю тесты единиц. Хотя при попытке создать тесты для приложения для покупок я ожидал неупорядоченное выполнение моих тестов.Неупорядоченное выполнение тестов в JUnit для ShoppingCart

Вот мой список тестов:

Тест 1: Можно создать Корзина, которая Empty

Тест 2: Можно добавить продукт в корзину

Тест 3: Можно рассчитать Общая стоимость в корзину

Я предполагаю, что порядок выполнения теста должен быть

Test1

Test2

Test3

Но фактическое Порядок испытания исполнения в моем коде

Test1

Test3

Test2

я узнал, что это плохая практика, чтобы указать порядок выполнения наших модульных тестов, которые я хочу t o избегать. Что может быть причиной такого поведения и каково решение?

Вот мой код:

package com.techie.kart; 

import static org.junit.Assert.assertEquals; 
import static org.junit.Assert.assertNotEquals; 
import java.math.BigDecimal; 
import org.junit.Before; 
import org.junit.Test; 

import com.techie.kart.model.Product; 

public class ShoppingKartTest { 

    private ShoppingCart cart; 
    private Product appleProduct; 
    private Product sonyProduct; 

    @Before 
    public void setup() { 
     cart = new ShoppingCart(); 
     appleProduct = new Product.ProductBuilder().name("Mobile") 
       .price(new BigDecimal(10000.25)).description("This is IPhone") 
       .manufacturer("Apple").build(); 
     sonyProduct = new Product.ProductBuilder().name("Mobile") 
       .price(new BigDecimal(50000.00)).description("This is Sony") 
       .manufacturer("Sony").build(); 

    } 

    @Test 
    public void CanCreateAnEmptyShoppingCart() { 
     System.out.println("First Test Case:"+cart.getProductsCount()); 
     assertEquals(0, cart.getProductsCount()); 
    } 

    @Test 
    public void CanAddProductsToKart() { 
     cart.addProduct(appleProduct); 
     cart.addProduct(sonyProduct); 
     assertNotEquals(0, cart.getProductsCount()); 
     System.out.println("Second Test Case:"+cart.getProductsCount()); 
     assertEquals(2, cart.getProductsCount()); 
     assertEquals(new BigDecimal(60000.25), cart.getTotal()); 
     System.out.println("Second Test Case:"+cart.getTotal()); 
    } 

    @Test 
    public void CanCalculateTotalCartPrice() { 
     System.out.println("Third Test Case:"+cart.getTotal()); 
     System.out.println("Third Test Case:"+cart.getProductsCount()); 
     assertEquals(new BigDecimal(60000.25), cart.getTotal()); 
    } 
} 

Фактический выход:

First Test Case:0 
Third Test Case:0 
Third Test Case:0 
Second Test Case:2 
Second Test Case:60000.25 

Ожидаемый результат (мое предположение):

First Test Case:0 
Second Test Case:2 
Second Test Case:60000.25 
Third Test Case:2 
Third Test Case:60000.25 

ответ

3

Для каждого отдельного теста, единственное, что вам может ожидать, что был выполнен, - это то, что находится в методе, помеченном «@Before». Таким образом, для объема вашего третьего метода тележка только что была инициализирована без добавления каких-либо продуктов. Вам нужно добавить продукты снова в этот метод, независимо от того, были ли они добавлены в любой другой тестовый пример. При написании отдельных тестовых случаев обращайтесь с ними так, как будто никаких других тестовых случаев не существует.

+0

Спасибо за ответ. Есть ли какой-либо конкретный порядок, в котором тесты выполняются в JUnit? Почему тесты не выполняются последовательно, как T1, T2 T3, но выполняются как T1, T3, T2? Выполняет ли JUnit произвольный порядок выполнения тестов? –

+0

Я не уверен, как это упорядочено, однако порядок не имеет значения, потому что все, что было изменено в рамках отдельного модульного теста, не сохраняется за пределами этого метода. – Kevin

+0

Спасибо за быстрый ответ :) +1 –