如何写好单测

本文探讨了为何要进行单元测试,强调代码覆盖率的重要性,并对比了单元测试与集成测试的区别。遵循AIR原则,介绍了如何利用Mockito等工具编写高质量的单元测试,包括定义对象、模拟方法和验证结果的步骤。同时,提出了改善单测的建议,如规范命名和全面验证,以提升测试效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、为什么要写单测?

单测即单元测试(Unit Test),是对软件的基本组成单元进行的测试,比如函数、过程或者类的方法。其意义是:

  • 功能自测,发现功能缺陷
  • 自我Code Review
  • 测试驱动开发
  • 促进代码重构并提升代码质量

1.1、代码覆盖率

单测质量最直接表现的指标就是代码覆盖率,分为语句覆盖(Statement coverage)、分支覆盖(Branch coverage)、条件覆盖(Condition converage)、路径覆盖(Path coverage)

1.2、单元测试 VS 集成测试

系统上线前都会做回归测试和集成测试,但为什么还要加单元测试呢?

指标对象 单元测试 集成测试
测试对象 程序单元 模块组合
测试方法 白盒测试 黑盒测试
测试时间 开发阶段 集成阶段
测试内容 代码逻辑 接口功能
测试粒度 较细粒度 较粗粒度

2、如何写好单测?

2.1、单测规约

可以参考阿里巴巴 的Java开发规范,以下几点在单测中要特别关注:

  • 【强制】好的单测必须遵守AIR原则。说明:单元测试在线上运行时,像空气一样感觉不到,但在测试的质量保证上,却是非常关键的。好的单元测试宏观上说,具体有自动化(Automatic)、独立性(Idependent)、可重复执行(Repeatable)的特点。
  • 【强制】单元测试应该是全自动执行的,并且非交互式的。测试用例通常是被定期执行的,执行过程必须完全自动化才有意义。输出结果需要人工检查的测试不是一个好的单元测试。单元测试中不准使用System.Out来进行人肉验证,必须使用Assert来验证
  • 【强制】单元测试是可以重复执行的,不能受到外界环境的影响。
  • 【推荐】编写单元测试代码遵守BCDE原则,以保证被测试模块的交付质量。
    • B: Border,边界值测试,包括循环边界、特殊取值、特殊时间点、数据顺序等。
    • C: Correct,正确的输入,并得到预期的结果。
    • D: Design,与设计文档相结合,来编写单元测试。
    • E: Error,强制错误信息输入(如:非法数据、 异常流程、业务允许外等),并得到预期的结果

2.2、一把好工具

写单侧首先要有好的单测工具,常用工具: Mockito、PowerMock、 EasyMock、JMockito等,Mock可以解决:

  • 解除对外部服务依赖
  • 减少全链路测试的数据准备
  • 模拟一些非正常的流程
  • 不用加载项目环境配置
  • 实现模块之间的并行开发

2.3、编写单元测试

在这里插入图片描述
可以把单元测试编写流程分为四大步骤,八大操作。

定义对象阶段

定义测试对象

在编写单元测试时,首先需要定义被测对象,或直接初始化、或通过Spy包装…实例化。

  • 直接构建对象
    UserService userService = new UserService();
  • 利用Mockito.spy方法
    UserService userService = Mockito.spy(new UserService());
    UserService userService = Mockito.spy(UserService.class);
  • 利用@Spy注解
@RunWith(PowerMockRunner.class) 
public class CompanyServiceTest {
   
	@Spy
	private UserService userService = new UserService();
}
  • 利用@InjectMocks注解
@RunWith(PowerMockRunner.class
<think>好的,我现在需要帮用户解答关于三菱FB气缸报警输出模块的编程实现方法。首先,用户提到了三菱FX3U系列的PLC,引用了几个相关的资料,特别是引用[2]和[3]详细说明了功能块的应用。我需要结合这些引用内容,整理出具体的步骤和示例代码。 首先,功能块(FB)在三菱PLC编程中用于模块化设计,用户提到的气缸报警功能块应该包括输入参数、输出参数以及内部逻辑处理。根据引用[2],控和双控气缸报警功能块是标准化的,可以直接调用。引用[3]提到需要先引入FB库,然后在主程序中调用。 接下来,我应该分步骤说明如何编这样的功能块。第一步是定义输入输出变量,比如气缸的前后传感器信号、报警时间等输入,以及报警输出和状态保持。然后,内部逻辑需要检传感器信号是否在预期时间内变化,如果超时则触发报警。此外,可能还需要处理手动操作和报警复位的情况。 需要注意的是,三菱FX3U的编程环境是GX Works2,功能块的结构包括变量定义和梯形图逻辑。引用[4]提到SMART PLC没有FB/FC,但用户问的是三菱,所以应该使用FB。示例部分可以给出一个简化的梯形图结构,说明如何用定时器检信号超时,并输出报警。 最后,用户可能还想知道如何调用这些功能块,以及实际应用中的注意事项,比如参数设置和试方法。相关问题部分可以包括如何优化报警逻辑、调试技巧以及与其他模块的整合等。</think>### 三菱FB气缸报警输出模块的编程实现方法 三菱FX3U系列PLC的气缸报警功能块(FB)通过模块化设计实现标准化报警逻辑,具体实现步骤如下: #### 1. **功能块输入/输出变量定义** - **输入变量**: - `X0`:气缸前进传感器信号 - `X1`:气缸后退传感器信号 - `T_Alarm`:报警触发时间(例如5秒) - `Reset`:报警复位信号 - **输出变量**: - `Y0`:气缸报警输出 - `Alarm_Status`:报警状态保持(用于HMI显示)[^2][^3] #### 2. **内部逻辑实现** - **超时检**: 使用定时器`T0`检气缸动作是否超时。例如,气缸前进后若未在`T_Alarm`时间内收到后退信号,则触发报警: ```ladder |--[X0]---[TON T0 K50]--| // T_Alarm=5秒(K50对应5秒) |--[T0]---[SET Y0]-------| // 超时后置位报警输出 ``` - **双控气缸逻辑**: 若为双控气缸(电磁阀控制进退),需同时检两个传感器信号的互锁关系: ```ladder |--[X0]--[X1]---[RST Y0]--| // 传感器信号正常时复位报警 |--[X0]--|/|--[X1]--[SET Y0]| // 侧信号异常触发报警 ``` - **报警复位**: 通过`Reset`信号清除报警状态: ```ladder |--[Reset]---[RST Y0]--[RST Alarm_Status]--| ``` #### 3. **功能块封装与调用** - 在GX Works2中创建FB,将上述逻辑封装为`Cylinder_Alarm_FB`。 - 主程序中重复调用FB,例如: ```ladder |--[Cylinder_Alarm_FB(X0, X1, K50, M100, Y0)]--| // 实例化第一个气缸报警 |--[Cylinder_Alarm_FB(X2, X3, K30, M101, Y1)]--| // 实例化第二个气缸 ``` #### 4. **实际应用注意事项** - **参数标准化**:报警时间需根据气缸实际运动时间调整,避免误触发[^2]。 - **状态保持**:使用`Alarm_Status`寄存器存储报警历史,便于故障排查。 - **手动模式兼容**:在FB中添加`Manual_Mode`输入,屏蔽自动报警检以支持手动操作[^4]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只打杂的码农

你的鼓励是对我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值