课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
单元测试技术是程序员在学习软件测试的时候需要重点掌握的一项测试技术,而今天我们就一起来了解一下,单元测试技术的应用场景都有哪些。
单元测试技术之获取程序状态
由于单元测试代码和程序代码链接到了一起,所以理论上,单元测试代码可以获得程序内部的所有状态。但在有些场景下,获取方式并不那么直接。例如,对于C++或其他面向对象语言来说,由于采用了各种形式的封装,从语言层面实现了对程序状态的隐藏,使得测试代码无法直接获取所有的状态。
在C++中,主要的封装方式就是类里面的private成员。对于测试代码来说,无法直接获取一个对象的private成员的状态,也无法调用一个类的private方法。
通常,为了做到可测试,我们可以把一些类的private成员通过public函数的方式暴露出来。但过多的暴露内部实现也会破坏封装性。
这个时候,比较常见的方法是使用friendclass。我们可以把的单元测试代码所在的class作为要访问的类的friendclass,这样就可以绕开private的限制,直接访问类里面的所有成员。
总的来说,C++中的封装特性对写单元测试造成了一些困扰。而在其他一些语言中,由于不存在private的限制,对于写单元测试来说则相对友好一些。我们需要在封装和可测试性之间寻找一个平衡点,不建议为了写单元测试而随意破坏封装性。在ZBS项目中,我们只有在必要的测试代码中才会使用friendclass。
单元测试技术之Mock
单元测试中另一个常用的技术就是Mock。通过Mock,我们可以对程序内部的行为进行检验,也可以模拟一些特定的行为。
例如,当我们想确认存储系统对于『创建文件』这个操作,是否按照预期先写了日志,然后才写的元数据,那么我们可以通过Mock底层的IO模块,截取存储系统发送给底层IO系统的请求的方式,来校验存储系统的行为是否符合预期。
在ZBS中,Mock是我们用的多的测试手段,因为我们需要模拟各种各样的异常场景,而且还要精确的控制异常触发的时间、顺序、以及具体异常行为。
其实Mock并不复杂,在C/C++中Mock就是多态,在上层代码并不感知的情况下,下层的模块的逻辑发生了变化。
在C中,多态主要是通过函数指针实现的。一个的例子就是Linux中的VFS。VFS中定义了一组函数指针。对于文件系统来说,只需要实现这些函数指针就可以了。不同的文件系统的实现不同,也就是因为他们注册的函数不同。
为了测试VFS的行为,我们只需要在测试代码中注册一个Mock文件系统。这个Mock文件系统和其他文件系统一样,实现了这一组函数指针。这样,我们就可以截获所有VFS发给文件系统的请求,并可以按照测试项目预设的逻辑进行返回。
在C++中,除了可以使用函数指针以外,我们实现多态的方式还有继承和模板。我们先来介绍一下继承。
如果我们想要Mock一个模块,我们可以将这个类拆分成基类和子类。基类中之定义了接口,实现全部在子类中。在测试代码中,我们可以继承基类,这样就可以实现Mock一个模块的目的。
然而,仅仅完成了Mock类的实现并不足够。对于完整的程序的来说,内部会划分成很多的层次。如果我们想对上层模块进行测试,且还要Mock一个底层的模块,那如何保证上层代码会使用到Mock类,而不是原始的类的。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请在707945861群中学习了解。