장바구니 테스트 | Symfony로 장바구니 만들기
Configuring the Test Environment
Writing Cart Assertions
assertCartIsEmpty()
assertCartTotalEquals()
assertCartItemsCountEquals()
assertCartContainsProductWithQuantity()
assertCartNotContainsProduct()
Writing Functional Tests
testCartIsEmpty()
testAddProductToCart()
testAddProductTwiceToCart()
testRemoveProductFromCart()
testClearCart()
testUpdateQuantity()
testQuantityIsInvalid()
마지막 단계는 장바구니 페이지를 테스트하는 것입니다. 개발한 카트 기능이 모두 작동하는지 확인할 것입니다. 이렇게 하면 새 코드 줄을 작성할 때 장바구니가 계속 작동합니다.
테스트 환경 구성
Symfony runs tests in a special test
environment. It loads the config/packages/test/*.yaml
settings specifically for testing.
테스트용 데이터베이스 구성
We should use a separate database for tests to not mess with the databases used in the other configuration environments.
To do that, edit the .env.test
file at the root directory of your project and define the new value for the DATABASE_URL
env var:
DATABASE_URL="mysql://root:[email protected]:3306/happy_shop_test"
Next, create the database and update the database schema by executing the following command:
$ bin/console doctrine:database:create -e test
$ bin/console doctrine:migrations:migrate -e test
For now, the database is empty, load the products fixtures with:
$ bin/console doctrine:fixtures:load -e test
PHPUnit 구성
Symfony provides a phpunit.xml.dist
file with default values for testing:
<?xml version="1.0" encoding="UTF-8"?>
<!-- https://phpunit.readthedocs.io/en/latest/configuration.html -->
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="bin/.phpunit/phpunit.xsd"
backupGlobals="false"
colors="true"
bootstrap="tests/bootstrap.php"
>
<php>
<ini name="error_reporting" value="-1" />
<server name="APP_ENV" value="test" force="true" />
<server name="SHELL_VERBOSITY" value="-1" />
<server name="SYMFONY_PHPUNIT_REMOVE" value="" />
<server name="SYMFONY_PHPUNIT_VERSION" value="7.5" />
</php>
<testsuites>
<testsuite name="Project Test Suite">
<directory>tests</directory>
</testsuite>
</testsuites>
<filter>
<whitelist processUncoveredFilesFromWhitelist="true">
<directory suffix=".php">src</directory>
</whitelist>
</filter>
<listeners>
<listener class="Symfony\Bridge\PhpUnit\SymfonyTestsListener" />
</listeners>
</phpunit>
We will reset the database after each test to be sure that one test is not dependent on the previous ones. To do that, enable the PHPUnit listener provided by the DoctrineTestBundle
bundle:
<extensions>
<extension class="DAMA\DoctrineTestBundle\PHPUnit\PHPUnitExtension" />
</extensions>
세션 구성
The cart depends on the session. Testing code using a real session is tricky, that's why Symfony provides a MockFileSessionStorage
mock that simulates the PHP session workflow. It's already set in the config/packages/test/framework.yaml
settings:
framework:
test: true
session:
storage_id: session.storage.mock_file
장바구니가 비어 있으면 사용자에게 특정 메시지를 표시합니다. 장바구니가 비어 있다고 확인하려면
CartAssertionsTrait
메서드를 추가하고 Assert
개체를 사용하여 메시지가 표시되는지 확인합니다.<?php
namespace App\Tests;
use PHPUnit\Framework\Assert;
use Symfony\Component\DomCrawler\Crawler;
trait CartAssertionsTrait
{
}
assertCartIsEmpty()
기능 테스트를 수행할 때 요청, 응답 또는 크롤러에 테스트 성공에 필요한 예상 정보가 포함되어 있는지 확인하기 위해 복잡한 주장을 해야 하는 경우가 있습니다. Symfony는 이미 많은 주장을 제공하지만 우리는 카트를 위해 특별히 우리 자신의 주장을 작성할 것입니다. 기능 테스트를 더 읽기 쉽게 만들고 중복 코드 작성을 방지하는 데 도움이 됩니다. 장바구니 페이지에서 어설션을 만드는 메서드를 제공하는 assertCartIsEmpty() 트레이트를 만듭니다. 공개 정적 함수 assertCartIsEmpty(크롤러 $크롤러) { $infoText = $크롤러 ->필터('.alert-info') -> getNode(0) ->텍스트 내용; $infoText = self::normalizeWhitespace($infoText); 주장::assertEquals( ' 장바구니가 비어 있습니다. 상품 목록으로 이동합니다.', $info텍스트, "카트는 비어 있어야 합니다." ); } 개인 정적 함수 normalizeWhitespace(문자열 $값): 문자열 { return trim(preg_replace('/(?:\s{2,}+|[^\S ])/', ' ', $value)); } Crawler를 사용하여 Response에서 DOM 요소를 찾고 Crawler 클래스에서 제공하는 PHPUnit Assertion을 사용하여 어설션을 만듭니다. assertCartTotalEquals()
assertCartTotalEquals() 장바구니 합계가 예상 값과 같다고 주장하려면 assertCartItemsCountEquals() 메서드를 추가하여 장바구니 합계를 검색하고 예상 값과 비교합니다. 공개 정적 함수 assertCartTotalEquals(Crawler $crawler, $expectedTotal) { $actualTotal = (float)$크롤러 ->filter('.col-md-4 .list-group-item 범위') -> getNode(0) ->텍스트 내용; 주장::assertEquals( $예상 합계, $actualTotal, "장바구니 총액은 \"$expectedTotal €\"과 같아야 합니다. 실제 금액은 \"$actualTotal €\"입니다." ); }
assertCartItemsCountEquals assertCartContainsProductWithQuantity() 메서드를 추가하여 장바구니의 항목 수를 계산하고 예상 값과 비교합니다. 공개 정적 함수 assertCartItemsCountEquals(Crawler $crawler, $expectedCount): 무효 { $actualCount = $크롤러 -> 필터('.col-md-8 .list-group-item') ->카운트(); 주장::assertEquals( $expectedCount, $actualCount, "장바구니에는 \"$expectedCount\" 항목이 있어야 합니다. 실제 항목: \"$actualCount\" 항목입니다." ); }
장바구니 어설션 작성 사용자가 장바구니에서 구매하려는 제품의 수량이 예상 수량과 같다고 주장하는 데 도움이 됩니다. assertCartContainsProductWithQuantity 메서드를 추가하여 제품 이름에서 항목을 검색하고 주어진 제품의 수량을 예상 수량과 비교합니다. 공개 정적 함수 assertCartContainsProductWithQuantity(Crawler $crawler, string $productName, int $expectedQuantity): 무효 { $actualQuantity = (int)self::getItemByProductName($크롤러, $productName) ->필터('입력[유형="숫자"]') ->속성('값'); Assert::assertEquals($expectedQuantity, $actualQuantity); } 개인 정적 함수 getItemByProductName(크롤러 $crawler, 문자열 $productName) { $items = $crawler->filter('.col-md-8 .list-group-item')->reduce( 기능(크롤러 $node) 사용($productName) { if ($node->filter('h5')->getNode(0)->textContent === $productName) { 반환 $ 노드; } 거짓을 반환합니다. } ); 빈($items) 반환 ? null : $items->eq(0); }
assertCartNotContainsProduct() 장바구니에 인수로 제공된 제품이 포함되어 있지 않은지 확인하려면 assertCartNotContainsProduct 메서드를 추가하세요. 공개 정적 함수 assertCartNotContainsProduct(Crawler $crawler, string $productName): 무효 { 주장::assertEmpty( self::getItemByProductName($크롤러, $productName), "장바구니에는 \"$productName\" 제품이 포함되어서는 안 됩니다." ); }
카트 컨트롤러 Symfony에서 기능 테스트는 컨트롤러를 테스트하는 것으로 구성됩니다. 컨트롤러를 테스트하려면 이 컨트롤러에 대한 기능 테스트를 생성해야 합니다. CartControllerTest 테스트를 위한 기능 테스트 생성: symfony 콘솔 만들기:기능 테스트 컨트롤러\\CartController 테스트/컨트롤러/ 클래스가 WebTestCase 디렉토리에 생성되었습니다. <?php 네임스페이스 App\Tests\Controller; Symfony\Bundle\FrameworkBundle\Test\WebTestCase 사용; CartControllerTest 클래스는 WebTestCase를 확장합니다. { 공개 함수 testSomething() { $client = 정적::createClient(); $크롤러 = $client->request('GET', '/'); $this->assertResponseIsSuccessful(); $this->assertSelectorTextContains('h1', 'Hello World'); } } 응용 프로그램 페이지에서 요청을 만드는 데 도움이 되도록 클라이언트 개체를 제공하는 특수 request() 클래스를 확장합니다. 실제로 테스트 클라이언트는 브라우저와 같은 HTTP 클라이언트를 시뮬레이션하고 Symfony 애플리케이션에 요청합니다. JavaScript를 사용하지 않기 때문에 실제 브라우저에서 테스트할 필요가 없습니다. / 메서드는 HTTP 메서드와 URL을 인수로 사용하고 Crawler 인스턴스를 반환합니다. 크롤러는 응답에서 DOM 요소를 찾는 데 사용됩니다. 카트 어설션을 만들기 위해 이전에 사용했습니다. 장바구니 페이지를 테스트하려면 장바구니에 제품을 추가해야 합니다. 제품 고정 장치가 이미 있으므로 홈페이지( getRandomProduct() )로 이동하여 제품 목록에서 이름, 가격 및 URL과 함께 임의의 제품을 가져옵니다. 이를 수행하기 위해 addRandomProductToCart() 메서드를 생성해 보겠습니다. <?php 네임스페이스 App\Tests\Controller; Symfony\Bundle\FrameworkBundle\Test\WebTestCase 사용; Symfony\Component\BrowserKit\AbstractBrowser를 사용하십시오. CartControllerTest 클래스는 WebTestCase를 확장합니다. { 개인 함수 getRandomProduct(AbstractBrowser $client): 배열 { $크롤러 = $client->request('GET', '/'); $productNode = $crawler->filter('.card')->eq(rand(0, 9)); $productName = $productNode->filter('.card-title')->getNode(0)->textContent; $productPrice = (float)$productNode->filter('span.h5')->getNode(0)->textContent; $productLink = $productNode->filter('.btn-dark')->link(); 반품 [ '이름' => $productName, '가격' => $productPrice, 'url' => $productLink->getUri() ]; } } 이제 이 방법 덕분에 임의의 제품을 장바구니에 추가할 수 있습니다. /cart 메소드를 생성하고 랜덤 상품을 받고 상품 URL 덕분에 상품 상세 페이지로 이동해 봅시다. 그런 다음 양식을 사용하여 장바구니에 제품을 추가합니다. <?php 네임스페이스 App\Tests\Controller; Symfony\Bundle\FrameworkBundle\Test\WebTestCase 사용; Symfony\Component\BrowserKit\AbstractBrowser를 사용하십시오. CartControllerTest 클래스는 WebTestCase를 확장합니다. { // ... 개인 함수 addRandomProductToCart(AbstractBrowser $client, int $quantity = 1): 배열 { $product = $this->getRandomProduct($client); $크롤러 = $client->request('GET', $product['url']); $form = $crawler->filter('form')->form(); $form->setValues(['add_to_cart[수량]' => $수량]); $client->submit($form); 반품 $product; } } 이제 각 기능 테스트에 대해 임의의 제품을 추가하고 장바구니 페이지( testCartIsEmpty() )로 이동하여 추출된 제품 이름과 가격을 사용하여 장바구니 총계, 제품 수량 및 장바구니에 있는 항목 수를 확인할 수 있습니다. 홈페이지에서.
testCartIsEmpty() 첫 번째 테스트는 장바구니 페이지로 이동할 때 장바구니가 비어 있고 장바구니에 제품을 추가한 적이 없는지 확인하는 것입니다. /cart 메소드를 추가하고 장바구니 페이지( CartAssertionsTrait )로 이동하여 testAddProductToCart() 특성 덕분에 장바구니가 비어 있다고 주장합니다. <?php 네임스페이스 App\Tests\Controller; App\Tests\CartAssertionsTrait 사용; Symfony\Bundle\FrameworkBundle\Test\WebTestCase 사용; CartControllerTest 클래스는 WebTestCase를 확장합니다. { CartAssertionsTrait 사용 공개 함수 testCartIsEmpty() { $client = 정적::createClient(); $크롤러 = $client->request('GET', '/카트'); $this->assertResponseIsSuccessful(); $this->assertCartIsEmpty($크롤러); } }
testAddProductToCart() testAddProductTwiceToCart() 메서드를 추가하여 장바구니에 제품을 추가할 수 있는 제품 양식을 테스트합니다. 장바구니에 제품을 추가하고 장바구니에 수량 1인 항목이 1개만 있다고 주장합니다. 또한 장바구니 합계가 제품 가격과 같은지 확인합니다. <?php 네임스페이스 App\Tests\Controller; App\Tests\CartAssertionsTrait 사용; Symfony\Bundle\FrameworkBundle\Test\WebTestCase 사용; Symfony\Component\BrowserKit\AbstractBrowser를 사용하십시오. CartControllerTest 클래스는 WebTestCase를 확장합니다. { CartAssertionsTrait 사용 // ... 공개 함수 testAddProductToCart() { $client = 정적::createClient(); $product = $this->addRandomProductToCart($client); $크롤러 = $client->request('GET', '/카트'); $this->assertResponseIsSuccessful(); $this->assertCartItemsCountEquals($크롤러, 1); $this->assertCartContainsProductWithQuantity($크롤러, $product['이름'], 1); $this->assertCartTotalEquals($크롤러, $product['가격']); } }
testAddProductTwiceToCart() 장바구니에 제품을 두 번 추가할 때 장바구니에 제품이 중복되지 않고 수량이 증가하는지 테스트해야 합니다. testRemoveProductFromCart() 메서드를 추가하고 임의의 제품을 가져와 제품 페이지로 이동합니다. 제품 양식을 사용하여 제품을 장바구니에 두 번 추가하고 장바구니에 수량 2인 항목이 1개만 있다고 주장합니다. 또한 장바구니 합계가 제품 가격에 2를 곱한 것과 같다고 주장할 것입니다. <?php 네임스페이스 App\Tests\Controller; App\Tests\CartAssertionsTrait 사용; Symfony\Bundle\FrameworkBundle\Test\WebTestCase 사용; Symfony\Component\BrowserKit\AbstractBrowser를 사용하십시오. CartControllerTest 클래스는 WebTestCase를 확장합니다. { CartAssertionsTrait 사용 // ... 공개 함수 testAddProductTwiceToCart() { $client = 정적::createClient(); // 홈페이지에서 임의의 제품을 가져옵니다. $product = $this->getRandomProduct($client); //에서 제품 페이지로 이동 $크롤러 = $client->request('GET', $product['url']); // 장바구니에 제품을 두 번 추가합니다. ($i=0 ; $i<2 ;$i++) { $form = $crawler->filter('form')->form(); $form->setValues(['장바구니 추가[수량]' => 1]); $client->submit($form); $크롤러 = $client->followRedirect(); } // 장바구니로 이동 $크롤러 = $client->request('GET', '/카트'); $this->assertResponseIsSuccessful(); $this->assertCartItemsCountEquals($크롤러, 1); $this->assertCartContainsProductWithQuantity($크롤러, $product['이름'], 2); $this->assertCartTotalEquals($크롤러, $product['가격'] * 2); } }
testRemoveProductFromCart() testClearCart()를 추가하여 장바구니 페이지의 제거 버튼이 장바구니에서 제품을 제거하는지 테스트합니다. <?php 네임스페이스 App\Tests\Controller; App\Tests\CartAssertionsTrait 사용; Symfony\Bundle\FrameworkBundle\Test\WebTestCase 사용; Symfony\Component\BrowserKit\AbstractBrowser를 사용하십시오. CartControllerTest 클래스는 WebTestCase를 확장합니다. { CartAssertionsTrait 사용 // ... 공개 함수 testRemoveProductFromCart() { $client = 정적::createClient(); $product = $this->addRandomProductToCart($client); // 장바구니 페이지로 이동 $client->request('GET', '/카트'); // 장바구니에서 제품을 제거합니다. $client->submitForm('제거'); $크롤러 = $client->followRedirect(); $this->assertCartNotContainsProduct($크롤러, $product['이름']); } }
기능 테스트 작성 testClearCart()를 추가하여 장바구니 페이지의 지우기 버튼이 장바구니에서 모든 항목을 제거하는지 테스트합니다. <?php 네임스페이스 App\Tests\Controller; App\Tests\CartAssertionsTrait 사용; Symfony\Bundle\FrameworkBundle\Test\WebTestCase 사용; Symfony\Component\BrowserKit\AbstractBrowser를 사용하십시오. CartControllerTest 클래스는 WebTestCase를 확장합니다. { CartAssertionsTrait 사용 // ... 공개 함수 testClearCart() { $client = 정적::createClient(); $this->addRandomProductToCart($client); // 장바구니 페이지로 이동 $client->request('GET', '/카트'); // 장바구니 비우기 $client->submitForm('지우기'); $크롤러 = $client->followRedirect(); $this->assertCartIsEmpty($크롤러); } }
Reference
이 문제에 관하여(장바구니 테스트 | Symfony로 장바구니 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/qferrer/testing-the-cart-building-a-shopping-cart-with-symfony-476텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)