我正在学习 TDD 实践并编写单元测试。在尝试为购物车应用程序创建测试时,我预计我的测试会无序执行。
这是我的测试列表:
测试 1:可以创建一个空的购物车
测试 2:可以将产品添加到购物车
测试三:可以计算出购物车的总价
我假设测试执行的顺序必须是
测试1
测试2
测试3
但我的代码中实际的测试执行顺序是
测试1
测试3
测试2
我发现为我们的单元测试指定执行顺序是一种不好的做法,我想避免这种做法。这种行为的原因可能是什么,解决方案是什么?
这是我的代码:
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
最佳答案
对于每个单独的测试用例,您唯一可以期望执行的是“@Before”标记的方法中的任何内容。因此,对于第三种方法的范围,购物车刚刚初始化,没有添加任何产品。您需要在该方法中再次添加产品,无论它们是否已添加到任何其他测试用例中。在编写单个测试用例时,将它们视为不存在其他测试用例。
关于java - JUnit 中用于 ShoppingCart 的无序执行测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27446136/