单元测试汇总

一、单元测试(方法层)

以下两种方式性能都是一样的,不会去加载spring的启动配置文件

MockitoJUnitRunner

使用的是mock单测工具

 

package com.example.demo.facade;
 
import com.example.demo.entity.ProductPriceItemDO;
import com.example.demo.param.ProductIdParam;
import com.example.demo.request.UpdatePriceItemInfoRequest;
import com.example.demo.result.ProductPriceAdjustResult;
import com.example.demo.service.PriceService;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
 
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
 
/**
 * @author mxl
 * @version 1.0
 * @created 2021/1/23.
 */
@RunWith(MockitoJUnitRunner.class)
public class ProductPriceAdjustFacadeTest {
    @InjectMocks
    AdjustFacade facade;
    @Mock
    PriceService priceService;
    @Before
    public void setUp() throws Exception {
    }
 
    //单元测试(方法层)
    @Test
    public void getProductPriceAdjustInfo() {
        ProductIdParam param = new ProductIdParam();
        param.setProductId(100l);
        Result result= facade.getProductPriceAdjustInfo(param);
        Assert.assertNotNull(result.getAfterProductPriceAdjustInfo());
    }
 
}

SpringBootTest

如果使用@SpringBootTest注解的话,需要这样配置

package com.example.demo.facade;
 
import com.example.demo.entity.ProductPriceItemDO;
import com.example.demo.param.ProductIdParam;
import com.example.demo.request.UpdatePriceItemInfoRequest;
import com.example.demo.result.ProductPriceAdjustResult;
import com.example.demo.service.PriceService;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.junit.MockitoJUnitRunner;
import org.springframework.boot.test.context.SpringBootTest;
 
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
 
/**
 * @author mxl
 * @version 1.0
 * @created 2021/1/23.
 */
@SpringBootTest
public class ProductPriceAdjustFacadeTest {
    @InjectMocks
    ProductPriceAdjustFacade productPriceAdjustFacade;
    @Mock
    PriceService priceService;
    @Before
    public void setUp() throws Exception {
        MockitoAnnotations.initMocks(this);
    }
 
    //单元测试(方法层)
    @Test
    public void getProductPriceAdjustInfo() {
        ProductIdParam param = new ProductIdParam();
        param.setProductId(100l);
        ProductPriceAdjustResult productPriceAdjustInfo = productPriceAdjustFacade.getProductPriceAdjustInfo(param);
        Assert.assertNotNull(productPriceAdjustInfo.getAfterProductPriceAdjustInfo());
    }
}

二、单元测试(无返回值,参数验证)

现在业务开发越来越追求单测覆盖率,对于一些保存方法没有返回值的单测也必须达到覆盖率。

package com.example.demo.facade;
 
import com.example.demo.entity.ProductPriceItemDO;
import com.example.demo.param.ProductIdParam;
import com.example.demo.request.UpdatePriceItemInfoRequest;
import com.example.demo.result.ProductPriceAdjustResult;
import com.example.demo.service.PriceService;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.junit.MockitoJUnitRunner;
import org.springframework.boot.test.context.SpringBootTest;
 
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
 
/**
 * @author mxl
 * @version 1.0
 * @created 2021/1/23.
 */
@RunWith(MockitoJUnitRunner.class)
public class ProductPriceAdjustFacadeTest {
    @InjectMocks
    ProductPriceAdjustFacade productPriceAdjustFacade;
    @Mock
    PriceService priceService;
    @Before
    public void setUp() throws Exception {
    }
 
 
    //单元测试(无返回值,参数验证)
    @Test
    public void batchUpdatePriceItemByCleanPrice(){
        productPriceAdjustFacade.batchUpdatePriceItemByCleanPrice();
        ArgumentCaptor<UpdatePriceItemInfoRequest> argumentCaptor = ArgumentCaptor.forClass(UpdatePriceItemInfoRequest.class);
        verify(priceService).saveBatchProductDatePrice(argumentCaptor.capture());
        Assert.assertEquals(new Integer(100), argumentCaptor.getValue().getCleanPrice());
    }
}

说明一下

ArgumentCaptor<UpdatePriceItemInfoRequest> argumentCaptor = ArgumentCaptor.forClass(UpdatePriceItemInfoRequest.class);
verify(priceService).saveBatchProductDatePrice(argumentCaptor.capture());
Assert.assertEquals(new Integer(100), argumentCaptor.getValue().getCleanPrice());

这两段代码合起来校验的方法其实是priceService.saveBatchProductDatePrice(UpdatePriceItemInfoRequest updatePriceItemInfo)

三、单元测试(数据库层h2)

很多时候可能单测会涉及到数据库,这时候就需要h2作为单测数据库,使用方式很简单,启动方式使用的是spring的启动类来启动。

测试类:

/**
 * @author mxl
 * @version 1.0
 * @created 2020/12/8.
 */
/**
 * UserService测试类
 * 单元测试必须开启web环境才能看见h2的控制台
 */
@SpringBootTest(classes = AppBootstrap.class)
@RunWith(SpringRunner.class)
public class GrabBlacklistConsumerTest {
    @Autowired
    private MblGrabBlacklistMapper mblGrabBlacklistMapper;
 
    @Test
    public void insertGrabBlacklist(){
        MblGrabBlacklist mblGrabBlacklist = new MblGrabBlacklist();
        mblGrabBlacklist.setStatus(1);
        mblGrabBlacklist.setProductId(11l);
        mblGrabBlacklist.setHostId(33l);
        int insert = mblGrabBlacklistMapper.insert(mblGrabBlacklist);
        Assert.assertEquals( 1,insert);
    }
}

加入h2配置文件

# 是否开启h2数据库注入
h2.test.enabled=true
# 初始化H2数据源的脚本路径。可以不配,默认 test/h2/路径下
h2.test.sqlLocation=

数据库

CREATE TABLE `phx_mbl_grab_blacklist` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
  `host_id` bigint(20) NOT NULL COMMENT '房东ID',
  `product_id` bigint(20) NOT NULL COMMENT '房源ID',
  `status` tinyint(2) unsigned NOT NULL DEFAULT '0' COMMENT '黑名单状态,-1:未知,0:已失效,1:生效中',
  `expire_date` int(11) unsigned DEFAULT '99991231' COMMENT '到期时间',
  `reason` varchar(300) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '拉黑原因',
  `blacklist_source` tinyint(2) DEFAULT '-1' COMMENT '拉黑来源,-1:未知,0:系统,1:工单,2:人工',
  `gmt_create` datetime NOT NULL COMMENT '创建时间',
  `gmt_modify` datetime NOT NULL COMMENT '修改时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_product_id` (`product_id`),
  KEY `idx_host_id` (`host_id`),
  KEY `idx_expire_date` (`expire_date`)
) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='抓取黑名单表';

路径情况

 

四、 单元测试(静态方法的mock)

@RunWith(PowerMockRunner.class)
@PowerMockIgnore({ "javax.management.*", "javax.net.ssl.*", "javax.security.*" })
//忽略一些mock异常。使用powermock一定要加,否则某些情况下会报错
@PrepareForTest({ BizUtils.class })//要mock的类
public class ProductFacadeTest {
    @Before
    public void setUp(){
        ProductOpInfo opInfo = new ProductOpInfo();
        PowerMockito.mockStatic(BizUtils.class);
        PowerMockito.when(BizUtils.getCurrentOpInfo()).thenReturn(opInfo);
 
    }
}

五、私有方法单测

@Test
    public void queryForTelY_ReturnCalledShowAndCalledNumber(){
        // 省略初始化参数
        Method privateMethod = planService.getClass().getDeclaredMethod("queryForTelY", CoreBeansCallInInfo.class, CoreBeansPrvNumInfo.class);
        privateMethod.setAccessible(true);
        CoreBeansCallPlanInfo coreBeansCallPlanInfo = (CoreBeansCallPlanInfo)privateMethod.invoke(planService, callInInfo, prvNumInfo);
        assert coreBeansCallPlanInfo.getCallOutShowNum().equals("15320318967");
        assert coreBeansCallPlanInfo.getCallTo().equals("密文");
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
车载项目软件测试汇总通常涵盖了针对车辆电子系统中各种软件应用进行全面和细致的验证过程。这类测试主要包括以下几个方面: 1. **功能测试**:检查软件是否按照用户需求和规格书执行预定的功能,如导航、娱乐系统、安全控制等。 2. **性能测试**:评估软件在不同条件下的响应速度、稳定性(包括抗干扰能力)和资源消耗,比如网络连接稳定性、电池续航影响等。 3. **兼容性测试**:确保软件能在不同操作系统、硬件平台和通信标准上正常运行,以及与其他车载硬件设备协同工作的效能。 4. **安全性测试**:验证软件是否存在漏洞,如数据加密、防篡改能力、碰撞规避算法的反应时间等。 5. **用户体验测试**:考量用户界面设计、操作流程、错误提示等方面的易用性和满意度。 6. **自动化测试**:运用工具进行回归测试,提高效率并减少人为错误,比如单元测试、集成测试和系统测试。 7. **模拟器/实际路测**:在虚拟环境中或实际驾驶场景下对软件进行实时测试,验证其在各种环境下的行为。 8. **法规遵从性测试**:确保软件符合各国交通法规和技术标准,如ISO 26262汽车电子安全标准。 相关问题-- 1. 在车载软件测试中,如何保证驾驶者的安全性? 2. 自动化测试在车载软件测试中的重要性是什么? 3. 车载软件如何处理复杂的通信协议和数据交互?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值