【发布时间】: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