如何测试SQL数据库

时间:2014-05-26 13:52:02

标签: sql unit-testing testing

对于大学,我必须为一家销售老爷车的虚构公司设计一个数据库。每周都有一个新的任务要完成。这些是对商务规则和/或新要求的更改。 这意味着我们将拥有逐页构建数据库(包括测试数据)的数据库演变脚本,因此每个新工作表都是新版本(演变)。

其中一个要求是进行适当的测试(在SQL中)。我非常熟悉单元测试,例如JUnit,但我从未做过这样的事情。 对于初学者来说,表有主键和外键,NOT NULL和其他约束。

我该如何测试

  • 数据的完整性(
  • 关键约束(主要和外国)
  • NOT NULL约束
  • 检查约束

使用SQL和一些有用的工具?最好,我想自动运行测试。

如前所述,数据库将填充虚拟数据。

澄清问题: 我的队友只知道一些SQL,仅此而已。所以不可能使用像JUnit这样的东西。 有没有"东西"简单易用,最好是在SQL或某些批处理中执行SQL" thing"这

  • 确实运行数据库演变脚本
  • 断言查询的成功/失败
  • 会自动将用于单个测试的修改包装在一个事务中,该事务将被回滚而不是最终提交,并查看事务/回滚是否执行没有错误?

如果没有,那么问题的简单易用方法是什么?

2 个答案:

答案 0 :(得分:1)

使用您用于测试应用程序代码的相同单元测试框架。如果你没有使用它,只需编写查询(测试都是查询)并阅读结果。在每个测试中,针对您想要测试的任何内容运行针对您的数据库的查询。

  • 要测试模式本身(例如,给定列是否具有外键),请针对数据库/表空间/描述模式的任何内容运行查询 - MySQL中的information_schema,Oracle数据字典视图或其他适用于您正在使用的数据库 - 选择应该存在的行,并期望它们各自返回一行。例如,如果您有用户和薪水表的表,并且想要测试薪水是否为外部键入用户,则在MySQL中

    use information_schema;
    select count(*)
    from key_column_usage
    where table_schema = 'your_database' and
      table_name = 'paychecks' and
      column_name = 'user_id' and
      referenced_table_name = 'users' and
      referenced_column_name = 'id';
    
  • 要测试数据,请运行查询计算与数据库中预期的偏差,并期望它们不返回任何行。例如,如果您有用户,薪水和tax_payments表,并且您希望没有薪水的用户永远不会有tax_payments,

    select count(*)
    from users u
    where exists (select 1 from tax_payments tp where u.id = tp.id) and
      not exists (select 1 from paychecks p where u.id = p.id);
    

如果您知道您的架构可以防止错误发生(通过非空约束或外键或者您有什么),则无需检查该错误的数据。另一方面,这是大学,所以也许你会被要求做两件事。

答案 1 :(得分:0)

What we do正在将测试集成到部署系统中。

一般来说步骤:

  1. 安装系统:用户,表格,视图,触发器等;
  2. 添加系统必需的数据(默认数据,如不同性别等);
  3. 通过批量插入行来运行系统检查:插入行并检查它们是否失败,并相应地采取行动(我们在Oracle中使用SQLLoader来执行此操作);
  4. 运行手写测试,测试系统的模糊部分,并使用应该解决的旧已知错误。