2

我在另一个文档中读到,具有与数据库连接的方法的类必须通过集成测试进行测试。我试图找到一个例子,但我没有找到任何,只有理论。我对测试的经验很少。能给我举个例子?一个链接?,一些东西(而不仅仅是理论,因为我读了很多),像这样的东西?我认为这不是一个奇怪的案例。如果它可能与 php 和 sql 或类似。

如果您不了解集成测试,您如何测试此类问题?

class database{

public $server;
public $database;
public $password;
public $user;
public $descriptor;


function __construct(){
$this->server="localhost";
$this->database="mydb";
$this->user="stackoverflow";
$this->password="1234";

$this->descriptor=mysql_connect($this->server,$this->user,$this->password);
mysql_select_db($this->database,$this->descriptor); 
}


function make_request($query){
$response=mysql_query($query,$this->descriptor);
return $response;
}


function close_connection(){
mysql_close($this->descriptor);
}

function number_rows($result_query){
return mysql_num_rows($result_query);
}

}
4

2 回答 2

4

查看PHPUnit进行单元测试。然后,您可以使用模拟对象来模拟依赖项(数据库调用)以返回虚拟数据。因为您正在尝试测试某个逻辑单元而不是您的数据库层,所以它应该是可以接受的,并且可以让您对您的代码正常工作有一定的信心。

另一种选择是使用集成测试,但这需要您在测试的设置和拆卸中投入大量精力。您需要确保您的测试所需的任何数据都存在于您的数据库中。通常将事务用于这些类型的测试,然后您可以在完成运行这些测试后回滚。

于 2012-10-21T23:59:14.313 回答
1

您要测试的是哪个代码?是使用您的database课程的代码吗?如果是这样,您不需要引入 PDO,因为您的database类已经提供了一个抽象(好吧,如果public $descriptor是私有的会更安全)。因此,您应该首先模拟您的database类,然后测试使用它的代码。PHPUnit 有一个复杂的模拟系统

您可能想要测试的另一件事是这个database类本身?在这种情况下,您将不得不接受 MySQL 数据库依赖,以及给您带来的速度冲击。为该测试设置一个完全专用的 MySQL 数据库。如果您不介意速度下降,请考虑在函数中创建数据库并在setUp()函数中的每次测试后将其删除tearDown()

您可能想要测试的第三件事是您的网站(或其他)作为一个整体工作,并连接到数据库等。这是功能测试(也称为集成测试)。如果您的系统提供 Web 服务 API,那么您可以使用它来测试它。否则,您可以使用 Selenium(仍然使用 PHPUnit)通过远程控制真实浏览器进行测试。如果您的测试只从数据库中读取,您可以使用您的实时系统;但是假设写入会在某个时候发生会更明智,因此使用自己的专用测试数据库对网站的测试版本进行测试。

功能测试的优势在于它是高级别的,测试组件之间的所有交互,测试最终用户将使用的系统。不利的一面是,当测试失败时,它只会告诉您出了点问题,而不是确切地说应该归咎于哪个组件。所以我们有单元测试来单独测试每个组件。

我知道你这比你想要的更多的文本,更少的代码!但你实际上问了一个相当理论的问题!只需尝试为此代码设置一些单元测试,观察在使用它们的第一个月会出现什么问题,你就会明白为什么以及在哪里使用模拟。

于 2012-10-28T04:17:47.200 回答