Szukaj…


Proste testowanie w Symfony3

Test jednostkowy

Testy jednostkowe służą do upewnienia się, że w kodzie nie ma błędu składniowego oraz do przetestowania logiki kodu pod kątem działania zgodnie z oczekiwaniami. Szybki przykład:

src / AppBundle / Calculator / 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 / Calculator / TaxCalculator.php

<?php

namespace AppBundle\Calculator;

class TaxCalculator
{
    public function calculate($price)
    {
        return $price * 0.1; // for example the tax is 10%
    }
}

testy / AppBundle / Calculator / 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);
    }
}

Przetestowałem moją klasę BillCalculator, dzięki czemu mogę upewnić się, że mój BillCalculator zwróci całkowitą cenę produktów + 10% podatku. W teście jednostkowym tworzymy własny przypadek testowy. W tym teście dostarczam 2 produkty (ceny wynoszą 100 i 200), więc podatek wyniesie 10% = 30. Oczekuję, że TaxCalculator zwróci 30, więc łączna cena wyniesie 300 + 30 = 330.

Test funkcjonalny

Testy funkcjonalne służą do testowania wejścia i wyjścia. Przy podanych danych wejściowych oczekiwałem danych wyjściowych bez testowania procesu tworzenia danych wyjściowych. (jest inaczej w przypadku testu jednostkowego, ponieważ w teście jednostkowym testujemy przepływ kodu). Szybki przykład:

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'),
            // ...
        );
    }
}

Przetestowałem kontroler, więc mogę się upewnić, że mój kontroler zwróci 200 odpowiedzi zamiast 400 (nie znaleziono) lub 500 (wewnętrzny błąd serwera) z podanym adresem URL.

Bibliografia:



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow