我一直在阅读this手册,但我不明白为什么$ stack会在每个测试函数后丢失值。
这是我的代码:
require_once BASE . 'Transaction.php';
class TransactionTest extends PHPUnit_Framework_TestCase
{
protected $stack;
protected function setUp()
{
Database::getInstance()->connect();
$this->stack = new Transaction(123456789);
}
public function testInsert()
{
$data['name'] = 'Omega';
$this->stack->set($data);
$this->assertTrue($this->stack->save());
}
public function testUpdate()
{
$object = PHPUnitReflectionClass::getInstance($this->stack);
$this->assertEquals(array('name' , 'Omega'), $object->getProperty('name'));
}
}
在" testUpdate"功能,我没有名字。
如果我只是复制所有PHPUnit示例,所有测试都将完美运行,但我无法在下一个函数中使用var_dump查看值。这是另一件我无法理解的事情。
答案 0 :(得分:1)
单位测试应该不依赖于其他测试,它被认为是不好的做法。单元测试的关键是它们在受控和隔离的环境中运行。在每个测试方法之前和之后分别调用setUp()
和tearDown()
方法。因此,在每次测试之前,您的$stack
属性都会被覆盖。您在链接到的文档中也指出了这一点(仅在示例4.1下面):
setUp()
和tearDown()
模板方法针对测试用例类的每个测试方法(以及新实例)运行一次。
(您还假设您的测试类中的方法按照它们编写的顺序运行,但情况并非如此。大部分时间它们都在运行相同的顺序,但你不能依赖它。)
答案 1 :(得分:1)
问题是:
对于第一个问题,您可以使用setUpBeforeClass
方法。来自doc:
每次测试都会运行一次setUp()和tearDown()模板方法 测试用例类的方法(以及新实例)。
另外,还有setUpBeforeClass()和tearDownAfterClass()模板 在运行测试用例类的第一个测试之前调用方法 并且在分别运行测试用例类的最后一次测试之后。
对于第二个问题,使测试相互依赖是一种不好的做法,但PHPUnit支持在测试方法之间声明显式依赖关系,因此您可以使用@depends
注释来表达依赖关系:如果测试失败,则不执行另一个。
所以你的测试类可以是,例如:
require_once BASE . 'Transaction.php';
class TransactionTest extends PHPUnit_Framework_TestCase
{
protected static $stack;
public static function setUpBeforeClass()
{
Database::getInstance()->connect();
$this->stack = new Transaction(123456789);
}
public function testInsert()
{
$data['name'] = 'Omega';
$this->stack->set($data);
$this->assertTrue($this->stack->save());
}
/**
* @depends testInsert
*/
public function testUpdate()
{
$object = PHPUnitReflectionClass::getInstance($this->stack);
$this->assertEquals(array('name' , 'Omega'), $object->getProperty('name'));
}
}
希望这个帮助