如何使用phpunit测试此类,该类使用与数据库的连接

时间:2012-10-21 19:56:19

标签: php phpunit integration-testing

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

}

2 个答案:

答案 0 :(得分:3)

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

另一个选择是使用集成测试,但这需要您花费大量精力进行测试的设置和拆卸。您需要确保数据库中存在测试所需的任何数据。对这些类型的测试使用事务是很常见的,然后您可以在完成运行这些测试后回滚。

答案 1 :(得分:1)

您正在尝试测试哪个代码?它是使用您的database类的代码吗?如果是这样,您不需要引入PDO,因为您的database类已经提供了抽象(如果public $descriptor是私有的,那么它会更安全)。因此,您应该首先模拟您的database类,然后测试使用它的代码。 PHPUnit有一个sophisticated mocking system

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

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

功能测试的优势在于高级别,测试组件之间的所有交互,在最终用户使用它时测试系统。缺点是当测试失败时它只告诉你出了问题,而不是确切地指责哪个组件。所以我们有单元测试来单独测试每个组件。

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