福建网站建设公司排名,工作作风存在问题及整改措施,白羊女做网站,房屋装饰大家好#xff0c;我是G探险者#xff01;
今天我们简单聊聊单元测试的哪些事儿~
两天时间我玩明白了单元测试的套路。
这里我分享一下思路。
在我眼里单元测试室什么#xff1f;
请看这张草图#xff1a; 单元测试主要关注单个代码单元#xff08;通常是类或方法我是G探险者
今天我们简单聊聊单元测试的哪些事儿~
两天时间我玩明白了单元测试的套路。
这里我分享一下思路。
在我眼里单元测试室什么
请看这张草图 单元测试主要关注单个代码单元通常是类或方法的逻辑正确性而不是功能测试的全面性。具体来说
单元测试的目的
验证逻辑路径单元测试旨在验证代码逻辑中的不同路径是否按预期执行。这包括条件分支如if-else语句、循环、异常处理等。隔离测试通过mock或stub来隔离被测试的单元使其不依赖外部资源如数据库、网络服务或其他复杂对象。快速反馈单元测试应该快速执行提供即时的反馈帮助开发者在早期发现并修复问题。保证代码质量通过覆盖不同的逻辑路径和边界情况确保代码在各种情况下都能正确运行。
与功能测试的区别
单元测试专注于验证单个代码单元的内部逻辑不要求模拟复杂的实际场景。变量值的准确性不是重点重点是逻辑是否按预期执行。功能测试验证整个系统或子系统的功能是否满足需求通常在集成环境中进行涉及实际的外部资源和复杂的交互。
单元测试中的Mock实践 分析需要mock的对象和行为 确定哪些外部依赖如数据库、网络服务需要被mock。只mock那些必要的对象保持测试的简洁性。 创建mock对象的方式 使用Mock注解或Mockito.mock()方法创建mock对象。可以使用RunWith(MockitoJUnitRunner.class)或MockitoAnnotations.initMocks(this)来初始化Mock注解的字段。 mock的目的 隔离被测试单元确保测试专注于目标代码逻辑。控制依赖对象的行为和状态模拟各种异常和边界条件验证代码的健壮性和正确性。 mock对象和行为 使用when().thenReturn()模拟方法返回特定值。使用when().thenThrow()模拟方法抛出异常。使用thenReturn()多次或thenAnswer()模拟连续调用时的不同结果。使用verify()方法验证方法的调用次数和顺序确保逻辑执行的正确性。
这里我总结了一些些单元测试基本套路吧整理一个模板。
分析方法
假设我们有一个类 MyClass 和其中的一个方法 myMethod。在分析该方法时你需要考虑以下几个方面
输入参数方法接受哪些参数依赖对象方法中使用了哪些类的实例行为动作方法内部调用了哪些其他方法是否有外部依赖如数据库、网络调用等输出结果方法返回什么是否有副作用如修改了类的状态、写入日志等
分析示例
假设 MyClass 的 myMethod 如下
public class MyClass {private MyDependency dependency;public MyClass(MyDependency dependency) {this.dependency dependency;}public String myMethod(String input) {String transformedInput input.toUpperCase();boolean isValid dependency.validate(transformedInput);if (isValid) {return Valid: transformedInput;} else {return Invalid: transformedInput;}}
}分析步骤
输入参数input字符串依赖对象MyDependency通过构造函数注入行为动作调用了 dependency.validate(transformedInput)输出结果返回一个字符串形式为 Valid: transformedInput 或 Invalid: transformedInput
单元测试模板
import static org.mockito.Mockito.*;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.powermock.modules.junit4.PowerMockRunner;
import org.powermock.modules.junit4.PowerMockRunnerDelegate;
import org.mockito.runners.MockitoJUnitRunner;RunWith(PowerMockRunner.class)
PowerMockRunnerDelegate(MockitoJUnitRunner.class)
public class MyClassTest {Mockprivate MyDependency mockDependency;InjectMocksprivate MyClass myClass;Beforepublic void setUp() {MockitoAnnotations.initMocks(this);}Testpublic void testMyMethod_ValidInput() {// ArrangeString input test;String transformedInput TEST;when(mockDependency.validate(transformedInput)).thenReturn(true);// ActString result myClass.myMethod(input);// AssertassertEquals(Valid: TEST, result);verify(mockDependency).validate(transformedInput);}Testpublic void testMyMethod_InvalidInput() {// ArrangeString input test;String transformedInput TEST;when(mockDependency.validate(transformedInput)).thenReturn(false);// ActString result myClass.myMethod(input);// AssertassertEquals(Invalid: TEST, result);verify(mockDependency).validate(transformedInput);}
}模板解析
导入依赖导入了Mockito和JUnit的静态方法。测试类定义定义了 MyClassTest 测试类。Mock对象使用 Mock 注解创建 MyDependency 的mock对象。测试准备在 setUp 方法中初始化mock对象并创建 MyClass 实例。测试方法定义两个测试方法分别测试myMethod 在 validate 方法返回 true 和 false 的情况下的行为。
注意事项
测试覆盖确保测试覆盖了所有可能的输入和边界情况。行为验证使用 verify 方法验证依赖对象的方法调用情况。异常处理如果方法可能抛出异常编写相应的测试用例。
通过这个模板你可以系统地分析并编写单元测试确保测试的全面性和准确性。
题外话
当然现在idea 里面有相关的些单元测试的插件比如Squaretest或者你直接通过ChatGPT来写。但是你得知道原理。