Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Unit Testing By Example

Unit Testing By Example

Everyone says you need to test. You know the theory, but you do not know where to begin. What should you test? What cases should you write? Using realistic, pragmatic examples, this presentation will take you away from var_dump and ease you into the testing business until you are ready to do TDD without losing sight of tight deadlines.

Anna Filina

February 04, 2017
Tweet

More Decks by Anna Filina

Other Decks in Programming

Transcript

  1. Step 1: Found Bug $item = new CartItem("Overwatch", 30); $item->setQuantity(0.1);

    $this->assertEquals(1, $item->getQuantity()); public function setQuantity($qty) { $this->qty = ceil($qty); }
  2. Too Simple? • Prevent future breaks • Why code is

    written this way • Same effort as comments
  3. Step 2: Improve Code $item = new CartItem("Overwatch", 30); $item->setQuantity(2);

    $cart->addItem($item); $this->assertEquals(0, $cart->getShipping());
  4. Step 3: New Code public function getTotal() { //... $taxes

    = $this->getApplicableTaxes(); foreach ($taxes as $tax) { $total += $subtotal * $tax->getPercent(); } //... }
  5. Step 3: New Code array (size=2) 0 => array (size=2)

    'name' => string 'GST' (length=3) 'percent' => float 0.05 1 => array (size=2) 'name' => string 'QST' (length=3) 'percent' => float 0.09975
  6. Step 3: New Code $cart = new Cart(); $taxes =

    $cart->getApplicableTaxes(); $this->assertInternalType('array', $taxes); $this->assertCount(2, $taxes); $gst = $taxes[0]; $this->assertEquals(0.05, $gst['percent']);
  7. Step 4: Before (TDD) $import = new CatalogImport(); $products =

    $import->parseFromCsv('catalog.csv'); $this->assertInternalType('array', $products); $this->assertCount(2, $products); $this->assertArrayHasKey('name', $products[0]); $this->assertArrayHasKey('price', $products[0]);
  8. A New Mindset • Write less code • Stay focused

    • Elegant code • Works right away
  9. Tips • How it’s not supposed to work. • Plan

    for exceptions. • Focus on realistic scenarios.
  10. Zero Times foreach ($products as $product) { $total = $product->price

    * $product->quantity; } if ($total > 0) { echo 'found'; }
  11. Multiple Times $total = 0; foreach ($products as $product) {

    $total = $product->price * $product->quantity; } if ($total > 0) { echo 'found'; }
  12. 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.