为什么我的PHPUnit Fixtures Stack测试工作不正常?

时间:2015-09-14 19:34:51

标签: php phpunit fixtures

我一直在阅读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查看值。这是另一件我无法理解的事情。

2 个答案:

答案 0 :(得分:1)

单位测试应该依赖于其他测试,它被认为是不好的做法。单元测试的关键是它们在受控和隔离的环境中运行。在每个测试方法之前和之后分别调用setUp()tearDown()方法。因此,在每次测试之前,您的$stack属性都会被覆盖。您在链接到的文档中也指出了这一点(仅在示例4.1下面):

setUp()tearDown()模板方法针对测试用例类的每个测试方法(以及新实例)运行一次。

(您还假设您的测试类中的方法按照它们编写的顺序运行,但情况并非如此。大部分时间它们都在运行相同的顺序,但你不能依赖它。)

答案 1 :(得分:1)

问题是:

  1. 在每次测试方法调用之前调用setup方法;
  2. 你的考试是相互依赖的。
  3. 对于第一个问题,您可以使用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'));
        }
    }
    

    希望这个帮助