utPLSQL安装 - 当exec ut.run();

时间:2017-07-27 12:33:03

标签: oracle unit-testing plsql installation

我正在为我的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 environmentcurrent-schema设置似乎有问题?我查找了那些(SELECT SYS_CONTEXT ('USERENV', 'SESSION_USER') FROM DUAL;)的值,它返回了CORE--我用来安装脚本的sys管理员用户名。

更新2

排序可以让它工作......当我最初运行命令时,我被连接为我的默认用户CORE。我创建了一个新的连接作为我的UNIT_TEST_REPOS模式,然后我可以将它连接到" work"通过使用命令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来查看数据库,它显示了错误消息的更多详细信息。 utPLSQL error output on SQL Tools

我还在Google书籍 Oracle数据库的秘密中找到了有关oracle错误的信息,它有这个部分:

  

如果在指定的上下文中无法解析名称,则" ORA-06564:object object_name 不存在"引发,其中 object_name 是传递给过程NAME_RESOLVE的参数NAME的值。 如果在错误的上下文中解析现有对象,则指定的异常" ORA-04047:对象与指定的标志不兼容"被抛出。(大胆强调我的)

此外,当我尝试在UNIT_TEST_REPOS模式中执行测试脚本,并让它在我的CORE模式中显式调用测试时,

begin ut.run('CORE'); end;

它与之前的错误相同。

从本书的建议来看,听起来像utPLSQL用作其框架一部分的标志有错误。但它看起来与教程相同......

2 个答案:

答案 0 :(得分:1)

如果您可以直接在utPLSQL项目上发布此类问题,那就太棒了。 https://github.com/utPLSQL/utPLSQL/issues

我们无法关注stackoverflow,google群组和所有其他媒体。 你应该面对的问题应该可以通过utPLSQL v3.0.4来解决。 这是Oracle命名空间问题,当对象和模式都是相同的名称时(从我看到的)。

答案 1 :(得分:0)

不是解决方案,而是旁路。

如果我在UNIT_TEST_REPOS中创建包,那么它可以看到测试并执行它们。好像在CORE模式中存在一些配置问题阻止utplsql正确挂钩。我使用了一个单独的模式并将包放在那里,并且utPLSQL能够运行那里的测试。

实际的解决方案是修复CORE中的配置设置,以便utPLSQL对象和标志能够正确地看到对方。但我不确定在哪里看。