单元测试
一个模块测试,针对最小可测单元来进行代码逻辑正确性的测试。(没有任何依赖的测试,在本测试类中的关注于对代码的逻辑正确性和功能实现进行验证)
集成测试
模拟真实开发环境,对多个类或者过个模块功能之间交互的整体功能进行验证的过程。
总之单元测试是对最小可测试单元的验证,而集成测试是对多个模块之间的交互和整体功能的验证。两者都是测试中的重要环节,可以互相补充,确保软件的质量和稳定性。
为什么做单元测试
好处:
1.提高系统稳定性,利于迭代。
2.有利于深度了解技术与业务。
3.单测成本低,速度快。(最直观的理解,故:在早期的单元测试就能发现bug,不仅可以省时省力,在开发流程上提高效率,也能降低反复修改出现的风险以及时间成本)
4.单测是最佳的、自动化的、可执行的文档。
5.单测驱动设计,提升代码简洁度和规范性,确保安全重构,代码修改后,单测仍然能通过,能够增强开发者的信心。
6.快速反馈,更快的发现问题,定位缺陷比集成测试更快更准确,降低修复成本。
单元测试框架
import java.util.Objects;
/**
* 单元测试
* @author yl
* @date 2024/01/23
*/
public class Demo {
public static final int INT_ZERO = 0 ;
public static boolean isPositive(Integer value) {
return Objects.nonNull(value)&&Integer.compare(value,INT_ZERO)>0;
}
public static boolean isLargerThan(Integer input,Integer compareTo){
if (!Objects.nonNull(input) || !Objects.nonNull(compareTo)){
return false;
}
return input.compareTo(compareTo)>0;
}
}
Junit:
Junit是最常用的Java单元测试框架之一,它提供了一组简单易用的API,可以方便地编写和运行单元测试。
class DemoTest {
@Test
void isPositive() {
assertTrue(Demo.isPositive(1));
assertFalse(Demo.isPositive(-1));
assertFalse(Demo.isPositive(0));
assertTrue(Demo.isPositive(Integer.MAX_VALUE));
assertFalse(Demo.isPositive(Integer.MIN_VALUE));
}
@Test
void isLargerThan() {
assertTrue(Demo.isLargerThan(1, 0));
assertFalse(Demo.isLargerThan(0, 1));
assertFalse(Demo.isLargerThan(1, 1));
assertTrue(Demo.isLargerThan(Integer.MAX_VALUE, 0));
assertFalse(Demo.isLargerThan(Integer.MIN_VALUE, 0));
assertFalse(Demo.isLargerThan(null, 0));
assertFalse(Demo.isLargerThan(0, null));
}
}
断言:在程序中用于检查某个条件是否为真的语句
assertTrue:如果条件为真,则程序继续执行;如果条件为假,则程序会抛出一个 AssertionError 异常(反之亦然)。
Mockito
Mockito是一个用于模拟对象的Java单元测试框架,它可以帮助开发人员创建和管理模拟对象,从而进行真正的单元测试。(功能强大、易于学习和使用、支持扩展等,但它可能会带来一些性能问题)
class DemoTest {
@Test
void isPositive() {
Demo demo = Mockito.mock(Demo.class);
Mockito.when(demo.isPositive(1)).thenReturn(true);//模拟方法调用的方法
Mockito.when(demo.isPositive(-1)).thenReturn(false);
Mockito.when(demo.isPositive(0)).thenReturn(false);
Mockito.when(demo.isPositive(Integer.MAX_VALUE)).thenReturn(true);
Mockito.when(demo.isPositive(Integer.MIN_VALUE)).thenReturn(false);
assertTrue(demo.isPositive(1));
assertFalse(demo.isPositive(-1));
assertFalse(demo.isPositive(0));
assertTrue(demo.isPositive(Integer.MAX_VALUE));
assertFalse(demo.isPositive(Integer.MIN_VALUE));
}
@Test
void isLargerThan() {
Demo demo = Mockito.mock(Demo.class);
Mockito.when(demo.isLargerThan(1, 0)).thenReturn(true);
Mockito.when(demo.isLargerThan(0, 1)).thenReturn(false);
Mockito.when(demo.isLargerThan(1, 1)).thenReturn(false);
Mockito.when(demo.isLargerThan(Integer.MAX_VALUE, 0)).thenReturn(true);
Mockito.when(demo.isLargerThan(Integer.MIN_VALUE, 0)).thenReturn(false);
Mockito.when(demo.isLargerThan(null, 0)).thenReturn(false);
Mockito.when(demo.isLargerThan(0, null)).thenReturn(false);
assertTrue(demo.isLargerThan(1, 0));
assertFalse(demo.isLargerThan(0, 1));
assertFalse(demo.isLargerThan(1, 1));
assertTrue(demo.isLargerThan(Integer.MAX_VALUE, 0));
assertFalse(demo.isLargerThan(Integer.MIN_VALUE, 0));
assertFalse(demo.isLargerThan(null, 0));
assertFalse(demo.isLargerThan(0, null));
}
}
单侧开发规范
AIR原则:自动化 独立性 可重复
FIRST原则:快速的 独立的 可重复的 自我验证 及时的(T-Timely)
BCDE原则
B:Border,边界值测试,包括循环边界、特殊取值、特殊时间点、数据顺序等。
C:Correct,正确的输入,并得到预期的结果。
D:Design,与设计文档相结合,来编写单元测试。
E:Error,强制错误信息输入(如:非法数据、异常流程、非业务允许输入等),并得到预期的结果
举例
public class DemoUtil {
public static final int INT_ZERO = 0;
public static boolean isPositive(Integer value) {
//整数返回true
return Objects.nonNull(value) && Integer.compare(value, INT_ZERO) > 0;
}
public static boolean isLargerThan(Integer input, Integer compareTo) {
if (!Objects.nonNull(input) || !Objects.nonNull(compareTo)) {
return false;
}
return input.compareTo(compareTo) > 0;
}
}
上述例子的单元测试应该如下所示
public class DemoUtilTest {
@Autowired
DemoUtil demoUtil;
@Test
//TODO 最简单的 Helper/Util/Validation 层
public void testIsPositive() {
Assert.assertFalse("返回值不为假",demoUtil.isPositive(-1));
Assert.assertFalse("返回值不为假",demoUtil.isPositive(0));
Assert.assertTrue("返回值不为真",demoUtil.isPositive(1));
Assert.assertFalse("返回值不为假",demoUtil.isPositive(null));
Assert.assertFalse("返回值不为假",demoUtil.isPositive(Integer.valueOf(-1)));
Assert.assertFalse("返回值不为假",demoUtil.isPositive(Integer.valueOf(0)));
Assert.assertTrue("返回值不为假",demoUtil.isPositive(Integer.valueOf(1)));
}
@Test
public void testIsLargerThan() {
Assert.assertFalse("返回值不为假",demoUtil.isLargerThan(null,null));
Assert.assertFalse("返回值不为假",demoUtil.isLargerThan(null,1));
Assert.assertFalse("返回值不为假",demoUtil.isLargerThan(1,null));
Assert.assertFalse("返回值不为假",demoUtil.isLargerThan(1,1));
Assert.assertTrue("返回值不为真",demoUtil.isLargerThan(1,0));
Assert.assertFalse("返回值不为假",demoUtil.isLargerThan(-1,0));
}
}
总结:
感谢每一个认真阅读我文章的人!!!
作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。
软件测试面试文档
我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。