课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
软件测试随着互联网的不断发展而逐渐受到企业的重视,今天我们就一起来了解一下,单元测试与集成测试之间的区别。
单元测试vs集成测试
单元测试通常由代码的开发者编写,需要基于对代码内部的了解进行,属于白盒测试。典型来讲,我们通常会针对某个被测试函数,给定一系列输入以及外部对象的mock,然后测试它和外部对象的交互行为以及终的输出是否符合预期。因为外部依赖通常都被mock了,因此单元测试往往不需要配置数据库、邮件服务器等外部依赖,所以通常都较为容易编写,也较为容易执行。它可以在开发的时候随时执行,大部分的代码错误都可以通过单元测试所发现。
集成测试则是用来判断系统几个模块组合起来后,它们整体的行为是否符合预期。集成测试属于黑盒测试,它并不以了解实现细节为基础,而仅测试外部可见的公共接口。此外,集成测试一般也不使用mock,而是将它的外部依赖都纳入进来进行测试。换句话说,要执行集成测试,大都需要配置数据库、邮件服务器等外部依赖。这些外部依赖的交互过程通常要比执行几行代码慢上几个量级,因此集成测试的执行成本通常要比单元测试高不少。
端到端测试,也就是E2E测试,其实是一种特殊的集成测试。它特指将程序的所有部分都连接起来,然后站在整个程序的外部,从用户的视角测试程序的输入输出是否符合预期。
我们的测试策略是尽可能多的使用单元测试并达到足够的覆盖率,然后配合集成测试以及端到端测试来进一步保证模块间的正确耦合。这样能尽可能提高我们的测试效率,并且不以降低测试质量为代价。
单元测试API协议层
API协议层的主要外部依赖是domaininterface和具体的传输协议实现。对于domaininterface,可以很容易通过像gomock这样的工具进行mock。对于传输协议,如果是单纯的HTTP,那么利用Golang标准库中的httptest包可以很方便的对这部分进行测试。
在这一层的测试中,我们主要关注它是否可以处理不同的请求输入,例如非法的链接、错误的body编码等,以及在处理domaininterface所返回的不同数据或错误的时候,是否正确转化成了我们期望的响应,包括HTTPresponsecode和responsebody。通过调整输入和mock行为,不同情形下的处理逻辑都是可以被覆盖到的。
单元测试业务逻辑层
业务逻辑层的主要外部依赖是它所定义的一系列像UserRepository这样的外部接口。我们同样可以用gomock来为这些接口生成mock代码。
在这一层的测试中,我们主要关注它是否正确处理的了用户认证、权限验证、数据合法性检查等内部逻辑,以及和外部接口的交互行为,以及基于外部接口的响应所进行的进一步行为。配合函数的输入以及接口的mock行为,我们同样能够覆盖到其中的每一个内部逻辑。
集成测试外部依赖
对于外部依赖,我们采用将外部依赖集成进来,对它们整体进行集成测试。这里不采用单元测试的主要原因是如果使用mock将外部依赖mock掉的话,测试的大部分意义就丧失了。例如如果mock掉SQL接口而单元测试PostgreSQL的UserRepository实现,那么SQL语句是否合法可能就得不到测试,而它的实际执行结果同样也无法被测试到。如果抛弃这部分代码的验证,那么UserRepository剩下的代码只占了一小部分,并不能达到测试的目标。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。