turk porno porno escort rokettube
Ergebnis 1 bis 5 von 5

Thema: PHPUnit shell_exec

  1. #1
    Erfahrener Benutzer Avatar von ice-breaker
    Registriert seit
    29.03.2008
    Ort
    Steinbach/Taunus
    Beiträge
    1.862
    Thanks
    0
    Thanked 9 Times in 5 Posts

    Standard PHPUnit shell_exec

    Hi,
    also ich habe da ein Problem wo ich gerade keine gute Lösung habe, ich muss noch ein paar UnitTests machen, die nicht gerade trivial sind.

    Es geht darum, dass eine Software auf Linux und Windows Kisten läuft und Infos des Systems für einige Abschaltroutinen auslesen muss, also Prozessorlast, Festplattenspeicher usw.

    Also schön eine abstrakte Klasse gebildet die die Methoden definiert und eine Kind-Klasse für Windows und Linux, nun ist nur das Problem, dass sich das mit UnitTests nicht wirklich gut abdecken lässt, denn ich hole meine Infos ja direkt per shell_exec() also bin ich direkt auf die Antworten des Systems angewiesen, Szenarien lassen sich damit auch nicht gerade simulieren.

    Also sehe ich die einzige Möglichkeit den shell_exec Aufruf durch ein Objekt zu ersetzen, welches shell_exec wrapped und in einem UnitTest durch ein Mock-Objekt ersetzt werden kann, allerdings finde ich diese Lösung irgendwie doof, erzeuge ich doch ein quasi sinnloses Objekt nur um meine UnitTests realisieren zu können.

    Hat jemand andere Ideen oder soll ich es genau so umsetzen ?

  2. #2
    Erfahrener Benutzer
    Registriert seit
    28.12.2006
    Beiträge
    9.966
    Thanks
    0
    Thanked 0 Times in 0 Posts

    Standard

    Also schön eine abstrakte Klasse gebildet die die Methoden definiert und eine Kind-Klasse für Windows und Linux, nun ist nur das Problem, dass sich das mit UnitTests nicht wirklich gut abdecken lässt, denn ich hole meine Infos ja direkt per shell_exec() also bin ich direkt auf die Antworten des Systems angewiesen, Szenarien lassen sich damit auch nicht gerade simulieren.
    Du könntest zum Beispiel deine ganzen Systeme-Zugriffe in einer eigenen Klasse kapseln. Für den Test lässt sich dann recht einfach daraus ein Mock basteln, wo sich die Antworten "simulieren" lassen.
    Also sehe ich die einzige Möglichkeit den shell_exec Aufruf durch ein Objekt zu ersetzen, welches shell_exec wrapped und in einem UnitTest durch ein Mock-Objekt ersetzt werden kann, allerdings finde ich diese Lösung irgendwie doof, erzeuge ich doch ein quasi sinnloses Objekt nur um meine UnitTests realisieren zu können.
    Ähmm ... Ja, genau das meinte ich. Hätte erst zu Ende lesen sollen...

    Wenn ich das richtig verstehe, dann handelt es sich ja um mehrere unterschiedliche Aufrufe. Würde da dann nahe legen, dass du nicht eine Klasse schreibst, die einzig den Aufruf von shell_exec kapselt, sondern gleich die kompletten Anfragen
    PHP-Code:
    class System
    {
      public function 
    getHddSpace ()
      {
        
    // erstes exec
      
    }

      public function 
    getIrgendwas ()
      {
        
    // zweites exec
      
    }

    Hmm ... Eigentlich ist das doch der einzige Befehl, wo sie Bedienung zwischen den OS unterscheiden. Reicht dann nicht sogar die eine Klasse für die Differenzierung? Da können theoretisch deine beiden Kindklassen weg, wenn du einfach die eine Klasse als System-Adapter verwendest. Sinngemäß
    PHP-Code:
    class System {
      public function 
    __construct (SystemAdapter $adapter)
      {
        
    // Ajo
      
    }

      
    // Hier stehen deine Methoden, wie du sie bereits bei der abstrakten Klasse definiert hast
    }

    interface 
    SystemAdapter {
      
    // Jo, nen Interface halt
    }

    public class 
    SystemAdapter_Windows {
      
    // Hier stehen NUR die Methoden mit den exec-Aufrufen
      // Naja, vllt etwas mehr
      // Schöne Rückgabeobjekte sind immer nett :)

    Geändert von KingCrunch (31.07.2008 um 19:19 Uhr)

  3. #3
    Erfahrener Benutzer Avatar von ice-breaker
    Registriert seit
    29.03.2008
    Ort
    Steinbach/Taunus
    Beiträge
    1.862
    Thanks
    0
    Thanked 9 Times in 5 Posts

    Standard

    Neija das Problem ist, dass die ausgelesenen Daten von Linux und Windows komplett anders formatiert und anders zugänglich sind.
    Und da ich die Daten teilweise noch stark transformieren muss, weil zB Windows Probleme mit der Dualcore-Erkennung hat zb einen Testcase brauche wo ich die Prozessor-Daten noch merge und statt 2 einzelnen Prozessoren einen DualCore-Prozessor zurückliefere.

    Das beide ne gleiche API teilen ist klar ob nun mit nem System-Adapter der einfach nur nen getter über das Adapter ist (Interface-Konzept) oder abstrakte Klassen ist denke ich egal, hat beides seine Vorzüge.

    Problematisch ist eben das Auslesen der Datei vom OS, da ich wie gesagt die Daten nicht einfach zurückgeben kann, sondern teilweise noch mergen muss (Prozessor-Beispiel) oder anderes, und ich also in deiner System-Klasse die TestCases simulieren muss, was wieder nicht geht, da es direkt auf shell_exec zugreift.

    Ich hoffe es ist deutlich wo das Problem steckt, sonst erläutere ich das nochmal genauer.

  4. #4
    Erfahrener Benutzer
    Registriert seit
    28.12.2006
    Beiträge
    9.966
    Thanks
    0
    Thanked 0 Times in 0 Posts

    Standard

    Neija das Problem ist, dass die ausgelesenen Daten von Linux und Windows komplett anders formatiert und anders zugänglich sind.
    Na und? Kannste doch im Adapter auch normalisieren. Irgendwo musstes eh machen

  5. #5
    Erfahrener Benutzer Avatar von ice-breaker
    Registriert seit
    29.03.2008
    Ort
    Steinbach/Taunus
    Beiträge
    1.862
    Thanks
    0
    Thanked 9 Times in 5 Posts

    Standard

    Zitat Zitat von KingCrunch Beitrag anzeigen
    Na und? Kannste doch im Adapter auch normalisieren. Irgendwo musstes eh machen
    Das Problem ist ja das das normalisieren im Adapter mit dem Aufruf von shell_exec dazu führt, dass ich keine Szenarien mehr machen kann, weil beides am gleichen Punkt stattfindet.

    Also es sieht so aus:
    PHP-Code:
    class System_Windows {
      
    // ....
      
    public function getProcessors() {
        
    $data shell_exec(/* ... */); // reads data from processors
        
        
    if(/* if there are duplicate prozessor ids */){
          
    // merge processors
        
    }
        return 
    //processors
      
    }

    So ist nun mehr Pseudo-Code als sonstwas, aber egal.
    Die Daten die von shell_exec kommen muss ich eben gleich normalisieren, werden dann in Objekte verpackt und zurückgegeben.
    Sie werden eben gleich normalisiert vor dem zurückgeben, da die Daten von Linux und Windows komplett anders formatiert sind und ein gemeinsamer Normalisierer würde den Code richtig undurchsichtig machen. Ich könnte in dem Normalisieren natürlich eine Weiche einbauen, dass der Teil nur für Linux gilt oder pro Betriebssystem einen Normalisierer, aber irgendwie ziemlich unnötig wie ich denke.
    Dagegen den shell_exec Aufruf zu wrappen klingt mir noch am logischsten, aber dann müsste man eben in der Klasse auch ne Methodik bereitstellen dieses Objekt einzufügen, was für den normalen Ablauf ohne UnitTests einfach unnötig wäre.

Ähnliche Themen

  1. PHPUNIT install
    Von TeeJay im Forum Testing & Deployment
    Antworten: 13
    Letzter Beitrag: 07.07.2008, 13:06

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •