Slide 1

Slide 1 text

FooLab http://foolab.ca @foolabca Unit Testing by Example ConFoo - February 26, 2014

Slide 2

Slide 2 text

FooLab Objectives • Make testing enjoyable. • Make it useful. • Reduce pre-release stress. 2

Slide 3

Slide 3 text

FooLab Anna Filina 3 • I help projects ship on time. • I train and mentor developers. • I code and optimize.

Slide 4

Slide 4 text

FooLab You don’t need 100% coverage

Slide 5

Slide 5 text

FooLab You don’t become an expert overnight

Slide 6

Slide 6 text

FooLab Step 1: found bug $item = new CartItem("Skyrim", 30); $item->setQuantity(0.1); $this->assertEquals(1, $item->getQuantity()); === public function setQuantity($qty) { $this->qty = ceil($qty); } 6

Slide 7

Slide 7 text

FooLab Step 2: improve code $item = new CartItem("Skyrim", 30); $item->setQuantity(2); $cart->addItem($item); $this->assertEquals(0, $cart->getShipping()); $this->assertEquals(60, $cart->getTotal()); 7

Slide 8

Slide 8 text

FooLab Step 2: improve code public function getShipping() { if ($this->getSubtotal() >= 40) { return 0; } else { return 15; } } 8

Slide 9

Slide 9 text

FooLab Test both cases $item = new CartItem("Skyrim", 30); $item->setQuantity(1); $cart->addItem($item); $this->assertEquals(15, $cart->getShipping()); $this->assertEquals(45, $cart->getTotal()); 9

Slide 10

Slide 10 text

FooLab Step 3: write code public function getTotal() { ... $taxes = $this->getApplicableTaxes(); foreach ($taxes as $tax) { $total += $subtotal * $tax->getPercent(); } ... } 10

Slide 11

Slide 11 text

FooLab Step 3: write code array (size=2) 0 => array (size=2) 'name' => string 'GST' (length=3) 'percent' => float 0.5 1 => array (size=2) 'name' => string 'QST' (length=3) 'percent' => float 0.9975 11

Slide 12

Slide 12 text

FooLab Step 3: write code $cart = new Cart(); $taxes = $cart->getApplicableTaxes(); $this->assertInternalType('array', $taxes); $this->assertCount(2, $taxes); $gst = $taxes[0]; $this->assertEquals(0.5, $gst->getPercent()); 12

Slide 13

Slide 13 text

FooLab Advantages • More tests. • Easy to write. • Never fall too far. 13

Slide 14

Slide 14 text

FooLab Step 4: before (TDD) $import = new CatalogImport(); $products = $import->parseFromCsv('test_catalog.csv'); $this->assertInternalType('array', $products); $this->assertCount(2, $products); $this->assertArrayHasKey('name', products[0]); $this->assertArrayHasKey('price', products[0]); 14

Slide 15

Slide 15 text

FooLab Tips • How it’s not supposed to work. • Plan for exceptions. • Focus on realistic scenarios. 15

Slide 16

Slide 16 text

FooLab Recap • Testing takes practice • Write tests when you see a bug • Write tests when you improve code • Write tests as you write new code • Write tests before you write code • Test unexpected scenarios 16