O Zaman Ne Zaman (GWT) ve Düzenleme Yasası İddiası (AAA) arasındaki farklar?


13

TDD'de Arrange Act Assert (AAA) sözdizimi vardır:

[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'de yazma testleri benzer bir yapı kullanır ancak Verilen Zaman (GWT) sözdizimi ile:

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

Genellikle aynı kabul edilmelerine rağmen, farklılıklar vardır. Birkaç anahtar:

  1. GWT doğrudan BDD çerçevelerindeki bir özellik dosyasının özelliklerine eşlenebilir

  2. GWT, basit İngilizce kullanımını teşvik ederek ve her bir parçanın ne yaptığına dair kısa bir açıklama yaparak geliştirici olmayanların anlaması daha kolaydır

  3. SpecFlow ve Cucumber gibi çeşitli BDD çerçevelerinde anahtar kelimeler ne zaman ve sonra verilir

Benim sorum AAA ve GWT arasında başka isimler (isimlerin yanı sıra) var mı? Ve yukarıda belirtilenlerin dışında birinin diğerine tercih edilmesinin bir nedeni var mı?


3
'Doğal bir dil gibi okumak' dışında bir fark görmüyorum. Bir düzenleme yapıldığında, bir eylem gerçekleştiğinde, yeni durum hakkında bir şeyler iddia edin. '
Sjoerd Job Postmus

Birkaç alakalı nokta bulduğunuzu ve ek farklılıklar içeren bir yanıt alacağınızı düşünüyorum. Değeri ne olursa olsun, formatı tamamen metodolojiden bağımsız olduğu, ancak küçük, bağımsız testleri teşvik ettiği için sadece AAA'yı birim testler için kullanıyorum.
amon

Yanıtlar:


9

Sorunuzdaki farklılıkları çok iyi listelediğinizi düşünüyorum, ancak iki yaklaşımı nasıl gördüğüme ilişkin bazı görüşlerimi ekleyeceğim.

Kendi kodumu test ederken AAA benim için çok yararlı. Eğer kendim için bir proje veya kütüphane üzerinde çalışıyorsam, AAA benim yolumdur. Bana, benim testini çalıştırmak gerekiyor ve sonra ne olursa olsun kurmanıza olanak veren sadece test . Kurulumu hızlı ve kodumun beklediğim gibi çalıştığını doğrulamak hızlı.

GWT, programcılar tarafından yapılan işin işletme değerine eşleştirilmesi gereken iş ortamlarında kullanışlıdır. İşletme değeri, özelliklerle ve umarım hata içermeyen özelliklerle eşlenir. Özellikleri programlama görevleriyle eşleştirmek için birçok strateji vardır, ancak bunlardan biri gereksinimlerdir. Deneyimlerime göre, gereksinimler kullanıcı düzeyinde gereksinimlerden kullanıcının yürütmesi için küçük görevlere kadar uzanmaktadır. Bu yararlıdır, çünkü yöneticilerin programcının yaptığı çalışmanın müşterilerini / kullanıcılarını nasıl etkilediğini ve bu nedenle programcıların işlerine neden değer kattığını anlamaları kolaydır

  • Kullanıcı Seviyesi Gereksinimi: Depoda envanterde en az N öğe olduğu düşünüldüğünde, bir kullanıcı N öğe (ler) satın aldığında, depo kullanıcıya N öğe (ler) gönderir
  • Sistem Düzeyi Gereksinimi 1: Envanter sisteminin envanterde N öğesi olduğu düşünüldüğünde, envanter sistemine N öğesi / öğeleri için bir istek girildiğinde, envanter sistemi söz konusu öğe türü için envanter sayısını azaltır
  • Sistem Seviyesi Gereksinimi 2: Ödeme sisteminin envanterde N öğesi olduğu düşünüldüğünde, ödeme sistemine N kalem (ler) i için bir istek girildiğinde, ödeme sistemi kullanıcıyı N kalem (ler) için ücretlendirir
  • ...
  • Programcı Seviyesi Gereksinimi 1: 5 kazak envanterde, 3 kazak envanterden çıkarıldığında envanterde 2 koltuk bırakılır
  • ...

Bu tür bir gereksinim yapısı, tüm Programcı Seviyesi Gereksinimlerinin ağacı Kullanıcı Seviyesi Gereksinimleri ile eşleştirdiği ağaç benzeri bir tasarıma izin verir. Bu şekilde, bir Programcı Seviyesi Gereksinimi başarısız olduğunda, hangi Kullanıcı Seviyesi Gereksiniminin etkilendiğini bilirsiniz.

Buna karşılık, bir AAA testi böyle görünebilir. Bu benim için çok programcı ve iş için yararlı değil. Bu, benzer bir ağaç yapısının bir AAA test stratejisinden yapılamayacağı anlamına gelmez, ancak AAA dilinde hiçbir şey bunu yapmayı kolaylaştırmaz.

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
}

İnsanlar bilgisayarların (ve dolayısıyla programcıların) işlerine değer katıp katmadığını sorguladığında her zaman ilginç buluyorum. O Could gerçekten sadece büyük bir kendine hizmet şaşırtmak olabilir? Bir işletme yöneticisinin ya programlarını, hedeflerine nasıl ulaştığını anlamak için yeterince öğrenmesi ya da sadece endişelenmediğine ve endişelenmemesi gerektiğine inanması gerektiğini düşünüyorum. Atriyal hücrelerde gecikmiş doğrultucu akımının başlangıcını etkileyen bir kimyasalın nasıl çalıştığını gerçekten anlayamayabilirim, ancak artık bir kalp aritmisine sahip olmanın ne kadar iyi olduğunu kesinlikle hissedebiliyorum.

Soyutlama sadece Bilgisayar Bilimi dışında önemlidir. İnsanlar farklı alanlarda uzmanlığa sahip olacaklar ve bu uzmanlığı başkalarıyla iletişim kurabilmek bir işletme için çok önemlidir. GWT, programcıların ve (program | proje) yöneticilerin iletişim kurmasını sağlayan bir soyutlamadır. İkincisi, bir programcı olarak programcıların bir işletme için çok az veya hiç değer üretme potansiyeline sahip olduğunu hayal etmek kolaydır. Son olarak, GWT'nin programcıların ve yöneticilerin iletişim kurmasının tek yolu olmadığını, bir işletmenin denemek isteyebileceği birçok araçtan biri olduğunu belirtmek gerekir.
Frank Bryce

Ayrıca, doktorumun kalp ritim bozukluğu düzeltme mekanizmamın neden koymadan önce neden çalıştığını anlamasını istiyorum . GWT testlerinin "neden" cevabına yardımcı olması beklenir. Programcı ve ürün yöneticisi arasındaki iletişime yardımcı olan GWT, kimyager ve doktor arasındaki iletişime benzer. Bir ürün yöneticisi, bir doktor hastalarına kalp aritmi düzeltmesi ile elde ettikleri değeri bildirirken hangi özellikleri elde ettiklerini bildirir.
Frank Bryce

4

Sanırım kullandığınız çerçeveye bağlı. Genel olarak, anlayışım kadarıyla, AAA NUnit çerçevesi tarafından desteklenir ve bu nedenle bu konuda doğal bir seçimdir. TDD ve BDD arasındaki teorik farklılıklara gelince, bunların hafif olduğu görülmektedir. Size bir açıklama yapmak için benden daha nitelikli biri olan bu bağlantıya bakın .


2

Hiç fark yok.
Üç test durumu:
Verilen = Yerleştir,
Ne zaman = Hareket,
Sonra = Assert.

Soruda sağladığınız farklılıklar GWT ve AAA değil TDD ve BDD arasındaki farklardır.

TDD'de bir test için üç farklı yönteminiz olabilir

public class TestsOfFormatMethod
{        
    public void Arrange() { // set dependencies }
    public string Act() { // return formattted result }
    public string AssertThatFormatIsEmpty()
    {
        Arrange();
        var actual = Act();
        Assert.IsEmpty(actual);
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.