2014-09-16 3 views
4

I have an item in my order cart과 같은 메타 스텝을 정의해야합니다. Context 클래스에서이 단계의 정의를 작성하는 대신 일부 기능 파일에서 기존 단계를 사용하기 만하면됩니다. 이미 기능을 테스트하기위한 시나리오가 있기 때문에 Adding item to order cart.컨텍스트 클래스에서 시나리오를 정의하는 대신 메타를 사용하여 시나리오 중 하나를 사용할 수 있습니까?

기존 솔루션이 있습니까? 나는 이것이 매우 대중적인 유스 케이스이고 Context 클래스에서 meta-step을 정의하는 것보다 더 나은 해결책이 있어야한다고 생각한다.

답변

4

짧은 답변 : 번호

나는 그것이 매우 유용한 기능처럼 보일 수 있습니다 알고 있지만,이 단계/깨지기 쉬운 테스트 리드 시나리오 사이 unnecesary 의존성을 일으키는 원인이 매우 빨리 당신을 물린 것이다.

해결 방법은 컨텍스트 파일을 기능 파일과 PHP 코드 사이의 다리 역할을하는 것입니다. 즉, 컨텍스트 파일 메서드가 짧고 대부분의 작업을 다른 개체에 위임한다는 의미입니다.

/** 
* @Given I open the product page 
*/ 
public function iOpenTheProductPage() 
{ 
    $this->productPage->open(); 
} 

/** 
* @Given I add a :product to the cart 
*/ 
public function iAddProductToTheCart($product) 
{ 
    $this->productPage->addToCart($product); 
} 

/** 
* @Given I have an item in the cart 
*/ 
public function iHaveAnItemInTheCart() 
{ 
    // reuse 
    $this->productPage->open(); 
    $this->productPage->addProduct('Behat t-shirt'); 

    // ... or put the items directly to the db! 
} 

는 또한, 실제로 카트에 항목을 추가하는 것은 우리가 테스트하고 내용에 따라 약간 차이가있을 수 있습니다 : 컨텍스트 사이에 중복이 없다 이런 식으로, 당신은 단순히 다른 개체를 호출합니다.

"장바구니에 담기"시나리오에서 작업하는 경우 페이지를 방문하여 장바구니에 제품을 추가하는 과정을 거쳐야 할 수 있습니다.

그러나 "헤더의 미니 ​​카트보기"시나리오를 진행하는 경우 테스트 스위트를 조금 더 빠르게 만들려면 바로 가기가 필요할 수 있습니다. givens에서 "라고 말하면 카트에 상품이 있습니다."라고 말하면 항목이있는 데이터베이스/세션 /에 직접 입력 할 수 있습니다. 다른 시나리오에서 장바구니에 항목을 추가하는 방법을 다뤘으므로 이러한 바로 가기를 사용할 수 있습니다.

그런데 웹 애플리케이션 테스트를 자동화한다면 page objects과 같은 패턴이 매우 유용 할 것입니다.

1

한 가지 해결책은 시나리오를 가져 와서 컨텍스트 기능의 메타 스텝으로 변환 한 다음 그 시나리오를 새로운 단계만으로 대체하는 것입니다. 그런 다음 다른 시나리오의 일부로이를 사용하려면 이미 단계로 사용할 수 있습니다.

FWIW, Everzet (Behat의 제작자)은 최근에 유지하기가 어렵 기 때문에 메타 스텝에 반대합니다. 더 많은 유지 보수가 가능한 옵션은 메타 스텝을 통해 호출하는 대신 단계에 기본 PHP 함수를 사용하는 것입니다. 그러나 meta-steps과 함수 호출을 섞은 사람에게는 큰 불행입니다! 어떤 방법으로 일찍 결정하는 것이 가장 좋습니다.