通用PL SQL测试存储过程

我是UT PLSQL的新手。我们有一个现有的应用程序,其中包含许多存储过程。最后的大多数过程都将值插入或更新到表中。 utplsql中有什么方法可以测试这些表值?除了存储过程,我可以看到很多关于函数的示例。

谢谢

doris331 回答:通用PL SQL测试存储过程

测试数据

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

根据存储的proc,可能很难准确地找到它插入的数据,但是在许多情况下,您将能够做到这一点,因为您可以搜索特定的值,使用序列来获取插入的ID。 , 等等。

要将数据与期望值进行比较,可以将数据选择到变量中,然后将其与期望值进行比较(如果需要比较多个行,可以在游标循环中执行此操作),但是比较两个游标可能会更容易,一个包含预期数据(您可以使用select from dual来构建),另一个包含实际数据。

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

将您的proc重构为一个软件包

尽管如此,您可能会发现很难通过它们输出的数据来测试大型,复杂的存储过程。我发现重构此问题的最简单方法是创建一个程序包。在程序包中,您可以像现在一样公开一个过程,但是它可以调用程序包中的其他过程和函数,您也可以公开它们。这样,测试那些单独的部分会更容易,也许您可​​以测试大部分逻辑而无需编写数据,从而使测试更易于编写和执行。

这并不完全优雅,因为您只是出于测试目的而暴露零件,否则就不会暴露。不过,我发现将存储的proc重构为包通常非常容易,尤其是如果您已经在存储的proc中使用了子过程,这样一来您就可以快速且无风险地获得易于测试的结构

它不必放在程序包中,您也可以将其拆分成较小的程序,但是我喜欢程序包,因为它们将存储的proc的所有逻辑都保存在一起,并且它允许您调用proc与您之前大致相同。程序包不过是一组存储过程,函数和类型的分组集合。如果您的应用程序需要它,您甚至可以保留原始存储的proc,但让它在包中调用它的对应对象,这样您就可以进行重构,而无需更改任何客户端。

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

如果更进一步,则可以设置对象类型。这样做有很多优点,但是它们与软件包的工作方式大不相同,因此,如果您不熟悉它们,这可能是一大步。

  • 首先,对象可以保持状态,如果需要,可以具有多个状态。程序包也可以保存状态,但是每个会话或每个数据库调用只能包含一个。对象类型使您可以根据需要创建任意多个实例,并且每个实例都保持自己的状态。
  • 使用对象类型,您可以传递对象的实例。这意味着您可以通过向存储过程中传递某种类型的对象,从而向存储过程中注入一些逻辑。此外,您可以创建对象的子类型,因此,如果您的过程不会将数据写入表中,而是调用某种类型X的方法进行实际保存,则可以使用类型X的子类型Y进行测试,实际上并不会保存数据,而只是可以帮助您验证是否使用正确的参数调用了该方法。然后,您进入mocking区域,这是使测试更有效的非常有用的工具。

同样,客户端可能还没有准备好传递这样的对象,因此我倾向于创建两个(或更多)打包过程。一个是该应用程序的官方入口点。除了创建一个类型为X的对象并将其传递给包含实际逻辑(可选地进一步拆分)的第二个过程之外,它不会做很多事情。这样,我的应用程序可以调用一个简单的存储过程,而我的测试可以调用第二个存储过程,并在需要时将其传递给子类型Y的实例。

本文链接:https://www.f2er.com/3105660.html

大家都在问