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

Unit Testing By Example

Unit Testing By Example

Everyone tells you that you need to test. You know the theory, but you don't know where to begin. What to test? What cases to write? Through realistic and pragmatic examples, this presentation will take you away from var_dump and ease you into the testing business until you're ready to do TDD. All this without losing sight of the tight deadlines.

Anna Filina

August 22, 2015
Tweet

More Decks by Anna Filina

Other Decks in Programming

Transcript

  1. 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); } 8
  2. 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()); 10
  3. Test both cases $item = new CartItem("Skyrim", 30); $item->setQuantity(1); $cart->addItem($item);

    $this->assertEquals(15, $cart->getShipping()); $this->assertEquals(45, $cart->getTotal()); 12
  4. Step 3: write code public function getTotal() { //... $taxes

    = $this->getApplicableTaxes(); foreach ($taxes as $tax) { $total += $subtotal * $tax->getPercent(); } //... } 13
  5. Step 3: write 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 14
  6. Step 3: write code $cart = new Cart(); $taxes =

    $cart->getApplicableTaxes(); $this->assertInternalType('array', $taxes); $this->assertCount(2, $taxes); $gst = $taxes[0]; $this->assertEquals(0.05, $gst->getPercent()); 15
  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]); 18
  8. Tips • How it’s not supposed to work. • Plan

    for exceptions. • Focus on realistic scenarios. 19
  9. 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 21
  10. Zero times foreach ($products as $product) { $total = $product->price

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

    $total = $product->price * $product->quantity; } if ($total > 0) { echo 'found'; } 26
  12. Anna Filina • Development: PHP, JS, etc. • Fix problems:

    bugs, performance, etc. • Workshops: testing, Symfony, AngularJS, API, etc. • Advisor: testing strategy, legacy code, etc. 27