2017-08-03 3 views
1

Ich schreibe phpunit Testfall Methode, die einen Parameter akzeptieren.Wie kann ich Daten an eine phpunit Testmethode übergeben?

Mein Code ist wie folgt

class myTestCase extends PHPUnit_Framework_TestCase 
{ 
    public function testMyCase($date){ 

     $resultSet=$this->query("select * from testCase where date='$date'"); 
     $this->assertTrue($resultSet,True); 
    } 
} 

Ich versuche, über Testfall von Linux-Terminal zu laufen.

phpunit --filter testMyCase myTestCase.php 

Aber weiß nicht, wie Parameter übergeben werden. Bitte helfen Sie.

Vielen Dank.

+0

mmm scheint nicht möglich. Überprüfen Sie diese Antwort kann Ihnen in gewisser Weise helfen https://StackOverflow.com/a/32467538/2270041 – Matteo

+0

Das zweite Argument zu 'assertTrue()' wird erwartet, dass eine 'Zeichenfolge' sein, siehe https://github.com/ sebastianbergmann/phpunit/blob/6.3.0/src/Framework/Assert.php # L1148-L1151. – localheinz

+0

Siehe https://phpunit.de/manual/current/en/writing-tests-for-phpunit.html#writing-tests-for-phpunit.data-providers. – localheinz

Antwort

2

Zuerst sollten Sie die aktuellste Version von PHPUnit (v6.x) verwenden. Das Vorhandensein von PHPUnit_Framework_TestCase lässt es so aussehen, als ob Sie eine ältere Version verwenden. Aber ich schweife ab ...

Sie wollen einen Datenanbieter.

class myTestCase extends PHPUnit_Framework_TestCase 
{ 
    /** 
    * @dataProvider providerTestMyCase 
    **/ 

    public function testMyCase($date, $expectedRowCount) { 

     $sql = "select * from testCase where date = '$date'"; 
     $stmt = self::$pdo->prepare($sql); 
     $result = $stmt->execute($sql); 

     //We expect the query will always work. 
     $this->assertTrue($result); 

     //We are expecting the rowcount will be consistent with the expected rowcounts. 
     $this->assertSame($expectedRowCount,$stmt->rowCount()); 
    } 

    public funtion providerTestMyCase() { 
     return [ [ '2017-08-01' , 76 ] 
       , [ '2017-08-02' , 63 ] 
       , [ '2017-08-03' , 49 ] 
       , [ '2017-08-04' , 31 ] 
       , [ '2017-08-05' , 95 ] 
       ] 
    } 
} 

lesen und wieder lesen: Database Testing sowie @dataProvider

+0

Der Vorschlag, die aktuellste Version von 'phpunit/phpunit' zu verwenden, ist in Ordnung, aber es könnte Gründe geben, die neueste Version nicht zu verwenden:' phpunit/phpunit:^6' benötigt 'php:^7.0', aber Das Projekt benötigt möglicherweise eine Version, die diese Anforderung nicht erfüllt. – localheinz

+0

5.6 [aktive Unterstützung vor 6 Monaten verloren] (http://php.net/supported-versions.php). Die [aktuelle Best Practice] (http://www.phptherightway.com/#use_the_current_stable_version) soll 7.x verwenden. Wenn Sie neuen Code schreiben, sollte er 7.0-kompatibel sein oder Sie werden Sodbrennen haben. [7 ist schneller] (http://www.zend.com/en/resources/php7_infographic), sicherer (verwendet libsodium ab 7.2), PHPUnit <6.0 wird nicht mehr unterstützt. 5.6 baut nur [technische Schulden] (https://en.wikipedia.org/wiki/Technical_debt) in ihr Projekt auf. Bleiben Sie nur auf 5.6, wenn Sie keine andere Wahl haben. – DrDamnit

+0

Ich bin mir dessen bewusst, aber: Ich habe an großen Legacy-Projekten für Multimillionen-Dollar-Unternehmen gearbeitet, die ursprünglich eine Testabdeckung von 0% hatten, und es gibt keine Möglichkeit, einfach zu PHP7 zu wechseln. Es gibt viele Gründe, warum Upgrades trotz möglicher Vorteile noch nicht möglich sind. – localheinz

0

Vielleicht brauchen Sie es nicht.

class myTestCase extends PHPUnit_Framework_TestCase 
{ 
    public function testMyCases() 
    { 
     $dates = [ 
      '2017-01-01 00:00:00', 
      '2017-08-03 15:00:00' 
     ]; 

     foreach ($dates as $date) { 
      $resultSet = $this->query("select * from testCase where date='$date'"); 
      $this->assertTrue($resultSet, true); 
     } 

    } 
} 
+3

Es ist besser, [@dataProvider] (https://phpunit.de/manual/current/en/writing-tests-for-phpunit.html#writing-tests-for-phpunit.data-providers) zu verwenden, aber die Idee ist richtig - alle getesteten Permutationen sollten im Testfall dokumentiert werden. –

-1

Ihre Test-Methode eine Abhängigkeit von $date hat. Sie können ihm einen Datenprovider geben (wie in einer früheren Antwort beschrieben) oder ihn von einer anderen Testmethode abhängig machen, die das Datum zurückgibt.

... 

function testDateDependency() 
{ 
    $date = '...'; 
    $this->assertInternalType('string', $date, 'dependency check'); 

    return $date; 
} 

/** 
* @depends testDateDependency 
*/ 
function testMyCase($date) { 

    ... 

Dies sind die beiden Optionen (die zweite ist die Datenanbieter, die wahrscheinlich überlegen ist, wie Sie leichter mehr unterschiedliche Abhängigkeitswerte liefern kann) ich kenne. Die PHPUnit-Dokumentation zeigt möglicherweise mehr Optionen.

Verwandte Themen