“存根”在编程中意味着什么?

问题描述 投票:97回答:7

例如,这句话是什么意思?

在任何现代Web应用程序中,与外部API集成几乎是一种保证。要有效地测试此类集成,您需要将其存根。一个好的存根应该易于创建,并且始终与实际的当前API响应保持同步。在这篇文章中,我们将概述使用存根的外部API的测试策略。

api stub
7个回答
94
投票

存根是系统中现有依赖关系(或协作者)的可控替代。通过使用存根,您可以在不直接处理依赖关系的情况下测试代码。

外部依赖关系 - 现有依赖关系: 系统中的一个对象是您的测试代码与您无法控制的对象进行交互。 (常见的例子是文件系统,线程,内存,时间等。)

例如下面的代码:

public void Analyze(string filename)
    {
        if(filename.Length<8)
        {
            try
            {
                errorService.LogError("long file entered named:" + filename);
            }
            catch (Exception e)
            {
                mailService.SendEMail("[email protected]", "ErrorOnWebService", "someerror");
            }
        }
    }

你想测试mailService.SendEMail()方法,但要做到这一点,你需要在测试方法中模拟一个Exception,所以你只需要创建一个Fake Stub errorService对象来模拟你想要的结果,那么你的测试代码就是能够测试mailService.SendEMail()方法。如您所见,您需要模拟来自另一个依赖项的结果,该结果是ErrorService类对象(Existing Dependency对象)。


90
投票

在这种情况下,stub意味着模拟实现。

也就是说,一个简单的假实现符合接口并用于测试。


52
投票

Layman的术语,它是虚拟数据(或假数据,测试数据等),您可以使用它来测试或开发代码,直到您(或另一方)准备好呈现/接收实际数据。这是程序员的“Lorem Ipsum”。

员工数据库还没准备好?与Jane Doe,John Doe等组成一个简单的。 API还没准备好?通过创建包含虚假数据的静态.json文件来构成虚假文件。


7
投票

在这种情况下,使用“stub”一词代替“mock”,但为了清晰和精确,作者应该使用“mock”,因为“mock”是一种存根,但是用于测试。为了避免进一步混淆,我们需要定义存根是什么。

在一般上下文中,存根是一段程序(通常是函数或对象),它封装了调用另一个程序的复杂性(通常位于另一台机器,VM或进程上 - 但并非总是如此,它也可以是本地程序宾语)。因为要调用的实际程序通常不在同一个内存空间,所以调用它需要许多操作,如寻址,执行实际的远程调用,编组/序列化要传递的数据/参数(和潜在的结果相同),甚至可能处理身份验证/安全性,等等。请注意,在某些上下文中,存根也称为代理(例如Java中的动态代理)。

模拟是一种非常具体和限制性的存根,因为模拟是另一个函数或对象的替代以进行测试。在实践中,我们经常使用模拟作为本地程序(函数或对象)来替换测试环境中的远程程序。在任何情况下,模拟可以在受限制的上下文中模拟被替换的程序的实际行为。

当需要调用远程过程(RPC)或远程对象(RMICORBA)时,大多数着名的存根显然都用于分布式编程。大多数分布式编程框架/库自动生成存根,因此您不必手动编写它们。存根可以从接口定义生成,例如用IDL编写(但您也可以使用任何语言来定义接口)。

通常,在RPC,RMI,CORBA等中,区分客户端存根(主要负责编组/序列化参数和执行远程调用)和服务器端存根(主要负责解组/反序列化)。参数并实际执行远程函数/方法。显然,客户端存根位于客户端,而服务器端(通常称为骨架)位于服务器端。

在处理对象引用时,编写好的高效和通用存根变得非常具有挑战性。大多数分布式对象框架(如RMI和CORBA)处理分布式对象引用,但这是大多数程序员在REST环境中避免的。通常,在REST环境中,JavaScript程序员使用简单的存根函数来封装AJAX调用(JSON.parseJSON.stringify支持对象序列化)。 Swagger Codegen项目为自动生成各种语言的REST存根提供了广泛的支持。


3
投票

您还有一个非常好的测试框架来创建这样的存根。我最喜欢的是Mockito还有EasyMock和其他...但Mockito很棒你应该读它 - 非常优雅和强大的包


1
投票

Stub是一个函数定义,它具有正确的函数名,正确的参数数,并产生正确类型的伪结果。

它有助于编写测试并作为一种脚手架,甚至可以在功能设计完成之前运行示例


0
投票

这句话几乎可以肯定地与房屋建筑阶段的一个类比 - “剔除”管道。在施工期间,当墙壁仍然打开时,粗糙的管道被放入。这对于施工继续是必要的。然后,当周围的一切都准备就绪时,人们会回来并添加水龙头和厕所以及实际的最终产品。 (例如参见How to Install a Plumbing Stub-Out

当你在编程中“存根”一个函数时,你可以构建足够的函数来进行解决(用于测试或编写其他代码)。然后,您稍后再回来并将其替换为完整实现。

© www.soinside.com 2019 - 2024. All rights reserved.