【问题标题】:How can I test function with logic inside sql querys?如何在 sql 查询中使用逻辑测试函数?
【发布时间】:2021-03-29 14:31:05
【问题描述】:

我的问题是我有巨大的 SQL 查询,其中包含逻辑并且需要以某种方式进行测试。我正在使用 PHP 并一起尝试 PHPUnit。我有很多类似于这个的函数,它们内部有不同级别的逻辑,我需要对每一个函数进行自动化测试。例如,返回某些内容的查询取决于多个表和状态。代码示例:

<?php

use \somewhere\controller;

class cidade extends controller {
    // query() comes from controller, and it's a pdo query
    public function listar () {
        return $this->query(
            'SELECT 
                c.id, s.descricao, c.dataInicial, c.dataFinal, c.valor 
            FROM comissao c left join servico s ON (c.servico = s.id)
            WHERE (CURDATE() BETWEEN c.dataInicial AND c.dataFinal)
                OR (CURDATE() > c.dataInicial AND c.dataFinal IS NULL)'
        );
    }
}

返回这个

如果我使用此设置(我仅在 sqlfiddle.com 中创建此设置)

CREATE TABLE IF NOT EXISTS `servico` (
  `id` int(6) unsigned NOT NULL,
  `descricao` varchar(50) NOT NULL
) DEFAULT CHARSET=utf8;
INSERT INTO `servico` (`id`, `descricao`) VALUES
  (1, 'Algo'),
  (2, 'Alguma coisa'),
  (3, 'Outra coisa');
  
CREATE TABLE IF NOT EXISTS `comissao` (
  `id` int(6) unsigned NOT NULL,
  `servico` int(6) unsigned NOT NULL,
  `dataInicial` date NOT NULL,
  `dataFinal` date,
  `valor` decimal(15,2) NOT NULL
) DEFAULT CHARSET=utf8;
INSERT INTO `comissao` (`id`, `servico`, `dataInicial`, `dataFinal`, `valor`) VALUES
  (1, '1', '2021-03-01', '2021-03-10', 12.30),
  (2, '2', '2021-03-01', '2021-03-10', 77.30),
  (3, '3', '2021-03-15', '2021-04-06', 1.30),
  (4, '1', '2021-03-28', NULL, 15.30),
  (5, '2', '2021-03-28', NULL, 6.30);

但在我的日常工作中,我会更改此数据库,将我的测试更改为新结果会很复杂。

我已经读过的一些内容:我想创建一个数据库只是为了测试,但这将是一项巨大的工作,所以我开始寻找一种方法来“创建”一个基本的假货这些查询的数据库,但我找不到。所以我只看了一分钟关于 dbunit 的文章,但似乎不适用于 PHPUnit 新版本,所以我认为它已被弃用。在 PHPUnit 文档的其他一些地方,我发现了关于依赖注入和模拟我的数据库结果的东西,但实际上,我需要测试我的查询会得到什么结果,而不是自己设置结果。

【问题讨论】:

  • 您自己说过——“我需要测试我的查询会得到什么结果”,为此创建一个测试数据库听起来是正确的选择。如果您的应用程序要变得更大,我建议您考虑使用框架和 ORM 来帮助您编写所需的查询。大多数框架也有一些用于为数据库创建集成测试的库。

标签: php unit-testing testing phpunit dbunit


【解决方案1】:

如果您想在实时数据库中运行测试而不更改它,那么您需要使用命名事务。

一开始你想要:

BEGIN TRANSACTON Test123

然后在完成测试 SQL 代码后,运行

ROLLBACK TRANSACTION Test123

现在您可以对实时数据库进行任何更改,但不会生效。 您还可以在外部事务中包含子事务,因此您不必担心嵌套测试。只需确保自动生成一个唯一名称,而不是上面的“Test123”。

对于测试,我建议创建一个开始和结束包装方法。 Start 将调用 begin tran 并设置您的测试数据。然后最终包装器将对您的输入数据进行增量比较,然后通过回滚进行清理。在这期间你做你的测试。

对于测试预期结果和实际结果的超级简单方法,我强烈推荐 AirSquirrels 的 Beyond Compare。它有一些非常强大的命令行选项,我每天都会在我的测试例程中使用它们。如果您使用一种简单的方法将数据(预期和实际)导出到文本文件,它可以将它们进行比较,然后在有差异时进行报告。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-09
    • 2016-06-28
    • 2019-10-22
    相关资源
    最近更新 更多