Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHPUnit] Moje boje z obiektówką
Forum PHP.pl > Forum > PHP
scanner
Postanowiłem przyjrzeć się bliżej PHPUnitowi i napisać coś, co będzie zgodne z tą metodyką. Najprosciej mi było wziąść mój kawałek kodu, który pokazałem w jednym wątku i zacząć go przerabiać na obiektowy.

Stworzyłem trzy pliki:[php:1:b4109d8eb7]<?php
/*
* core.class.php
* @author scanner
* @version 0.0.1-dev
*/

class Core
{
var $arrQueue;
var $arrOutput;

// Tworzy pierwszy i ostatni element kolejki:
// - modul inicjujacy
// - modul wyswietlajacy output
function coreInitialize()
{
}
}
?>[/php:1:b4109d8eb7][php:1:b4109d8eb7]<?php
/*
* core.test.php
* @author scanner
* @version 0.0.1-dev
*/

require_once 'engine/core.class.php';
require_once 'PHPUnit.php';

class CoreTest extends PHPUnit_TestCase
{
var $arrQueueTest;

function CoreTest($name)
{
$this->PHPUnit_TestCase($name);
}

function setUp()
{
$this->arrQueueTest = new Core();
}

function tearDown()
{
unset($this->arrQueueTest);
}

function coreInitializeTest()
{
$result = $this->arrQueueTest->coreInitialize();
$expected[0]['Action'] = 'Call';
$expected[0]['Module'] = 'mod.initialization';
$expected[0]['Params'] = NULL;

$this->assertTrue($result == $expected);
}
}
?>[/php:1:b4109d8eb7][php:1:b4109d8eb7]<?php
/*
* index.php
* @author scanner
* @version 0.0.1-dev
*/

require_once 'engine/core.test.php';
require_once 'PHPUnit.php';

$suite = new PHPUnit_TestSuite("coreInitializeTest");
$result = PHPUnit::run($suite);

echo $result -> toHTML() ;
?>[/php:1:b4109d8eb7]I teraz mam pytanie. Co spieprzyłem, że w wyniku zamiast informacji, ze testy się nie powiodły, otrzymuję:
Kod
<pre></pre>
Całosć testuję na: Apache2 / PHP5 / PHPUnit 0.6.2
KaMeLeOn
1. PHPUnit wymaga w klasie testowej, nazywania funkcji testujących z przedrostkiem "Test" or "test" (obojętnie)... A oto fragment:
Cytat
Ciąg testów jest zwyklą klasą php dziedzicząca po PHPUnit_TestCase, zawierającą funkcje testujące, rozpoznane przez początkowe słowo "test" w nazwie funkcji.

Choć w nazwie klasy nie jest to wymagane to lepiej wyrabiać sobie nawyki...
[php:1:eb383fa82d]<?php
class TestCore extends PHPUnit_TestCase
{
var $TestArrQueue; // <--

function TestCore($name) // <--
{
$this->PHPUnit_TestCase($name);
}

// ...

function TestCoreInitialize() // <--
{
$result = $this->TestArrQueue->CoreInitialize();
$expected[0]['Action'] = 'Call';
$expected[0]['Module'] = 'mod.initialization';
$expected[0]['Params'] = NULL;

$this->assertTrue($result == $expected);
}
}
?>[/php:1:eb383fa82d]
2. Uruchamiając test, uruchamiamy klasę testową a nie jej metodę... Czyli:
[php:1:eb383fa82d]<?php
/*
* index.php
* @author scanner
* @version 0.0.1-dev
*/

require_once 'engine/core.test.php';
require_once 'PHPUnit.php';

$suite = new PHPUnit_TestSuite("TestCore"); // <--
$result = PHPUnit::run($suite);

echo $result -> toHTML() ;
?>[/php:1:eb383fa82d]
3. Always Constructor:
[php:1:eb383fa82d]<?php
/*
* core.class.php
* @author scanner
* @version 0.0.1-dev
*/

class Core
{
var $arrQueue;
var $arrOutput;

function Core()
{
}

// Tworzy pierwszy i ostatni element kolejki:
// - modul inicjujacy
// - modul wyswietlajacy output
function CoreInitialize()
{
}
}
?>[/php:1:eb383fa82d]
scanner
Ok.
Pierwsza lekcja za mną smile.gif
Ide projektować resztę klasy.. zobaczymy co z tego wyjdzie smile.gif
Dzięki KaMeLeOn.
[Regis]
O kufa! A o co w tym chodzi, bo ni cholery nie kapuje ? smile.gif Tzn. nie chodzi mi o sam kod, ale o te wszystki klasy testujace itp... Kurde, gdzie cos o tym pisze JASNO I WYRAZNIE ? smile.gif Bo poki co czytalem o tym tylko w tym dokumencie na dev.php.pl, ale przyznam sie szczerze, ze praktycznie NIC nie kapuje tongue.gif smile.gif Jestem taki glupi, czy to takie dziwne ? sad.gif :wink:
scanner
Problem polega na tym, że początki na pewno są dziwne - ja nie dość, zę się ucze obiektów, to jeszcze tego Unita.. i dla mnie to w ogóle jest magia...
scanner
Kurde...
To jest bardziej jak magia. Wystarczy zapomnieć jednego głupiego[php:1:d47a662230]<?php
$this -> zmienna;
?>[/php:1:d47a662230]I napisać z przyzwyczajenia[php:1:d47a662230]<?php
$zmienna;
?>[/php:1:d47a662230]I się człowiek może wrzodów na tyłku nabawić od wysiadywania przyczyny złego działania skryptu...
Jabol
nieprawda. Jak w normalnej funckji dasz $zmienna to tez masz problem, prawda. Potraktuj to jak $GLOBALS
scanner
Jabol: ale ja się uczę, hih.. i mi się plącze te OOP.

Włąśnie z Sethem debatujemy nad PHPUnit.

Problem:
O ile bez problemu można napisać teslu czegoś, co np. sumuje, zwraca, oblicza i zwraca wartości, które potrafimy przewidzieć, to jak np. przetestować coś takiego:[php:1:8f6344032b]<?php
class Core
{
var $intExecutionTime;
var $arrCurrentQueueItem;

// konstruktor
function Core()
{
}

// odmierza czas wykonania fragmentu kodu
function coreExecutionTime()
{
if ( $this -> intExecutionTime )
{
$this -> intExecutionTime = (microtime()- $this -> intExecutionTime);
}
else
{
$this -> intExecutionTime = microtime();
}
}
}
?>[/php:1:8f6344032b]Jedyny test, jaki mi przychodzi do głowy, to sprawdzenie, czy zwrócona wartość to float.
A inne możliwości?
Czy dobrze myślę, że jeśli mamy dostać w wyniku wartość dynamiczną, której nie potrafimy przewidzieć, to mamy sprawdzać tylko tym wyniku?

Nie wiem, czy problem dobrze opisałem.. jeśli nie, to Seth dopisze swoje za chwilę
Seth
dokladnie... to samo tyczy sie objektow.

Mysle powinnismy nieco lepiej opisac PHPUnit niz to jest w manualu.
Poza tym PHPUnit jest pisane pod php 4, a nie php 5 co prowadzi do tego, ze nie da sie wsyzstkiego przetestowac (np: destruktora)... no chyba, ze sie da to prosze o wskazowki smile.gif
Omega
... oho jakoś znajomo wygląda ten kod...biggrin.gif

Co do testów, mozna sprawdzić czy wynikowy czas jest większy od poprzedniego, czy obie zmienne są tego samego typu i tego samogeo co wynik (chociaż to może nie potrzebne)... No i wydaje mi się że można sprawdzic jak program sie zachowa z nieprawidlowym typem właściwości $this -> intExecutionTime gdy np. będzie zawierała tekst (to niby mało prawdopodobne ale kto wie czy nie mozliwe...) 8)
scanner
Omega: tak, to Twój kod smile.gif Lekko zmodyfikowany, ale Twój smile.gif
Ja teraz analizuję kod klasy kolejki pisanej przez Setha i powiem tak:
a) przy pisaniu naprawde obiektowym, tak jak to zauważyłem u Seth'a - testy można szybciej pisać.
cool.gif dobry programista zawsze wie, jakiego wyniku oczekuje i potrafi wyświetlić i przeanalizować wyniki otrzymane... osobiście PHPUnit i koniecznosc pisania testów spowalnia moją pracę...
Omega
Jeżeli to możliwe, chetnie bym obejżał wersje Seth'a... Sam chcem sie dokształcic w Obiektówce od kogos kto sie zna lepiej... biggrin.gif
Seth
Tutaj jest ta klasa: http://forum.php.pl/viewtopic.php?p=29525#29525
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.