Sök…
Enkel testning i Symfony3
Enhetstest
Enhetstest används för att säkerställa att din kod inte har något syntaxfel och för att testa logiken för din kod för att fungera som vad du förväntade dig. Snabbt exempel:
src / AppBundle / kalkylator / BillCalculator.php
<?php namespace AppBundle\Calculator; use AppBundle\Calculator\TaxCalculator; class BillCalculator { private $taxCalculator; public function __construct(TaxCalculator $taxCalculator) { $this->taxCalculator = $taxCalculator; } public function calculate($products) { $totalPrice = 0; foreach ($products as $product) { $totalPrice += $product['price']; } $tax = $this->taxCalculator->calculate($totalPrice); return $totalPrice + $tax; } }
src / AppBundle / Miniräknare / TaxCalculator.php
<?php namespace AppBundle\Calculator; class TaxCalculator { public function calculate($price) { return $price * 0.1; // for example the tax is 10% } }
test / AppBundle / kalkylator / BillCalculatorTest.php
<?php namespace Tests\AppBundle\Calculator; class BillCalculatorTest extends \PHPUnit_Framework_TestCase { public function testCalculate() { $products = [ [ 'name' => 'A', 'price' => 100, ], [ 'name' => 'B', 'price' => 200, ], ]; $taxCalculator = $this->getMock(\AppBundle\Calculator\TaxCalculator::class); // I expect my BillCalculator to call $taxCalculator->calculate once // with 300 as the parameter $taxCalculator->expects($this->once())->method('calculate')->with(300)->willReturn(30); $billCalculator = new BillCalculator($taxCalculator); $price = $billCalculator->calculate($products); $this->assertEquals(330, $price); } }
Jag testade min BillCalculator-klass så att jag kan säkerställa att min BillCalculator returnerar det totala produktpriset + 10% skatt. I enhetstest skapar vi vårt eget testfall. I det här testet tillhandahåller jag två produkter (priserna är 100 och 200), så skatten kommer att vara 10% = 30. Jag förväntar mig att TaxCalculator ska returnera 30, så att det totala priset blir 300 + 30 = 330.
Funktionellt test
Funktionella tester används för att testa ingång och utgång. Med den angivna inputen förväntade jag mig lite output utan att testa processen för att skapa output. (detta är annorlunda med enhetstest eftersom vi i enhetstest testar kodflödet). Snabbt exempel:
namespace Tests\AppBundle; use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; class ApplicationAvailabilityFunctionalTest extends WebTestCase { /** * @dataProvider urlProvider */ public function testPageIsSuccessful($url) { $client = self::createClient(); $client->request('GET', $url); $this->assertTrue($client->getResponse()->isSuccessful()); } public function urlProvider() { return array( array('/'), array('/posts'), array('/post/fixture-post-1'), array('/blog/category/fixture-category'), array('/archives'), // ... ); } }
Jag testade min controller så att jag kan se till att min controller kommer att returnera 200 svar istället för 400 (Not Found) eller 500 (Internal Server Error) med den angivna url.
referenser:
- http://symfony.com/doc/current/best_practices/tests.html
- http://symfony.com/doc/current/book/testing.html