Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在包含远程数据库的Oracle上测试SQL查询_Java_Sql_Oracle_Unit Testing_Mocking - Fatal编程技术网

Java 在包含远程数据库的Oracle上测试SQL查询

Java 在包含远程数据库的Oracle上测试SQL查询,java,sql,oracle,unit-testing,mocking,Java,Sql,Oracle,Unit Testing,Mocking,我们的开发数据库(Oracle 9i)使用到远程共享数据库的远程数据库链接 这个决定是在几年前做出的,当时将一些数据库模式放在开发机器上是不切实际的——它们太大了 我们在开发机器上有特定的模式,我们通过使用Oracle的数据库链接以及开发机器上的一些同义词使远程模式看起来是本地的 我遇到的问题是,我想测试一段SQL,它将数据库链接两侧的模式中的表连接起来 e、 g.(简化案例): a在本地数据库上 b位于删除数据库上 我在语言环境数据库中有一个同义词,因此“b”实际上指向b@remotedb.

我们的开发数据库(Oracle 9i)使用到远程共享数据库的远程数据库链接

这个决定是在几年前做出的,当时将一些数据库模式放在开发机器上是不切实际的——它们太大了

我们在开发机器上有特定的模式,我们通过使用Oracle的数据库链接以及开发机器上的一些同义词使远程模式看起来是本地的

我遇到的问题是,我想测试一段SQL,它将数据库链接两侧的模式中的表连接起来

e、 g.(简化案例):

  • a在本地数据库上
  • b位于删除数据库上
  • 我在语言环境数据库中有一个同义词,因此“b”实际上指向b@remotedb.
由于链接,在开发环境中运行查询需要很长时间。这些查询在生产中运行良好(我认为基于Oracle成本的Optimizer无法很好地处理数据库链接)

在过去,我们不太擅长为这些类型的查询编写单元测试——可能是因为性能差——所以我想开始为它们创建一些测试

是否有人有任何策略来为这样的查询编写单元测试,从而避免使用数据库链接的性能问题


我通常会考虑尝试模拟远程服务的方法,但由于所有这些都是在SQL查询中进行的,因此我看不到任何轻松模拟remove数据库的方法

将相关数据复制到开发数据库中,并在本地创建表

理想情况下,只需构建一个测试用例,它告诉您:

  • SQL是正确的(它解析)
  • 它使用几行测试数据正常运行
  • 不要沉迷于“让我们复制一切”,因为这意味着你将不再知道你正在测试什么(以及你遗漏了什么)

    如果有疑问,请创建一个仅包含一条记录的表
    b
    。如果您在该区域中遇到错误,请在了解可能失败的位置时添加更多行

    如果您想将其带到边缘,请在单元测试中创建测试表(包含所有数据)。通过这种方式,您可以记录正在使用的测试数据

    [编辑]您需要的是一个测试数据库。不要对可能更改的数据库运行测试。理想情况下,作为第一步,测试应该拆除整个数据库并从头开始重新创建它(表、索引、数据、所有内容)


    在这个测试数据库中,只保留定义良好的测试数据,这些数据只会通过定义新的测试(而不是由“正在做某事”的人)进行更改。如果可以,请尝试对内存中的数据库运行测试。

    将相关数据复制到开发数据库中,并在本地创建表

    理想情况下,只需构建一个测试用例,它告诉您:

  • SQL是正确的(它解析)
  • 它使用几行测试数据正常运行
  • 不要沉迷于“让我们复制一切”,因为这意味着你将不再知道你正在测试什么(以及你遗漏了什么)

    如果有疑问,请创建一个仅包含一条记录的表
    b
    。如果您在该区域中遇到错误,请在了解可能失败的位置时添加更多行

    如果您想将其带到边缘,请在单元测试中创建测试表(包含所有数据)。通过这种方式,您可以记录正在使用的测试数据

    [编辑]您需要的是一个测试数据库。不要对可能更改的数据库运行测试。理想情况下,作为第一步,测试应该拆除整个数据库并从头开始重新创建它(表、索引、数据、所有内容)


    在这个测试数据库中,只保留定义良好的测试数据,这些数据只会通过定义新的测试(而不是由“正在做某事”的人)进行更改。如果可以,请尝试对内存中的数据库运行测试。

    我建议使用物化视图。这些视图在本地存储远程数据

    我建议使用物化视图。这些视图在本地存储远程数据

    您应该在开发时创建所需的所有模式的精确副本,但不包含所有数据。您应该用足够的数据填充模式,以便进行适当的测试。您还可以通过从生产服务器导出统计信息并将其导入到要复制的模式的开发数据库中,来操纵优化器,使其在测试系统上的行为类似于生产。这样,查询将使用您创建的数据集运行,但查询将使用类似于生产的计划进行优化。然后,您可以从理论上估计它将如何在生产中扩展。

    您应该在开发过程中创建所需的所有模式的精确副本,但不包含所有数据。您应该用足够的数据填充模式,以便进行适当的测试。您还可以通过从生产服务器导出统计信息并将其导入到要复制的模式的开发数据库中,来操纵优化器,使其在测试系统上的行为类似于生产。这样,查询将使用您创建的数据集运行,但查询将使用类似于生产的计划进行优化。然后,您可以从理论上估计它将如何在生产中扩展。

    从理论上讲,要进行单元测试,您可以使用根据测试用例创建和设计的任何一组受控数据。它不必是您的实时或开发系统。这是假设你的装置足够便携。在进行集成测试时,您可以使用当前的数据库/应用程序对其进行测试,集成测试也可以在实时系统上进行(因此不需要数据库链接-我知道您的实时数据库位于一个位置)

    我想说的是,您可以/应该在模拟不同“用例”的受控数据集上测试您的单元(即组件、查询或您定义为单元的任何内容)
       select a.col, b.col
       from a, b
       where a.b_id = b.id