Sự khác nhau giữa Đưa ra khi đó (GWT) và Arrange Act Assert (AAA)?


13

Trong TDD có cú pháp Arrange Act Assert (AAA):

[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);
}

Trong các bài kiểm tra viết BDD sử dụng một cấu trúc tương tự nhưng với cú pháp Cho trước khi đó (GWT):

    [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 */   }

Mặc dù chúng thường được coi là giống nhau nhưng có sự khác biệt. Một vài cái chính là:

  1. GWT có thể được ánh xạ trực tiếp đến đặc điểm kỹ thuật của tệp tính năng trong các khung BDD

  2. GWT dễ hiểu hơn đối với những người không phải là nhà phát triển bằng cách khuyến khích sử dụng tiếng Anh đơn giản và có một mô tả ngắn về những gì mỗi phần đang làm

  3. Khi nào và sau đó là các từ khóa trong các khung BDD khác nhau như SpecFlow và Cucumber

Câu hỏi của tôi là có sự khác biệt nào khác (ngoài tên) giữa AAA và GWT không? Và có lý do nào ngoài những lý do được chỉ định ở trên mà cái này nên được ưu tiên hơn cái kia không?


3
Tôi không thấy sự khác biệt ngoại trừ 'đọc giống ngôn ngữ tự nhiên hơn'. Đưa ra một thỏa thuận, khi một hành động xảy ra, sau đó khẳng định mọi thứ về trạng thái mới. '
Sjoerd Công việc Postmus

Tôi nghĩ rằng bạn đã tìm thấy một vài điểm có liên quan và sẽ không thể nhận được câu trả lời với sự khác biệt bổ sung. Để biết giá trị của nó, tôi độc quyền sử dụng AAA cho các bài kiểm tra đơn vị vì định dạng này hoàn toàn độc lập về phương pháp nhưng khuyến khích các bài kiểm tra nhỏ, độc lập.
amon

Câu trả lời:


9

Tôi nghĩ rằng bạn đã liệt kê những khác biệt rất tốt trong câu hỏi của bạn, tuy nhiên tôi sẽ thêm một số ý kiến ​​của tôi về cách tôi xem hai cách tiếp cận.

AAA rất hữu ích cho tôi khi tôi đang kiểm tra mã của riêng mình. Nếu tôi đang làm việc cho một dự án hoặc một thư viện cho chính mình, AAA là con đường mà tôi đi. Nó cho phép tôi thiết lập bất cứ điều gì tôi cần để thực hiện kiểm tra của mình và sau đó chỉ cần kiểm tra nó . Thật nhanh chóng để thiết lập và nhanh chóng để xác minh rằng mã của tôi đang hoạt động như tôi mong đợi.

GWT rất hữu ích trong môi trường kinh doanh, nơi công việc được thực hiện bởi các lập trình viên cần được ánh xạ tới giá trị doanh nghiệp. Giá trị doanh nghiệp được ánh xạ bởi các tính năng và hy vọng các tính năng không giới thiệu lỗi. Có nhiều chiến lược để ánh xạ các tính năng vào các nhiệm vụ lập trình, nhưng một trong số đó là thông qua các yêu cầu. Theo kinh nghiệm của tôi, các yêu cầu bao gồm từ các yêu cầu ở cấp độ người dùng cho đến các tác vụ nhỏ để người dùng thực hiện. Điều này rất hữu ích vì các nhà quản lý dễ hiểu công việc mà lập trình viên đang làm đang tác động đến khách hàng / người dùng của họ như thế nào và do đó, tại sao các lập trình viên lại tăng thêm giá trị cho doanh nghiệp của họ

  • Yêu cầu ở cấp độ người dùng: Do kho có ít nhất N vật phẩm trong kho, khi người dùng mua N vật phẩm, thì kho sẽ chuyển N vật phẩm cho người dùng
  • Yêu cầu cấp độ hệ thống 1: Với hệ thống hàng tồn kho có N mặt hàng tồn kho, khi yêu cầu đối với mặt hàng N được đưa vào hệ thống hàng tồn kho thì hệ thống hàng tồn kho sẽ giảm số lượng hàng tồn kho cho loại mặt hàng đó
  • Yêu cầu ở cấp độ hệ thống 2: Với hệ thống thanh toán có N vật phẩm trong kho, khi yêu cầu đối với N mặt hàng được nhập vào hệ thống thanh toán thì hệ thống thanh toán sẽ tính phí cho người dùng đối với N mặt hàng
  • ...
  • Yêu cầu cấp độ lập trình viên 1: Đưa ra 5 áo len trong kho, khi 3 áo len được loại bỏ khỏi kho thì 2 ghế còn lại trong kho
  • ...

Kiểu cấu trúc yêu cầu này cho phép thiết kế giống như cây trong đó tất cả các Yêu cầu cấp độ lập trình viên ánh xạ cây theo Yêu cầu cấp độ người dùng. Theo cách này, khi Yêu cầu cấp độ lập trình viên thất bại thì bạn sẽ biết Yêu cầu cấp độ người dùng nào bị ảnh hưởng.

Ngược lại, một bài kiểm tra AAA có thể trông như thế này. Điều này với tôi là rất lập trình viên và không hữu ích cho doanh nghiệp. Điều đó không có nghĩa là cấu trúc cây yêu cầu tương tự không thể được tạo ra từ chiến lược thử nghiệm AAA, nhưng không có gì bằng ngôn ngữ của AAA giúp việc thực hiện dễ dàng hơn.

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
}

Tôi luôn thấy thú vị khi mọi người đặt câu hỏi liệu máy tính (và do đó lập trình viên) có tăng thêm giá trị cho doanh nghiệp của họ hay không. Nó thực sự có thể chỉ là một trezle tự phục vụ lớn? Tôi nghĩ rằng một người quản lý doanh nghiệp nên học đủ về lập trình để hiểu cách thức thực hiện mục tiêu của họ, hoặc đơn giản là tin tưởng rằng nó không và không phải lo lắng. Tôi có thể không thực sự hiểu làm thế nào một hóa chất ảnh hưởng đến sự khởi đầu của dòng chỉnh lưu chậm trong các tế bào tâm nhĩ hoạt động, nhưng tôi chắc chắn có thể cảm thấy tốt như thế nào khi không bị rối loạn nhịp tim nữa.

Trừu tượng là quan trọng bên ngoài chỉ Khoa học máy tính. Mọi người sẽ có chuyên môn trong các lĩnh vực khác nhau và có thể truyền đạt chuyên môn đó với những người khác là điều tối quan trọng đối với một doanh nghiệp. GWT là một sự trừu tượng rất hữu ích để giúp các lập trình viên và các nhà quản lý (chương trình | dự án) giao tiếp. Thứ hai, là một lập trình viên, thật dễ dàng để tưởng tượng rằng các lập trình viên có tiềm năng tạo ra ít hoặc không có giá trị cho một doanh nghiệp. Cuối cùng, điều đáng chú ý là GWT không phải là cách duy nhất để các lập trình viên và người quản lý giao tiếp, mà là một trong nhiều công cụ mà một doanh nghiệp có thể muốn thử.
Frank Bryce

Ngoài ra, tôi muốn bác sĩ của tôi hiểu lý do tại sao cơ chế điều chỉnh rối loạn nhịp tim của tôi hoạt động trước khi họ đưa nó vào, không chỉ là như vậy. Các xét nghiệm GWT được cho là giúp trả lời "tại sao". GWT giúp giao tiếp giữa lập trình viên và người quản lý sản phẩm không phù hợp với giao tiếp giữa nhà hóa học và bác sĩ. Người quản lý sản phẩm giao tiếp với người dùng những tính năng họ đang nhận được trong khi bác sĩ đang truyền đạt cho bệnh nhân của họ giá trị họ nhận được khi điều chỉnh rối loạn nhịp tim.
Frank Bryce

Vâng, một bác sĩ chuyên khoa đã khuyên dùng thuốc và theo dõi nó được bắt đầu với tôi trong bệnh viện, vì nó có thể giết chết tôi. Bác sĩ tim mạch cũ thường xuyên của tôi chỉ biết rằng nó có thể hoạt động, và bác sĩ gia đình tôi chưa bao giờ nghe nói về thuốc. Thậm chí còn vui hơn khi giải thích với công ty bảo hiểm tại sao chuyến đi tới bệnh viện trị giá 93.000 đô la là cần thiết về mặt y tế (sự cố khác nhau) vì họ muốn thổi bay toàn bộ và khiến tôi phải trả tiền (đã xảy ra). Vì vậy, tôi có thể viết một lá thư một trang giải thích tất cả đều đáng giá tiền lương của một vài năm. Chuyên môn cứu sống. Và tiền bạc.

4

Tôi đoán nó phụ thuộc vào khung bạn đang sử dụng. Nói chung, theo như sự hiểu biết của tôi, AAA được hỗ trợ bởi khung NUnit và do đó là sự lựa chọn tự nhiên trong vấn đề đó. Đối với sự khác biệt về lý thuyết giữa TDD và BDD, chúng có vẻ nhẹ. Xem liên kết này , một người có trình độ hơn tôi để giải thích cho bạn.


2

Không có sự khác biệt nào cả.
Ba trạng thái thử nghiệm:
Cho = Sắp xếp,
Khi = Hành động,
Sau đó = Khẳng định.

Sự khác biệt bạn cung cấp trong câu hỏi là sự khác biệt giữa TDD và BDD và không phải là GWT và AAA.

Trong TDD, bạn có thể có ba phương pháp khác nhau cho một bài kiểm tra

public class TestsOfFormatMethod
{        
    public void Arrange() { // set dependencies }
    public string Act() { // return formattted result }
    public string AssertThatFormatIsEmpty()
    {
        Arrange();
        var actual = Act();
        Assert.IsEmpty(actual);
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.