Поиск…
Простое тестирование в Symfony3
Модульный тест
Модульные тесты используются для обеспечения того, чтобы ваш код не имел синтаксической ошибки и проверял логику вашего кода, чтобы работать так, как вы ожидали. Быстрый пример:
SRC / AppBundle / Калькулятор / 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 / Калькулятор / TaxCalculator.php
<?php namespace AppBundle\Calculator; class TaxCalculator { public function calculate($price) { return $price * 0.1; // for example the tax is 10% } }
Тесты / AppBundle / Калькулятор / 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); } }
Я проверил свой класс BillCalculator, чтобы я мог убедиться, что мой BillCalculator вернет общую цену товара + 10% налога. В модульном тесте мы создаем собственный тестовый пример. В этом тесте я предоставляю 2 продукта (цены 100 и 200), поэтому налог будет составлять 10% = 30. Я ожидаю, что TaxCalculator вернет 30, так что общая цена составит 300 + 30 = 330.
Функциональный тест
Функциональные тесты используются для проверки ввода и вывода. С данным вводом я ожидал некоторую отдачу, не тестируя процесс для создания вывода. (это отличается от модульного теста, потому что в модульном тесте мы тестируем поток кода). Быстрый пример:
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'), // ... ); } }
Я проверил свой контроллер, поэтому я могу гарантировать, что мой контроллер вернет 200 ответов вместо 400 (не найден) или 500 (Внутренняя ошибка сервера) с заданным URL-адресом.
Рекомендации:
- http://symfony.com/doc/current/best_practices/tests.html
- http://symfony.com/doc/current/book/testing.html