【发布时间】:2018-01-31 20:06:02
【问题描述】:
我正在为我的 Oracle 数据库设置 utPL/SQL,一切似乎都已正确安装,但是当我尝试运行基本测试运行程序时,出现错误:ORA-04047: object specified is incompatible with the flag specified
问题
创建一个基本的空测试包后,我运行begin ut.run(); end;这行,这给了我以下错误:
Error starting at line : 1 in command -
BEGIN ut.run(); END;
Error report -
ORA-04047: object specified is incompatible with the flag specified
ORA-06512: at "UNIT_TEST_REPOS.UT_RUNNER", line 88
ORA-06512: at "UNIT_TEST_REPOS.UT_RUNNER", line 112
ORA-06512: at "UNIT_TEST_REPOS.UT", line 292
ORA-06512: at "UNIT_TEST_REPOS.UT", line 267
ORA-06512: at line 1
04047. 00000 - "object specified is incompatible with the flag specified"
*Cause: The object type implied by the flag does not match the type
of object specified.
*Action: Specify the correct object, or use the appropriate flag
应该发生的是它说以下内容:
Between string function
Finished in .451423 seconds
0 tests, 0 failed, 0 errored, 0 disabled, 0 warning(s)
我做了什么:
- 使用the installation guide here,我运行了windows脚本,通过执行为测试用户创建了模式
create_utplsql_owner.sql,执行了install.sql脚本,并执行了create_synonyms_and_grants_for_public.sql。这些是安装指南说要执行的所有脚本。一切似乎都奏效了——我没有看到任何错误。 (仔细检查了 install.log 文件 - 没有错误)。 -
在 utPLSQL 文档的 getting started tutorial 中,我创建了(大部分为空的)测试包,完全按照标题 创建测试包
中的说明create or replace package test_betwnstr as -- %suite(Between string function) end;
上下文
我在使用 Oracle 方面的经验有限。在digging around 之后,我得到了更多关于可能导致错误的上下文 - 似乎它可能与冲突的名称有关,但我看不出哪些名称会发生冲突。再说一次,这只是来自 utPLSQL 的全新安装,所以似乎有些东西配置错误,但我不知道是什么......
我查看了其他问题,但它们与用户权限不足有关。我使用管理员帐户(称为 CORE)运行脚本。
utPL/SQL 版本:3.0.2
Oracle 版本:11.2
更新 1
我查看了错误指向的 UT 代码行,我在“UNIT_TEST_REPOS.UT”处看到了代码,第 267 行如下:ut.run(ut_varchar2_list(sys_context('userenv', 'current_schema')), a_reporter, a_color_console, a_coverage_schemes, a_source_file_mappings, a_test_file_mappings, a_include_objects, a_exclude_objects );
所以user environment 或current-schema 设置似乎有问题?我查找了那些 (SELECT SYS_CONTEXT ('USERENV', 'SESSION_USER') FROM DUAL;) 的值,它返回了 CORE——我用来安装脚本的系统管理员用户名。
更新 2
可以让它工作......当我最初运行命令时,我作为我的默认用户 CORE 连接。我创建了一个新连接作为我的 UNIT_TEST_REPOS 架构,然后我可以使用命令 select ut.run() from dual; 让它“工作”,并将它作为一个表返回。
UNIT_TEST_REPOS.UT_VARCHAR2_ROWS('Finished in 0 seconds', '0 tests, 0 failed, 0 errored, 0 disabled, 0 warning(s)', ' ')
这适用于我的空测试场景,但是当我继续教程并添加真实的测试用例时,它给了我相同的结果...
因此,通过连接为不同的架构,我可以毫无错误地执行代码。但是它看不到其他用户的测试,所以这不是解决方案...
更新 3
使用 SQLTools 而不是 SQL Developer 查看数据库,它显示了错误消息的更多详细信息。
我还在 Google 书籍 Oracle 数据库的秘密 中找到了有关 Oracle 错误的信息,其中包含以下部分:
如果无法在指定的上下文中解析名称,则会引发“ORA-06564:对象 object_name 不存在”,其中 object_name 是参数的值NAME 传递给过程 NAME_RESOLVE。 如果在错误的上下文中解析现有对象,则会抛出异常“ORA-04047:指定的对象与指定的标志不兼容”。(我的粗体强调)
此外,当我尝试在 UNIT_TEST_REPOS 架构中执行测试脚本并让它在我的 CORE 架构中显式调用测试时,
begin ut.run('CORE'); end;
它得到了和以前一样的错误。
从这本书的建议来看,utPLSQL 作为其框架的一部分使用的标志听起来有一个错误。但它看起来和教程一样......
【问题讨论】:
-
当我创建一个测试包时,我通常使用类似于
BEGIN UTPLSQL.RUN(owner_in => 'MY_USER', testpackage_in => 'MY_UNIT_TEST_PACKAGE'); END;的代码运行测试。请注意,我正在运行 utPL/SQL 2.2 版,所以可能情况已经发生了变化。 -
@BobJarvis 我试过了,但它给出了语法错误,我怀疑会发生这种情况。似乎开发人员完全从 v2 重写了 v3,因此语法发生了巨大变化。我认为问题不在于 run() 行,而是配置设置...
-
感谢这篇文章。我完全错过了 utplsql 的升级。本周最佳新闻。我已经使用 2.2 大约十年了。抱歉,我还不能帮你解决你的问题,但我今晚要下载新版本。
标签: oracle unit-testing plsql installation