[英]PHPUnit: How do I create a function to be called once for all the tests in a class?
我有一个 PHPUnit 测试用例类(由一些测试函数组成)。 我想编写一个oneTimeSetUp()
函数,以便为我在类中的所有测试调用一次(与标准setUp()
函数不同,该函数为类中的每个测试调用一次)。 换句话说,我正在寻找一个等同于JUnit @BeforeClass
注释的 PHPUnit。
oneTimeTearDown()
函数的相同问题。
在 PHPUnit 中可以这样做吗?
查看 PHPUnit 文档第 6 节中的setUpBeforeClass()
。
一次tearDown你应该使用tearDownAfterClass();
.
这两种方法都应该在您的类中定义为静态方法。
如果您的所有测试都包含在单个类中,则setUpBeforeClass()
是执行此操作的方法。
但是,您的问题有点暗示您可能将测试类用作多个测试类的基类。 在这种情况下 setUpBeforeClass 将在每个之前运行。 如果您只想运行一次,则可以使用静态变量保护它:
abstract class TestBase extends TestCase {
protected static $initialized = FALSE;
public function setUp() {
parent::setUp();
if (!self::$initialized) {
// Do something once here for _all_ test subclasses.
self::$initialized = TRUE;
}
}
}
最后一个选项可能是测试侦听器。
我带着同样的问题来到这个页面,但是接受的答案是在所有课程中运行的,对我来说不是正确的答案。
如果您像我一样,您的第一个“集成测试”就是清除数据库并运行迁移。 这使您自己处于所有测试的数据库基线。 此时我会不断更改迁移文件,因此设置基线确实是所有测试的一部分。
迁移需要一段时间,所以我不希望它在所有测试中运行。
然后我需要建立测试每个部分的数据库。 我需要编写一个订单测试,但首先我需要创建一些产品并对其进行测试,然后我需要测试一个导入功能。
所以,我所做的非常简单,但在互联网上并没有很好地解释。 我创建了一个简单的测试来设置数据库。 然后在您的 phpspec.xml 文件中添加一个测试套件....
<testsuite name="Products">
<file>tests/in/SystemSetupTest.php</file>
<file>tests/in/ProductTest.php</file>
<file>tests/in/ProductImportTest.php</file>
</testsuite>
并在 SystemSetupTest.php ....
class SystemSetupTest extends ApiTester
{
/** @test */
function system_init()
{
fwrite(STDOUT, __METHOD__ . "\n");
self::createEM(); //this has all the code to init the system...
}
}
然后像这样执行它:
phpunit --testsuite 产品
最后,它更容易。 它将允许我正确构建我的系统。
此外,我使用的是 laravel 5。当使用setUpBeforeClass()
我最终setUpBeforeClass()
了引导程序问题,我确信我可以解决这个问题,但我上面使用的方法很完美。
bootstrap
选项可用于这些情况。
您可以从命令行调用它
phpunit --bootstrap myBootstrap.php
或者把它放在 XML 文件中,像这样:
<phpunit bootstrap="myBootstrap.php">
...
</phpunit>
扩展接受的答案:
setUpBeforeClass()
、 tearDownAfterClass()
、 @beforeClass
、 @afterClass
在对象上下文中运行(静态方法)。 您可以通过使用静态属性保护任何@before
代码来解决该限制,如下所示:
class MyTest extends PHPUnit\Framework\TestCase
{
private static $ready = false;
/**
* @before
*/
protected function firstSetUp()
{
if (static::$ready))
return;
/* your one time setUp here */
static::$ready = true;
}
}
但是,它不能用于@after
,因为无法确定上次测试的调用时间。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.