GWT (Gifd When When)와 AAA (Arant Act Assert)의 차이점은 무엇입니까?


13

TDD에는 AAA (Arrange Act Assert) 구문이 있습니다.

[Test]
public void Test_ReturnItemForRefund_ReturnsStockOfBlackSweatersAsTwo_WhenOneInStockAndOneIsReturned()
{
    //Arrange
    ShopStock shopStock = new ShopStock();
    Item blackSweater = new Item("ID: 25");
    shopStock.AddStock(blackSweater);
    int expectedResult = 2;
    Item blackSweaterToReturn = new Item("ID: 25");

    //Act
    shopStock.ReturnItemForRefund(blackSweaterToReturn);
    int actualResult = shopStock.GetStock("ID: 25");

    //Assert
    Assert.AreEqual(expectedResult, actualResult);
}

BDD 쓰기 테스트에서 유사한 구조를 사용하지만 GWT (Gift When When) 구문을 사용합니다.

    [Given(@"a customer previously bought a black sweater from me")]
    public void GivenACustomerPreviouslyBoughtABlackSweaterFromMe()
    { /* Code goes here */   }

    [Given(@"I currently have three black sweaters left in stock")]
    public void GivenICurrentlyHaveThreeBlackSweatersLeftInStock()
    { /* Code goes here */   }

    [When(@"he returns the sweater for a refund")]
    public void WhenHeReturnsTheSweaterForARefund()
    { /* Code goes here */   }

    [Then(@"I should have four black sweaters in stock")]
    public void ThenIShouldHaveFourBlackSweatersInStock()
    { /* Code goes here */   }

그것들은 종종 같은 것으로 간주되지만 차이점이 있습니다. 몇 가지 핵심 사항은 다음과 같습니다.

  1. GWT는 BDD 프레임 워크에서 기능 파일의 스펙에 직접 맵핑 될 수 있습니다.

  2. GWT는 평범한 영어 사용을 장려하고 각 부분의 활동에 대한 간단한 설명을 통해 비 개발자가 이해하기 쉽습니다.

  3. SpecFlow 및 Cucumber와 같은 다양한 BDD 프레임 워크의 키워드 When and Then

내 질문은 AAA와 GWT 사이에 다른 이름 (이름 외에)이 있습니까? 그리고 위에 지정된 것 외에 다른 것보다 선호 해야하는 이유가 있습니까?


3
'자연어처럼 읽습니다'를 제외하고는 차이가 없습니다. 합의가 이루어지면 조치가 일어날 때 새로운 상태에 대해 주장한다. '
Sjoerd Job Postmus

나는 당신이 몇 가지 관련 포인트를 발견했다고 생각하며 추가 차이점에 대한 답을 얻지 못할 것입니다. 형식이 완전히 방법론에 독립적이지만 소규모의 독립적 인 테스트를 장려하기 때문에 가치가있는 것은 단위 테스트에 AAA를 독점적으로 사용합니다.
amon

답변:


9

귀하의 질문에 차이점을 잘 나열했다고 생각하지만 두 가지 접근 방식을 보는 방법에 대한 의견을 추가하겠습니다.

AAA는 내 코드를 테스트 할 때 매우 유용합니다. 내가 직접 프로젝트 나 도서관에서 일하고 있다면 AAA가 내가가는 길입니다. 테스트를 실행하는 데 필요한 모든 것을 설정 한 다음 테스트 할 수 있습니다. 설정이 빠르고 코드가 예상대로 작동하는지 빠르게 확인할 수 있습니다.

GWT는 프로그래머가 수행하는 작업을 비즈니스 가치에 매핑해야하는 비즈니스 환경에서 유용합니다. 비즈니스 가치는 기능과 버그를 유발하지 않는 기능으로 매핑됩니다. 기능을 프로그래밍 작업에 매핑하는 많은 전략이 있지만 그 중 하나는 요구 사항을 통과하는 것입니다. 내 경험상 요구 사항은 사용자 수준 요구 사항부터 사용자가 실행할 작은 작업까지 다양합니다. 이는 관리자가 프로그래머가 수행하는 작업이 고객 / 사용자에게 미치는 영향을 이해하기 쉽고 프로그래머가 비즈니스에 가치를 더하는 이유를 이해하기 쉽기 때문에 유용합니다.

  • 사용자 레벨 요구 사항 : 창고에 재고에 N 개의 품목이있는 경우 사용자가 N 개의 품목을 구매하면 N 개의 품목이 사용자에게 배송됩니다.
  • 시스템 레벨 요구 사항 1 : 재고 시스템에 재고에 N 개의 품목이있는 경우, N 품목에 대한 요청이 재고 시스템에 입력되면 재고 시스템은 해당 유형의 품목에 대한 재고 수를 줄입니다.
  • 시스템 레벨 요구 사항 2 : 지불 시스템에 재고에 N 개의 품목이있는 경우 N 개의 품목에 대한 요청이 지불 시스템에 입력되면 지불 시스템은 사용자에게 N 개의 품목에 대한 비용을 청구합니다.
  • ...
  • 프로그래머 수준 요구 사항 1 : 인벤토리에 스웨터 5 개가 있고 인벤토리에서 스웨터 3 개를 제거한 다음 인벤토리에 2 개의 시트를 남겨둔 경우
  • ...

이러한 종류의 요구 사항 구조는 모든 프로그래머 수준 요구 사항이 트리를 사용자 수준 요구 사항에 매핑하는 트리와 같은 디자인을 허용합니다. 이런 방식으로 프로그래머 수준 요구 사항이 실패하면 어떤 사용자 수준 요구 사항이 영향을 받는지 알 수 있습니다.

반대로 AAA 테스트는 다음과 같습니다. 이것은 나에게 매우 프로그래머 지향적이며 비즈니스에는 유용하지 않습니다. AAA 테스트 전략으로 유사한 트리 구조 요구 사항을 만들 수는 없지만 AAA 언어로는 더 쉽게 할 수 없습니다.

public void Test_CaseWhereThereAreEnoughSweatersLeft() {
    // Arrange
    // setup Sweater Inventory mock (DB mocks, etc)
    // count = 5
    // when The number of sweaters remaining is request, return count
    // when Inventory is requested to remove N items, then count = count - N

    // Act
    // call the Unit Under Test to remove 3 items from inventory

    // Assert
    // the number of sweaters in the inventory is 2
    // the removal should return indicating a successful removal of items from the inventory
}

public void Test_CaseWhereThereAreNotEnoughSweatersLeft() {
    // Arrange
    // setup Sweater Inventory mock (DB mocks, etc)
    // count = 2
    // when The number of sweaters remaining is request, return count
    // when Inventory is requested to remove N items, then count = count - N

    // Act
    // call the Unit Under Test to remove 3 items from inventory

    // Assert
    // the number of sweaters remaining is still 2
    // the removal should return an error indicating not enough items in the inventory
}

사람들이 컴퓨터 (따라서 프로그래머)가 자신의 사업에 가치를 더하고 있는지에 대해 의문을 가질 때 항상 흥미 롭습니다. 그것은 수 정말로 단지 하나의 큰 이기적인 속여 먹다 수? 비즈니스 관리자는 프로그래밍을 통해 목표를 달성하는 방법을 이해하기 위해 프로그래밍에 대해 충분히 배우거나 단순히 걱정하지 않고 신뢰한다고 생각합니다. 심방 세포에서 지연 정류기 전류의 시작에 영향을 미치는 화학 물질이 어떻게 작동하는지 이해하지 못할 수도 있지만 더 이상 심장 부정맥이없는 것이 얼마나 좋은지를 느낄 수 있습니다.

추상화는 컴퓨터 과학 이외의 중요한 것입니다. 사람들은 다양한 분야에 대한 전문 지식을 보유하게되며 다른 사람과 전문 지식을 전달하는 것이 비즈니스에 중요합니다. GWT는 프로그래머와 (프로그램) 관리자가 통신하도록하는 데 유용한 추상화입니다. 둘째, 프로그래머는 프로그래머가 비즈니스 가치를 거의 또는 전혀 얻지 못할 가능성이 있다고 상상하기 쉽습니다. 마지막으로, GWT는 프로그래머와 관리자가 통신 할 수있는 유일한 방법이 아니라 비즈니스가 시도 할 수있는 많은 도구 중 하나라는 점에 주목할 가치가 있습니다.
Frank Bryce

또한 의사 가 심장 부정맥 교정 메커니즘을 삽입하기 전에 작동하는 이유를 이해하기를 원합니다 . GWT 테스트는 "이유"에 대한 답변을 제공합니다. 프로그래머와 제품 관리자 간의 커뮤니케이션을 돕는 GWT는 화학자와 의사 간의 커뮤니케이션과 유사합니다. 제품 관리자는 의사가 환자에게 심장 부정맥 교정으로 얻는 가치에 대해 의사 소통하는 동안 어떤 기능을 받고 있는지 사용자와 통신합니다.
Frank Bryce

4

사용중인 프레임 워크에 따라 다릅니다. 일반적으로, 내가 이해하는 한, AAA는 NUnit 프레임 워크에 의해 지원되므로 그 점에서 자연스러운 선택입니다. TDD와 BDD의 이론적 차이는 약간 나타납니다. 나보다 더 자격이있는 사람 이이 링크를 참조 하면 설명 할 수 있습니다.


2

전혀 차이가 없습니다.
세 가지 테스트 상태 :
주어진 = 정렬,
시기 = 작동,
다음 = 어설 션.

질문에 제공 한 차이점은 GWT와 AAA가 아닌 TDD와 BDD의 차이점입니다.

TDD에서는 한 번의 테스트에 세 가지 방법을 사용할 수 있습니다

public class TestsOfFormatMethod
{        
    public void Arrange() { // set dependencies }
    public string Act() { // return formattted result }
    public string AssertThatFormatIsEmpty()
    {
        Arrange();
        var actual = Act();
        Assert.IsEmpty(actual);
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.