TDD Kata 01 – The Bowling Game

Eins meiner Ziele für 2017 ist es, TDD Katas zu einem Teil meiner täglichen Routine zu machen. Was eine Kata ist? Genau wie in der Kampfkust geht es um Training durch Wiederholung, die selbe Übung wieder und wieder zu machen, bis man sie im Schlaf beherrscht.

Einige würden sagen, es ist der einzige Weg, TDD zu lernen. Das macht aus mehreren Gründen Sinn: Man beginnt in einem kleinen, abgeschlossenen Bereich und kann reine testgetriebene Entwicklung anwenden. So kann man die neue Denkweise (den red-green-refactor Zyklus) ohne Frustration trainieren. Es bedeutet, nicht gleichzeitig um die Eigenarten eines Frameworks herum arbeiten zu müssen.

Continue reading “TDD Kata 01 – The Bowling Game”

Die Woche auf StackExchange #23 / 2016

Kurz vor dem 5. MageStackDay, hier einige Fragen und Antwroten auf magento.stackexchange.com von letzer Woche, die euch interessieren könnten:

Magento 2

  • Noch ohne Antwrot, und vermutlich gibt es noch keine Lösung (Stand: Magento 2.0): Localized frontend value for getCustomAttribute() (select or multiselect attributes) – aber wie ich in den Kommentaren schrieb: I’m going to continue to ask these questions when I’m hitting walls, and if it’s just to highlight, where the API is incomplete, especially when it’s about the catalog
  • Marius stellte eine gute Frage zum testen von Source Models: Unit testing source models. Neben meiner Antwort zu dem konkreten Fall, sind die Ausführungen von Vinai zu “Sollte ich X testen” und “Wie sollte ich X testen?” wertvoller Rat für jeden.

Magento 1

EcomDev PHPUnit Tipp #13

Seit Jahren ist das Test-Framework EcomDev_PHPUnit quasi-Standard für Magento Unit Tests. Die aktuelle Version ist 0.3.7 und der letzte Stand der offiziellen Dokumentation ist Version 0.2.0 – seitdem hat sich viel getan, was man leider im Code und GitHub Issues selbst zusammensuchen muss. Diese Serie soll praktische Tipps zur Verwendung sammeln.

Tipp #13: EAV Fixtures beschleunigen

Nutzt man die EAV Fixtures, um Produkte, Kategorien und Kunden für Tests anzulegen, macht der Fixture Processor von EcomDev_PHPUnit vor jedem Test ein Backup der jeweils bestehenden Tabellen und spielt es anschließend wieder zurück. Da die “magento_unit_tests” Test-Datenbank standardmäßig als Kopie der aktuellen Magento-Datenbank angelegt wird, kann das sehr viel unnötiger Overhead sein.

Die EAV-Tabellen in der Test-Datenbank einmalig zu bereinigen, kann Tests, die sonst mehrere Minuten laufen um ein vielfaches beschleunigen. Dazu löschen wir in der Test-DB alle Datensätze in den Main Tables (die verknüpften Attribute etec. werden über Trigger automatisch gelöscht), mit Ausnahme der Standard Root Kategorie:

delete from catalog_product_entity;
delete from catalog_category_entity where entity_id > 2;
delete from customer_entity;

EcomDev PHPUnit Tipp #12

Seit Jahren ist das Test-Framework EcomDev_PHPUnit quasi-Standard für Magento Unit Tests. Die aktuelle Version ist 0.3.7 und der letzte Stand der offiziellen Dokumentation ist Version 0.2.0 – seitdem hat sich viel getan, was man leider im Code und GitHub Issues selbst zusammensuchen muss. Diese Serie soll praktische Tipps zur Verwendung sammeln.

Tipp #12: Cache

Man kann Caches pro Test an- und abschalten, mit den folgenden Annotations:

/**
 * @test
 * @cache on all
 */
public function testWithCache()

/**
 * @test
 * @cache off all
 */
public function testWithoutCache()

/**
 * @test
 * @cache off all
 * @cache on layout
 * @cache on block_html
 */
public function testWithSomeCachesTurnedOn()


/**
 * @test
 * @cache on all
 * @cache off translate
 * @cache off config
 */
public function testWithSomeCachesTurnedOff()

Die Annotations werden in der angegebenen Reihenfolge ausgeführt, wenn man also “all” benutzt, sollte es immer vor allen anderen @cache Annotations stehen.

EcomDev_PHPUnit Tipp #11

Seit Jahren ist das Test-Framework EcomDev_PHPUnit quasi-Standard für Magento Unit Tests. Die aktuelle Version ist 0.3.7 und der letzte Stand der offiziellen Dokumentation ist Version 0.2.0 – seitdem hat sich viel getan, was man leider im Code und GitHub Issues selbst zusammensuchen muss. Diese Serie soll praktische Tipps zur Verwendung sammeln.

Tipp #11: Minimal-Fixtures für Produkttypen

Es folgen einige Beispiel Fixtures für verschiedene Produkttypen. Sie sind so minimal gehalten, dass die Daten gerade ausreichen, um die Produkte und ggf. Produktbeziehungen anzulegen. In den meisten Fällen wird man zusätzliche Attribute wie Name, Status, Sichtbarkeit, Preis und Lagerbestand benötigen.

Continue reading “EcomDev_PHPUnit Tipp #11”

EcomDev_PHPUnit Tipp #10

Seit Jahren ist das Test-Framework EcomDev_PHPUnit quasi-Standard für Magento Unit Tests. Die aktuelle Version ist 0.3.7 und der letzte Stand der offiziellen Dokumentation ist Version 0.2.0 – seitdem hat sich viel getan, was man leider im Code und GitHub Issues selbst zusammensuchen muss. Diese Serie soll praktische Tipps zur Verwendung sammeln.

Tipp #10: Defekte Übersetzungen

Es kann passieren, dass Übersetzungen in Unit Tests nicht funktionieren, wenn man einen Helper mit einem Helper-Mock ersetzt (mit mockHelper() und replaceByMock()), insbesondere im Developer Mode, wo Übersetzungen nur funktionieren wenn sie für das richtige Modul definiert wurden.

Der Modulname wird in Mage_Core_Helper_Abstract mit $this->_getModuleName() ermittelt, also schauen wir uns die Methode einmal an:

/**
 * Retrieve helper module name
 *
 * @return string
 */
protected function _getModuleName()
{
    if (!$this->_moduleName) {
        $class = get_class($this);
        $this->_moduleName = substr($class, 0, strpos($class, '_Helper'));
    }
    return $this->_moduleName;
}

Wenn Deine Helper Klasse Your_Awesome_Helper_Data ist, wird die Klasse des Helper-Mocks Mock_Your_Awesome_Helper_Data heißen. Weil ein Modul namens Mock_Your_Awesome nicht existiert, gibt es keine Übersetzungen.

Lösung

Um Helper Unit-Test-sicher zu machen (und als Nebeneffekt auch Rewrite-sicher), definiere _moduleName explizit:

class Your_Awesome_Helper_Data extends Mage_Core_Helper_Abstract
{
    protected $_moduleName = 'Your_Awesome';
}

Zuerst beschrieben hier: http://magento.stackexchange.com/questions/46255/ecomdev-phpunit-translation-not-working-with-mocked-helper