在utplsql版本3.3中是否有等效的utassert.eqtable(在utplsql版本2.X中可用)?

问题描述 投票:1回答:2

在浏览了Utplsql 3.0.2的文档之后,我找不到旧版本中可用的断言api的任何引用。请告诉我是否有更新版本中的utassert.eqtable等效断言。

unit-testing plsql oracle12c utplsql
2个回答
2
投票

我刚刚经历了同样的痛苦。大多数utPLSQL示例都是针对utPLSQL v2的。结果表明,这些断言已被弃用,并已被“期望”所取代。我发现a great blog post by Jacek Gebal描述了这一点。我试图把这个和其他有用的链接a page about how unit testing fits into Redgate's Oracle DevOps pipeline(我为Redgate工作,我们经常被问到如何最好地实现Oracle的自动化单元测试)。


0
投票

我不认为你可以直接比较表,但你可以比较游标,这是非常灵活的,因为你可以,例如,基于双重查询设置带有测试数据的游标,然后检查对表中的实际数据,如下所示:

  procedure TestCursorExample is
    v_Expected sys_refcursor;
    v_Actual sys_refcursor;
  begin
    -- Arrange (Nothing really to arrange, except setting the expectation).
    open v_Expected for
      select '[email protected]' as Email
      from dual;

    -- Act
    SomeUpsertProc('me', '[email protected]');

    -- Assert
    open v_Actual for
      select Email
      from Tbl_User
      where UserName = 'me';

    ut.expect(v_Actual).to_equal(v_Expected);
  end;

此外,上面的示例适用于Oracle 11,但如果你在12c,显然事情变得更容易,因为你可以使用the table operator with locally defined types

我使用了类似的解决方案来验证某行的某些列是否已更新,而其他列则未更新。您可以轻松打开原始数据的光标,某些列将替换为新的固定值。然后进行更新。然后使用所有列的新实际数据打开游标。您仍然必须编写查询,但它比将所有内容查询到变量并单独进行比较更紧凑。

并且,因为您可以在执行测试的实际“行为”步骤之前打开“预期”光标,您可以确保具有“预期”数据的查询不受测试本身的影响,甚至可以将该光标基于您要修改的数据。

为了比较数据,游标被序列化为XML。这可能有一些副作用。在上面的测试示例中,我的行为步骤实际上没有做任何事情,所以我得到了这个差异,显示了计数以及显示缺失的数据。如果您的游标有更多列,并且有多个差异,则有时需要几秒钟才能发现XML标记之间的差异。此外,目前存在一些边缘情况问题,我认为是因为修剪在XML中的工作原理。

  1) testcursorexample
      Actual: refcursor [ count = 0 ] was expected to equal: refcursor [ count = 1 ]
      Diff:
      Rows: [ 1 differences ]
        Row No. 1 - Missing:  <EMAIL>[email protected]</EMAIL>
      at "MySchema.MyTestPackage", line 410 ut.expect(v_Actual).to_equal(v_Expected);

另见:'comparing cursors' from utPLSQL 3 concepts

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