在浏览了Utplsql 3.0.2的文档之后,我找不到旧版本中可用的断言api的任何引用。请告诉我是否有更新版本中的utassert.eqtable等效断言。
答案 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);