2012-08-13 65 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