我正在学习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
答案 0 :(得分:3)
对于每个单独的测试用例,唯一可以预期执行的是“@Before”标记的方法中的任何内容。因此,对于第三种方法的范围,购物车刚刚初始化而没有添加任何产品。您需要在此方法中再次添加产品,无论它们是否已添加到任何其他测试用例中。在编写单个测试用例时,请将它们视为没有其他测试用例存在。