使用PHPUnit,如何在运行任何测试之前运行初始化代码?

使用PHPUnit,如何在运行任何测试之前运行初始化代码?,phpunit,Phpunit,目前,我们在setUpBeforeClass中运行代码来设置数据库。但是,这会在测试每个测试类之前运行。是否可以在运行任何测试之前让代码运行一次,也可以在所有测试完成后运行一些代码?为什么要这样做?单元测试应该相互独立,因此在运行每个测试之前,所有前提条件也应该恢复到相同的状态 如果您觉得需要为整个套件运行一次的初始化方法,那么您的测试可能设置不正确。我同意Kris的意见,即您希望避免此类行为,但如果需要,也许您可以这样做: class My_PHPUnit_Framework_TestCase

目前,我们在setUpBeforeClass中运行代码来设置数据库。但是,这会在测试每个测试类之前运行。是否可以在运行任何测试之前让代码运行一次,也可以在所有测试完成后运行一些代码?

为什么要这样做?单元测试应该相互独立,因此在运行每个测试之前,所有前提条件也应该恢复到相同的状态


如果您觉得需要为整个套件运行一次的初始化方法,那么您的测试可能设置不正确。

我同意Kris的意见,即您希望避免此类行为,但如果需要,也许您可以这样做:

class My_PHPUnit_Framework_TestCase extends PHPUnit_Framework_TestCase {
    function __construct() {
       parent::__construct();
       // Insert your one time setup scripts here
    }
}

然后确保您的测试扩展了My_PHPUnit_Framework_TestCase而不是PHPUnit_Framework_TestCase。

这正是引导文件的设计目的。默认情况下,PHPUnit将在当前目录的
bootstrap.php
中执行代码。您可以使用配置文件或命令行开关指向其他文件


在尝试定位要运行的测试之前,此文件只执行一次。它允许您在实例化或运行任何测试之前设置包含路径、自动加载程序、常量等。

据我所知,这相当于SetupBeforeClass实际上,所有测试用例都是在执行任何测试方法之前实例化的——每个测试方法一个数据集,每个方法有一个
@dataProvider
,另外还有一个实例。如果重写构造函数,则必须确保同时接受并传递这三个参数。@SubOne,这与setUpBeforeClass不同,它是一个statuc函数。我们希望将数据库打开并关闭一次,而不是每次测试都这样做。我们已经准备好了隔离测试的事务。虽然我原则上同意您的观点,但这样做有很多正当的理由,其中一个例子就是@SubOne提到的。我正在通过Travis.CI测试Laravel,我需要运行数据库创建脚本,以确保它有合适的测试环境。这就是我所寻找的。昨天有人向我提到这件事。我不知道为什么我没有想到这一点。我有同样的需求:在启动测试之前启动我的数据库。你能用你的详细解决方案发布一个答案吗?