2012-08-13 52 views
1

我想在一个testcase/testsuite(通过selenium)中执行多个测试,并将一个数据库测试挂接到每个tearDown的末尾(断言不能在tearDown中调用)。phpunit数据库在拆解后测试

所以工作流程将是:

  • 设置连接到数据库,并在setUpBeforeClass()
  • 设置数据库(仅内容)的设置(架构)
  • 执行TEST01
  • TearDown内容
  • 断言数据库中的每个表是否有rowCount为零。

那么有没有办法将其他断言挂钩到每个tearDown的结尾?

我试图在assertPreConditions和assertPostConditions中的tearDown中进行安装,但那样很丑。提前

+0

你为什么不能把断言在'assertPostConditions'中,假设您对发布条件做出断言? 'tearDown'破坏你的数据库连接吗?如果是这样,把它们放在'tearDown'开始处。 – 2012-08-13 22:58:30

回答

0

THX看来你可以在任何地方使用断言,即使在tearDown()。这个测试用例(保存为testTearDown.php,与phpunit testTearDown.php运行)正确地给出了一个失败:

class TearDownTest extends PHPUnit_Framework_TestCase 
{ 

/** */ 
public function setUp(){ 
    echo "In setUp\n"; 
    //$this->assertTrue(false); 
    } 

/** */ 
public function tearDown(){ 
    echo "In tearDown\n"; 
    $this->assertTrue(false); 
    } 

/** */ 
public function assertPreConditions(){ 
    echo "In assertPreConditions\n"; 
    //$this->assertTrue(false); 
    } 

/** */ 
public function assertPostConditions(){ 
    echo "In assertPostConditions\n"; 
    //$this->assertTrue(false); 
    } 

/** 
*/ 
public function testAdd(){ 
    $this->assertEquals(3, 1+2); 
    } 

} 

但是,一个经验法则我已经是:如果软件是使我的生活困难,也许我做的有问题。你写了tearDown代码运行后,你想:“断言,如果在数据库中的每个表具有零的rowCount时

这听起来像你想验证单元测试代码已经被正确写入,在这种情况下,tearDown已经正确地完成了它的工作?这实际上与您正在测试的代码无关。使用phpUnit断言机制会令人迷惑和误导;在上面的示例中,当tearDown声明它告诉我testAdd()失败。如果它实际上是在tearDown()中的代码运行不正常,我想告诉它。因此,用于验证您的单元测试代码,为什么不使用PHP的断言:

所以我想如果你想要的删除()函数可以是这个样子:

public function tearDown(){ 
    tidyUpDatabase(); 
    $cnt=selectCount("table1"); 
    assert($cnt==0); 
    $cnt=selectCount("table2"); 
    assert($cnt==0); 
    } 
+0

你说得对。在单独的测试中测试tearDown的东西或者使用assert并在实际测试中使用'assertPostConditions'更有意义。我也决定使用'CHECKSUM TABLE'而不是行数。 Thx的答案 – user1441641 2012-08-24 17:36:47