Magento 1.9의 단위 테스트 모범 사례


11

여러 사용자 지정 모듈이있는 Magento 1.9 사이트를 유지 관리합니다. 일부 기능은 비즈니스에 중요하며 일부 단위 테스트가 절실히 필요합니다. 예를 들어 단가 계산기.

나는 보통 Symfony에서 개발하고 가능하다면 PHPUnit (w / Composer)을 사용하는 것을 선호합니다.

일부 기능은 여러 사용자 정의 데이터베이스 테이블로 가져온 데이터를 기반으로하므로 어떻게 든 고정 장치를로드하는 것을 선호합니다.

그래서 일부 단위 테스트 작성에 대한 모범 사례 접근 방식을 찾고 있습니다. 튜토리얼이나 이와 비슷한 것을 기쁘게 생각합니다. 도움을 주시면 감사하겠습니다.

답변:


10

나는 다시 같은 문제에 직면했다.

나는 Ecomdev PHPUnit 모듈을 사용하는 것을 고려 했지만 사용하기가 어렵고 문서화가 잘못되었습니다 (그러나 Ivan 이하는 일과 Magento 생태계에 대한 그의 큰 공헌을 여전히 좋아합니다).

따라서 Vinai의 도움으로 다음 테스트 프레임 워크 모듈을 개발했습니다. https://github.com/digitalpianism/testframework

원래 목적은 통합 테스트를위한 것이지만 단위 테스트에도 사용하고 있습니다. https://github.com/digitalpianism/easytoplinks/blob/master/app/code/community/DigitalPianism/EasyToplinks/Test/Unit/Block/Page/Template/LinksTest.php 에서 확인할 수 있습니다.

고정 장치와 관련하여 데이터베이스에서 샘플 데이터를 만들지 않기 위해 트랜잭션 롤백을 사용하고 있습니다.


이것은 유망한 것으로 보입니다. 시도해 볼게요. 감사.
frigg

13

설치

Magento 1은 기본적으로 composer를 사용하지 않으므로 composer를 사용하여 phpunit을 설치하거나 phar 버전을 다운로드하면 큰 차이가 없다고 생각합니다 .
사이트에서 다른 타사 모듈이나 라이브러리를 관리하기 위해 이미 composer를 사용하고 있다면 composer가 가장 적합합니다. PHP7을 사용하지 않으면 phpunit의 이전 버전으로 제한됩니다 (그래서 위의 4.8 버전에 링크했습니다).

통합 테스트 및 / 또는 단위 테스트

Magento 1은 매우 무거운 애플리케이션이므로 phpunit 부트 스트랩을 통합 및 단위 테스트 용으로 분리하는 것이 좋습니다.
단위 테스트 부트 스트랩은 오토로더 만 초기화하면되며 통합 테스트 부트 스트랩은 구성로드 및 db 연결을 포함한 전체 애플리케이션 환경을 초기화해야합니다.
Magento에서의 통합 테스트로 인해 단위 테스트보다 훨씬 느리게 실행되는 경향이 있습니다 (다른 애플리케이션보다 훨씬 더).

마 젠토를 PHPUnit으로 부트 스트랩

  • Magento의 오토로더는 클래스가있는 파일을 찾을 수 없으면 예외를 던지므로 PSR-0과 호환되지 않습니다. 이로 인해 class_existsphpunit에서 일부 사용법이 중단 됩니다. 몇 가지 가능한 해킹 방법이 있습니다.

    • \Varien_Autoload::autoload()예외를 무시하고 데코레이터로 래핑하여 Magento 오토로더의 등록을 해제하고 래퍼를 새로운 오토로더로 등록하십시오. 이는 오토로더를 등록하고 특정 오토로더 순서에 의존하는 타사 라이브러리와 충돌 할 가능성이 낮습니다.
    • Magento 1에 내장 된 것을 감싸는 사용자 지정 오류 처리기를 사용하십시오. 사용자 지정 오류 처리기는 Magento 자동 로더에 의해 트리거 된 오류를 삼 킵니다. 이것이 Raphael의 테스트 프레임 워크가 사용 하는 솔루션입니다 . 다른 타사 확장 프로그램과 가장 호환되는 것 같습니다.
    • 포함 경로 해킹을 사용하여 \Varien_Autoload::autoload()파일이 존재하지 않는 경우 오류를 발생시키지 않도록 재정의 하십시오. 그러나 이것은 동일한 클래스를 재정의하는 여러 모듈과 충돌합니다. 나는이 접근법을 직접 사용하지 않습니다.
  • 테스트 중에 시작되는 세션의 오류를 피하려면 $_SESSON = []부트 스트랩에 간단히 설정 하십시오.

  • Mage::app()->setResponse($testResponse)실제 응답 을 확장하지만 출력이나 헤더를 보내지 않는 사용자 정의 응답 오브젝트를 설정하십시오 .

  • 런타임 상태를 완전히 변경하는 통합 테스트간에 Magento를 다시 초기화하려면을 사용하십시오 Mage::reset(); Mage::app(). 그 후에는 오류 처리기를 다시 장식해야합니다.

비품

DB 조명기의 경우 조명기 방법에 일반 모델을 사용하여 조명기를 만듭니다 createSimpleProduct($sku). 마찬가지로 라파엘 사용했다 setUp()tearDown()(예를 들어, 테스트 후 롤백됩니다 트랜잭션에서 테스트를 감싸는 Mage::getSingleton('core/resource')->getConnection('default_setup')->beginTransaction()).

매장 구성 설비의 경우,를 사용하여 인 메모리 전용 설비를 설정하는 경향이 Mage::app()->getStore()->setConfig($path, $value)있습니다.

EcomDev_PHPUnit확장은 또한 YAML 파일을 사용하여 DB기구를 만들 수있는 옵션을 제공하지만, 나 자신을 위해 나는 그 열심히 모델 클래스를 사용하여 만든기구에 비해 유지하기 찾을 수 있습니다. YMMV.

테스트 복식

레지스트리를 통해 생성 된 개체에 대한 테스트 복식를 주입하는 데 사용할 수 있습니다 Mage::getSingleton(), Mage::getResourceSingleton()하고 Mage::helper().
일부 다른 중앙 객체를 설정할 수 있습니다 Mage::app()(예 : 요청). 테스트 복식을
통해 Mage::getModel()또는 Mage::getResourceModel()테스트 복식으로 작성된 클래스를 바꾸려면 사용자 정의 구성 오브젝트 랩퍼 를 사용해야합니다. 참조 즉 수행 할 수있는 방법 라파엘의 테스트 프레임 워크를.

요약

Magento가 부트 스트랩되면 거의 모든 것이 잘 테스트 될 수 있습니다. 핵심 코드가 사용하는 대량의 메소드 체인으로 인해 딥 모의를 만들 준비를하십시오.
설정이 해킹되었지만 잘 작동하고 테스트 결과 Symphony 앱의 테스트 스위트와 거의 비슷한 많은 자신감과 가치를 얻습니다.


나는 그것을 시도하지 않았지만 왜 Magento Test Framework를 사용하지 않습니까? ( docs.magento.com/m1/ce/user_guide/magento/… )
Fra

3
예, 시도했지만 기능 테스트 (단위 또는 통합이 아님), 느리고 복잡하고 테스트가 벗겨지기 쉽고 부서지기 쉽습니다. 대체로 나는 그것을 낭비하는 시간을 고려했습니다.
Vinai

@Vinai 나는 늦었지만 알고 있지만 일반적으로 컨트롤러에는 모델과 컬렉션에 대한 호출이 있으며 테스트하는 동안 필요하지 않습니다. 테스트 프레임 워크 (DigitalPianism)를 사용하고 있으며 모델을 TestDouble 할 수는 있지만 모델을 사용하는 컨트롤러 작업에 대한 요청을하는 동안 어떻게 모델 / 컬렉션 호출을 조롱 할 수 있습니까?
arqam
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.