JUnit中针对购物车的测试的无序执行

时间:2014-12-12 14:49:05

标签: java unit-testing junit tdd

我正在学习TDD练习并编写单元测试。在尝试为购物车应用程序创建测试时,我期望我的测试无序执行。

以下是我的测试列表:

测试1:可以创建一个空的购物车

测试2:可以将产品添加到购物车

测试3:可以计算购物车的总价

我假设测试执行的顺序必须是

测试1

的Test2

Test3的

但我的代码中的实际测试执行顺序是

测试1

Test3的

的Test2

我发现指定单元测试的执行顺序是一种不好的做法,我想避免这种情况。这种行为可能是什么原因以及解决方案是什么?

这是我的代码:

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

1 个答案:

答案 0 :(得分:3)

对于每个单独的测试用例,唯一可以预期执行的是“@Before”标记的方法中的任何内容。因此,对于第三种方法的范围,购物车刚刚初始化而没有添加任何产品。您需要在此方法中再次添加产品,无论它们是否已添加到任何其他测试用例中。在编写单个测试用例时,请将它们视为没有其他测试用例存在。