Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 测试存储过程的Ut PL SQL_Unit Testing_Stored Procedures_Utplsql - Fatal编程技术网

Unit testing 测试存储过程的Ut PL SQL

Unit testing 测试存储过程的Ut PL SQL,unit-testing,stored-procedures,utplsql,Unit Testing,Stored Procedures,Utplsql,我是UT PLSQL的新手。我们有一个包含大量存储过程的现有应用程序。最后的大多数过程都会将值插入或更新到表中。utplsql中是否有任何方法可以测试这些表值??我可以看到很多关于函数的例子,而不是存储过程 谢谢测试数据 在单元测试中,您可以测试的不仅仅是函数结果。在执行存储过程之后,您只需查询表,看看它是否插入了您希望插入的内容 根据存储的进程,可能很难准确地找到插入的数据,但在许多情况下,您可以这样做,因为您可以搜索特定的值,使用序列获取插入的ID,等等 要将数据与期望值进行比较,可以将数据

我是UT PLSQL的新手。我们有一个包含大量存储过程的现有应用程序。最后的大多数过程都会将值插入或更新到表中。utplsql中是否有任何方法可以测试这些表值??我可以看到很多关于函数的例子,而不是存储过程


谢谢

测试数据

在单元测试中,您可以测试的不仅仅是函数结果。在执行存储过程之后,您只需查询表,看看它是否插入了您希望插入的内容

根据存储的进程,可能很难准确地找到插入的数据,但在许多情况下,您可以这样做,因为您可以搜索特定的值,使用序列获取插入的ID,等等

要将数据与期望值进行比较,可以将数据选择为变量,并将其与期望值进行比较(如果需要比较多行,可以在游标循环中进行比较),但比较两个游标可能更容易,一个游标与期望值进行比较(可以使用
从双变量中选择
),一个是实际数据

文档,尤其是本章,包含了关于如何比较游标数据的各种示例。我不会将它们粘贴到这里,因为我不知道哪一个适用于您的案例,而且utPLSQL及其文档都非常活跃,因此,在需要时最好查看最新版本

将过程重构为一个包

然而,您可能会发现,很难通过它们输出的数据来测试大型、复杂的存储过程。我发现重构它最简单的方法是创建一个包。在包中,您可以像现在一样公开一个过程,但它可以调用包中的其他过程和函数,您也可以公开这些过程和函数。这样,测试这些单独的部分就更容易了,也许您可以在不需要写入数据的情况下测试大部分逻辑,从而使测试更容易编写,执行速度更快

这并不是完全优雅的,因为你只是为了测试而暴露部分,否则你是不会暴露的。然而,我发现将一个存储过程重构成一个包通常是非常容易的,特别是如果您已经在存储过程中使用了子过程,这样您就可以快速、无风险地得到一个易于测试的结构

它不必在包中,您也可以将其拆分为单独的较小过程,但我喜欢包,因为它们将存储过程的所有逻辑保持在一起,并且允许您以与以前大致相同的方式调用该过程。包只不过是一组存储过程、函数和类型。如果您的应用程序需要它,您甚至可以保留原始的存储过程,但让它调用包中的对应程序,这样您就可以在不需要更改任何客户端的情况下进行重构

将过程的部分重构为对象类型

如果再进一步,可以创建对象类型。这有很多优点,但它们的工作原理与软件包大不相同,所以如果您不熟悉它们,这可能是一个很大的进步

  • 首先,对象可以保持一个状态,如果需要,可以有多个状态。包也可以保存状态,但每个会话或对数据库的每次调用只能保存一个状态。对象类型允许您根据需要创建任意多的实例,并且每个实例都保持自己的状态
  • 使用对象类型,可以传递对象的实例。这意味着您可以通过向存储过程传递特定类型的对象,向存储过程中注入一点逻辑。此外,您可以创建object的子类型,因此如果您的过程不会将数据写入表,而是调用某个类型为X的方法进行实际保存,那么您可以使用类型为X的子类型Y进行测试,该类型Y实际上不会保存数据,而只是帮助您验证是否使用正确的参数调用了该方法。然后您将进入的领域是,这是一个非常有用的工具,可以提高测试效率
同样,客户机可能还没有准备好传递这样的对象,所以我倾向于创建两个(或更多)包过程。一个是申请的官方入口点。除了创建一个类型为X的对象并将其传递给第二个过程之外,它不会做太多的事情,第二个过程包含实际的逻辑(可以选择进一步拆分)。这样,我的应用程序可以调用一个简单的存储过程,而我的测试可以调用第二个存储过程,并在需要时向它传递子类型Y的实例