Perbedaan antara Given When Then (GWT) dan Arrange Act Assert (AAA)?

13

Di TDD ada sintaks 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);
}

Dalam tes menulis BDD menggunakan struktur yang sama tetapi dengan sintaks Given When Then (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 */   }

Meskipun mereka sering dianggap sama ada perbedaan. Beberapa yang penting adalah:

  1. GWT dapat dipetakan langsung ke spesifikasi file fitur dalam kerangka BDD

  2. GWT lebih mudah dipahami oleh non-pengembang dengan mendorong penggunaan bahasa Inggris yang sederhana, dan memiliki deskripsi singkat tentang apa yang dilakukan setiap bagian

  3. Diberi Kapan dan Lalu adalah kata kunci dalam berbagai kerangka kerja BDD seperti SpecFlow, dan Mentimun

Pertanyaan saya, adakah perbedaan lain (selain nama) antara AAA dan GWT? Dan adakah alasan selain yang ditentukan di atas bahwa yang satu lebih disukai daripada yang lain?

Cognitive_chaos
sumber
3
Saya tidak melihat perbedaan kecuali untuk 'membaca lebih seperti bahasa alami'. Diberikan pengaturan, ketika suatu tindakan terjadi, maka nyatakan hal-hal tentang negara baru. '
Sjoerd Job Postmus
Saya pikir Anda telah menemukan beberapa poin yang relevan, dan tidak akan menerima jawaban dengan perbedaan tambahan. Untuk apa nilainya, saya secara eksklusif menggunakan AAA untuk unit test karena formatnya sepenuhnya independen terhadap metodologi tetapi mendorong kecil, tes independen.
Amon

Jawaban:

9

Saya pikir Anda mencantumkan perbedaan dengan sangat baik dalam pertanyaan Anda, namun saya akan menambahkan beberapa pendapat saya tentang bagaimana saya melihat kedua pendekatan tersebut.

AAA sangat berguna bagi saya ketika saya menguji kode saya sendiri. Jika saya mengerjakan proyek atau perpustakaan untuk diri saya sendiri, AAA adalah cara saya melakukannya. Ini memungkinkan saya mengatur apa pun yang saya butuhkan untuk menjalankan tes saya dan kemudian hanya mengujinya . Ini cepat untuk setup, dan cepat untuk memverifikasi bahwa kode saya berfungsi seperti yang saya harapkan.

GWT berguna dalam lingkungan bisnis, di mana pekerjaan yang dilakukan oleh pemrogram perlu dipetakan ke nilai bisnis. Nilai bisnis dipetakan oleh fitur, dan semoga fitur yang tidak memperkenalkan bug. Ada banyak strategi untuk memetakan fitur untuk tugas pemrograman, tetapi salah satunya adalah melalui persyaratan. Dalam pengalaman saya, persyaratan berkisar dari persyaratan tingkat pengguna sampai ke tugas-tugas kecil untuk dieksekusi pengguna. Ini berguna karena mudah bagi para manajer untuk memahami bagaimana pekerjaan yang dilakukan oleh programmer mempengaruhi pelanggan / pengguna mereka, dan oleh karena itu mengapa programmer menambahkan nilai pada bisnis mereka.

  • Persyaratan Tingkat Pengguna: Mengingat gudang memiliki setidaknya N item dalam inventaris, ketika pengguna membeli N item, maka gudang mengirimkan N item ke pengguna
  • Persyaratan Tingkat Sistem 1: Mengingat sistem persediaan memiliki N item dalam persediaan, ketika permintaan untuk N item dimasukkan ke dalam sistem persediaan maka sistem persediaan mengurangi jumlah persediaan untuk jenis barang tersebut.
  • Persyaratan Tingkat Sistem 2: Mengingat sistem pembayaran memiliki item N dalam persediaan, ketika permintaan untuk item N dimasukkan ke dalam sistem pembayaran maka sistem pembayaran membebankan pengguna untuk item N
  • ...
  • Persyaratan Tingkat Programmer 1: Diberikan 5 sweater dalam persediaan, ketika 3 sweater dihilangkan dari inventaris, maka 2 kursi tersisa di inventaris
  • ...

Struktur persyaratan semacam ini memungkinkan desain seperti pohon tempat semua Persyaratan Tingkat Programmer memetakan pohon ke Persyaratan Tingkat Pengguna. Dengan cara ini, ketika Persyaratan Tingkat Programmer gagal maka Anda tahu Persyaratan Tingkat Pengguna mana yang terpengaruh.

Sebaliknya, tes AAA mungkin terlihat seperti ini. Bagi saya ini sangat menghadap programmer dan tidak berguna untuk bisnis. Itu tidak berarti struktur pohon persyaratan yang serupa tidak dapat dibuat dari strategi pengujian AAA, tetapi tidak ada dalam bahasa AAA yang membuatnya lebih mudah untuk melakukannya.

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
}
Frank Bryce
sumber
Saya selalu merasa menarik ketika orang mempertanyakan apakah komputer (dan karenanya programmer) menambah nilai bagi bisnis mereka. Mungkinkah itu benar - benar hanya perkasa besar yang mementingkan diri sendiri? Saya pikir seorang manajer bisnis harus cukup belajar tentang pemrograman untuk memahami bagaimana mencapai tujuan mereka, atau hanya percaya bahwa itu tidak dan tidak perlu khawatir. Saya mungkin tidak benar-benar mengerti bagaimana bahan kimia yang mempengaruhi timbulnya arus rectifier tertunda dalam sel atrium bekerja, tetapi saya pasti bisa merasakan betapa baiknya tidak memiliki aritmia jantung lagi.
Abstraksi penting di luar hanya Ilmu Komputer. Orang akan memiliki keahlian di bidang yang berbeda, dan dapat berkomunikasi bahwa keahlian dengan orang lain sangat penting untuk bisnis. GWT adalah abstraksi yang berguna untuk membuat programmer dan (program | proyek) manajer untuk berkomunikasi. Kedua, sebagai seorang programmer mudah membayangkan bahwa para programmer memiliki potensi untuk menghasilkan sedikit atau tidak ada nilai untuk bisnis. Terakhir, perlu dicatat bahwa GWT bukan satu-satunya cara untuk membuat programmer dan manajer berkomunikasi, tetapi salah satu dari banyak alat yang mungkin ingin dicoba bisnis.
Frank Bryce
Juga, saya ingin dokter saya mengerti mengapa mekanisme koreksi aritmia jantung saya bekerja sebelum mereka memasukkannya, bukan hanya itu. Tes GWT seharusnya membantu menjawab "mengapa". GWT membantu komunikasi antara programmer dan manajer produk mirip dengan komunikasi antara ahli kimia dan dokter. Seorang manajer produk berkomunikasi dengan pengguna fitur apa yang mereka dapatkan ketika seorang dokter berkomunikasi dengan pasien mereka berapa nilai yang mereka dapatkan dengan koreksi aritmia jantung.
Frank Bryce
4

Saya kira itu tergantung pada kerangka yang Anda gunakan. Secara umum, sejauh pemahaman saya, AAA didukung oleh kerangka kerja NUnit, dan dengan demikian adalah pilihan alami dalam hal itu. Adapun perbedaan teoritis antara TDD dan BDD, mereka tampaknya sedikit. Lihat tautan ini , seseorang yang lebih berkualifikasi dari saya untuk memberi Anda penjelasan.

George Grainger
sumber
2

Tidak ada perbedaan sama sekali.
Tiga kondisi pengujian:
Diberikan = Atur,
Kapan = Bertindak,
Kemudian = Tegas.

Perbedaan yang Anda berikan dalam pertanyaan adalah perbedaan antara TDD dan BDD dan bukan GWT dan AAA.

Dalam TDD Anda dapat memiliki tiga metode berbeda untuk satu tes

public class TestsOfFormatMethod
{        
    public void Arrange() { // set dependencies }
    public string Act() { // return formattted result }
    public string AssertThatFormatIsEmpty()
    {
        Arrange();
        var actual = Act();
        Assert.IsEmpty(actual);
    }
}
Fabio
sumber