我有一个PHPUnit测试用例类(由一些测试函数组成)。我想为类中的所有测试编写一个oneTimeSetUp()
函数来调用一次(与标准setUp()
函数不同,该函数在类中为每个测试调用一次)。换句话说,我正在寻找一个等同于JUnit @BeforeClass
annotation的PHPUnit。
与oneTimeTearDown()
函数相同的问题。
是否可以在PHPUnit中这样做?
答案 0 :(得分:79)
查看PHPUnit文档的section 6中的setUpBeforeClass()
。
对于一次tearDown,您应该使用tearDownAfterClass();
。
这两种方法都应该在你的类中定义为静态方法。
答案 1 :(得分:6)
我带着同样的问题来到这个页面,但是所有课程都接受了接受的答案,而对我来说这不是正确的答案。
如果你像我一样,那么你的第一次"整合测试"是清除数据库,并运行迁移。这使您自己进入所有测试的数据库基线。我此时不断更改迁移文件,因此设置基线确实是所有测试的一部分。
迁移需要一段时间,因此我不希望它在所有测试中运行。
然后我需要建立测试每个部分的数据库。我需要编写一个订单测试,但首先我需要创建一些产品并进行测试,然后我需要测试一个导入功能。
所以,我所做的是SUPER easy,但在互联网上没有得到很好的解释。我创建了一个简单的测试来设置数据库。然后在你的phpspec.xml文件中添加一个testsuite ....
<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()
时,我最终遇到了引导问题,我相信我可以解决这个问题,但我上面使用的方法非常有效。
答案 2 :(得分:1)
在这些情况下可以使用bootstrap
选项。
您可以从命令行调用它
phpunit --bootstrap myBootstrap.php
或将其放入XML文件中,如下所示:
<phpunit bootstrap="myBootstrap.php">
...
</phpunit>
答案 3 :(得分:0)
扩大接受的答案:
<li *ngFor="let page of pager.pages" [ngClass]="{active:pager.currentPage === page}">
<a (click)="setPage(page)">{{page}}</a>
</li>
,setUpBeforeClass()
,tearDownAfterClass()
,@beforeClass
都不在对象上下文中运行(静态方法)。您可以通过使用静态属性来保护任何@afterClass
代码来解决该限制,如下所示:
@before
它不能用于class MyTest extends PHPUnit\Framework\TestCase
{
private static $ready;
/**
* @before
*/
protected function firstSetUp()
{
if (self::$ready))
return;
/* your one time setUp here */
self::$ready = true;
}
}
,因为无法说出最后一次测试的时间。
答案 4 :(得分:0)
setUpBeforeClass()
是执行此操作的方法。
但是,您的问题有点暗示您可能正在将测试类用作多个测试类的基类。在这种情况下,setUpBeforeClass将在每个之前运行。如果只想运行一次,则可以使用静态变量对其进行保护:
abstract class TestBase extends TestCase {
protected static $initialized = FALSE;
public function setUp() {
if (!self::$initialized) {
// Do something once here for _all_ test subclasses.
self::$initialized = TRUE;
}
}
}
最后一个选项可能是test listener。