java - JUnit 中用于 ShoppingCart 的无序执行测试

标签 java unit-testing junit tdd

我正在学习 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/

相关文章:

java - 如何让 maven surefire 正确执行 JUnit 和 TestNG 测试?

java - 接受 ServerSocket 上的所有传入请求

java - Android 从一个适配器中删除选项会改变另一个适配器

java - recreate() 方法后迁移崩溃

unit-testing - 规则引擎和自动化测试难题

testing - 多个环境的 Jenkins junit 报告

java - 如何使用 slf4j 登录公共(public)共享库?

unit-testing - 如何使用 jest 对 Vue.js 组件中的方法进行单元测试

unit-testing - VueComponent.mounted : TypeError: Cannot read property 'get' of undefined in mounted hook

java - Mockito 使用模拟对象测试 DAO