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

时间:2017-10-15 04:27:26

标签: unit-testing plsql oracle12c utplsql

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

1 个答案:

答案 0 :(得分: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 'me@example.com' as Email
      from dual;

    -- Act
    SomeUpsertProc('me', 'me@example.com');

    -- 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>me@example.com</EMAIL>
      at "MySchema.MyTestPackage", line 410 ut.expect(v_Actual).to_equal(v_Expected);

另请参阅:'comparing cursors' from utPLSQL 3 concepts