PHPunit -> Exceptions ausgeben und zusätzlichen Text in die XML Datei schreiben

NetBull

Erfahrenes Mitglied
Hi Leute,

ich muss UNit-Testing mit PHp einrichten und würde gerne eine erzeugte Exeption, bzw. eigene Kommentare in die XML ausgeben die erzeugt wird. Kann mir jemand sagen wie das geht? Ich find nämlich nix drüber.

LG NetBu||
 
Was meinst du mit erzeugter Exception? Eine zur Laufzeit generierte Exception-Klasse? Eine geworfene Exception?

Du kannst das $xml_result-Objekt im folgenden Beispiel (von http://parthpatil.com/2008/05/14/formatting-phpunit-test-results-as-html-table/) durchlaufen und dort deine Kommentare anhängen:

PHP:
<?php
require_once('PHPUnit/Framework/TestSuite.php');
require_once('PHPUnit/Framework/TestResult.php');
require_once('PHPUnit/Util/Log/XML.php');
require_once('ArrayTest.php');
 
class MyTestRunner
{
    public static function run()
    {
        // Create the test suite instance
        $suite = new PHPUnit_Framework_TestSuite();
        $suite->setName('MyTestRunner');
 
        // Add files to the TestSuite
        $suite->addTestSuite('ArrayTest');
 
        // Create a xml listener object 
        $listener = new PHPUnit_Util_Log_XML;
 
        // Create TestResult object and pass the xml listener to it
        $testResult = new PHPUnit_Framework_TestResult();
        $testResult->addListener($listener);
 
        // Run the TestSuite
        $result = $suite->run($testResult);
 
        // Get the results from the listener
        $xml_result = $listener->getXML();
        return $xml_result;
    }
}
 
OK, sieht spannend aus. aber wo müssen dann jetzt hier die Tests hin?

hier mal ein Beispiel wie es bisher funktioniert hat, aber mit zu wenig Reporting-Inhalt
PHP:
<?php
require_once 'PHPUnit2/Framework/TestCase.php';
require_once 'PHPUnit2/Framework/IncompleteTestError.php';
require_once 'PHPUnit2/Util/Log/XML.php';

require_once 'BankAccount.php';
 
class BankAccountTest extends PHPUnit2_Framework_TestCase 
{
    private $ba;
 	private $logger = NULL;
    
    function __construct()
    {    	
    	$this->logger = new PHPUnit2_Util_Log_XML();
    	$this->logger->setWriteDocument(false);    	
    	print ("\r\n");print ("\r\n");print ("\r\n");            	
    }
    
    function __destruct()
    {
    	$this->logger = NULL;
    }
 	
 	protected function setUp() 
	{        
        $this->ba = new BankAccount;        
    }
 
    public function testBalanceIsInitiallyZero() 
	{
        $this->assertEquals(false, $this->ba->getBalance());
    }
 
    public function testBalanceCannotBecomeNegative() 
	{
        try 
		{
            $this->ba->withdrawMoney(1);
        }
 
        catch (Exception $e) {
            return;
        }
 
        $this->fail();
    }
 
    public function testBalanceCannotBecomeNegative2() 
	{
        try 
		{
            $this->ba->depositMoney(-1);
        }
 
        catch (Exception $e) 
        {
            return;
        }
 
        $this->fail();
    }
 
    public function testBalanceCannotBecomeNegative3() 
	{
        try 
		{
            $this->ba->setBalance(-1);
        }
 
        catch (Exception $e) 
		{
            return;
        }
 
        $this->fail();
    }
	
	public function testUserLogIn()
	{		 
		 $this->assertEquals(false, $this->ba->userLogIn("123454","00000"));		 
		 $this->assertEquals(true, $this->ba->userLogIn("123456789","4321"));
		 $this->assertEquals(false, $this->ba->userLogIn("12xxx3456789","4321"));
		 $this->assertEquals(false, $this->ba->userLogIn("",""));
	}
	
	public function testSomething() 
	{
        // Optional: Testen Sie hier, was Sie möchten.
        $this->assertTrue(TRUE, "Dies sollte bereits funktionieren.");
 
        // Test anhalten und als unvollständig markieren.
        // Hierzu können Sie jede Ausnahme verwenden, die die
        // Schnittstelle PHPUnit2_Framework_IncompleteTest implementiert.
        throw new PHPUnit2_Framework_IncompleteTestError
        (
        	"Dieser Test ist noch nicht fertig ausprogrammiert."
        );
        $this->fail('Eine erwartete Ausnahme wurde nicht ausgelöst.');
    }
}
?>


und hier mein Versuch Dein Beispiel zu nutzen!
PHP:
require_once('PHPUnit2/Framework/TestSuite.php');
	require_once('PHPUnit2/Framework/TestResult.php');
	require_once('PHPUnit2/Util/Log/XML.php');
	require_once('BankAccount.php');

	class myTestRunner
	{
		public static function run()
		{			
			$suite = new PHPUnit_Framework_TestSuite();
			$TestClass = new BankAccount;  
        	$suite->setName('MyTestRunner');
        	
        	// Add files to the TestSuite
        	$suite->addTestSuite('BankAccount');
        	
        	// Create a xml listener object 
        	$listener = new PHPUnit_Util_Log_XML;

        	// Create TestResult object and pass the xml listener to it
        	$testResult = new PHPUnit_Framework_TestResult();
        	$testResult->addListener($listener);
        	
        	// Run the TestSuite
        	$result = $suite->run($testResult);
 
        	// Get the results from the listener
        	$xml_result = $listener->getXML();
        	
        	return $xml_result;
        	
		}
		
		public function testBalanceIsInitiallyZero() 
		{
        	$this->assertEquals(false, $TestClass->getBalance());
    	}			
	}

Wenn ich Dein Beispiel so laufen lasse, kommt folgende Ausgabe auf der Konsole:
PHPUnit 2.3.6 by Sebastian Bergmann.

F

Time: 0.001317
There was 1 failure:
1) Warning(PHPUnit2_Framework_Warning)
Class myTestRunner has no public constructor

FAILURES******
Tests run: 1, Failures: 1, Errors: 0, Incomplete Tests: 0.




Kannst mir da bei Deinem Beispiel zeigen wie ich die Methoden meiner Klasse die ich implementieren willl einbinde und wie ich Exeptions meiner methoden der zu testenden Klasse auslese?

thx, NetBu||
 
Zuletzt bearbeitet:
Der Fehler steht doch drin: Class myTestRunner has no public constructor

PHP:
    class myTestRunner
    {
        public function __construct()
        {
                 // Empty constructor to fulfill the requirements of PHPUnit
        }

        public static function run()
 
hmmm... den Fehler hatte ich drin.

Nachem ich nun den leeren Constructor eingebaut habe bekomme ich eine Exceptoin vom Framework.

Und Exceptions vom getesteten Code werden nicht irgendwohin reportet. Also Antworten die nur die Fehler zählen ohne auf die Art und Quelle des Fehlers hin zu weisen sind unpraktisch.

Kannst mir auf meinem Beipiel zeigen wie eine ausgelöste Exception der Klasse die ich teste als report in eine Datei geschrieben werden kann, so das man in der XML sehen kann in welcher Datei der Fehler steht?

Fehlermeldung:
Catchable fatal error: Argument 1 passed to PHPUnit2_Framework_TestSuite::addTest() must implement interface PHPUnit2_Framework_Test, instance of myTestRunner given, called in C:\xampp\php\PEAR\PHPUnit2\Framework\TestSuite.php on line 501 and defined in C:\xampp\php\PEAR\PHPUnit2\Framework\TestSuite.php on line 217

Call Stack:
0.0011 444064 1. {main}() C:\xampp\php\PEAR\PHPUnit2\TextUI\TestRunner.php:0
0.0348 3343176 2. PHPUnit2_TextUI_TestRunner::main() C:\xampp\php\PEAR\PHPUnit2\TextUI\TestRunner.php:612
0.0349 3343480 3. PHPUnit2_TextUI_TestRunner->start() C:\xampp\php\PEAR\PHPUnit2\TextUI\TestRunner.php:107
0.0353 3346256 4. PHPUnit2_Runner_BaseTestRunner->getTest() C:\xampp\php\PEAR\PHPUnit2\TextUI\TestRunner.php:288
0.1362 3452208 5. PHPUnit2_Framework_TestSuite->__construct() C:\xampp\php\PEAR\PHPUnit2\Runner\BaseTestRunner.php:208
0.1363 3454416 6. PHPUnit2_Framework_TestSuite->addTestMethod() C:\xampp\php\PEAR\PHPUnit2\Framework\TestSuite.php:185
0.1364 3454680 7. PHPUnit2_Framework_TestSuite->addTest() C:\xampp\php\PEAR\PHPUnit2\Framework\TestSuite.php:501
 
Zuletzt bearbeitet:
Zurück