在浏览了Utplsql 3.0.2的文档之后,我找不到旧版本中可用的断言api的任何引用。请告诉我是否有更新版本中的utassert.eqtable等效断言。
我刚刚经历了同样的痛苦。大多数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的自动化单元测试)。
我不认为你可以直接比较表,但你可以比较游标,这是非常灵活的,因为你可以,例如,基于双重查询设置带有测试数据的游标,然后检查对表中的实际数据,如下所示:
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);