Ne en olgun BDD Çerçeve için .NET? | Netgez.com
SORU
21 Kasım 2008, Cuma


Ne en olgun BDD Çerçeve için .NET?

Kayıt kullanıcı kabul testleri için bir mekanizma olarak BDD - Behaviour Driven Development (Dan Kuzey perspektifinden) kullanıyoruz ve iyi bir başarı ile bir kaç projeyi, gelişim sürücü. Aslında otomatik olmasına rağmen bugüne kadar kendilerini test eder.

Şimdi testlerini otomatikleştirme için arıyorum, ama geri emin değilim. Şimdiye kadar NBehave görünüyor habercisi olarak - ama bakmam gereken başka birileri var mı? Orada açık bir 'kazanan' şu anda?

CEVAP
7 NİSAN 2011, PERŞEMBE


Hızlı Cevap

Birçok önemligetirmek için bir nokta vardırDavranış Tahrik Geliştirme iki çeşit.İki çeşidi vardırxBehavevexSpec.

xBehave BDD: SpecFlow

SpecFlow (çok benzer cucumber Ruby yığından için) Kabul Kriterleri olarak xBehave BDD testleri kolaylaştırmada mükemmel. Ancak iyi bir şekilde birim düzeyinde davranış testleri yazmak için sağlamaz. Birkaç diğer xBehave test çerçeveler vardır, ama SpecFlow çekiş gücü çok arttı.

xSpec BDD: MSpec

Objektif olarak bakarsak. İçerik özellikleri çerçeveler mevcut verilen, MSpec uzun civarında olmuştur ve en yaygın olarak kullanılan içerik/özellikleri çerçeve .Net topluluk.

Diğer xSpec BDD çerçeve: NSpec

Ben şahsen NSpec (doğrudan Ruby için RSpec esinlenerek) tavsiye ederim. Tam açıklama, NSpec yazarlarından biriyim. Sadece NUnit veya MSTest kullanarak BDD yapabilirsiniz. ama kısa (çok zor bağlamlarda kademeli kurmak için) güz ediyorlar. MSpec da bir seçenektir ve çerçeve için en olgun bağlam/şartname .Net.Amasadece NSpec daha basit olan bazı şeyler vardır.

Uzun Cevap

BDD iki tatlar öncelikle sağladıkları dik avantajları nedeniyle var.

Artılarını ve Eksilerini xBehave (GWT Sözdizimi)

Artıları

  • ortak bir Lehçe ile iÅŸ görüşmeleri kolaylaÅŸtırmak yardımcı olur (örn. ....Verilen, Ve Verilen ...., ......Zaman, Ve Ne Zaman ..... O zaman ...., Ve Sonra)
  • ortak lehçesi sonra bitireceÄŸini söylemiÅŸtin aslında bitmiÅŸ bu iÅŸ için kanıtlıyor çalıştırılabilir kod eÅŸlenebilir
  • lehçesi iÅŸ gereksinimleri belirsizliÄŸi ve cümleler içine sığacak kadar da sıkıcı.

İnş

  • XBehave yaklaşım yüksek düzeyde Kabul Kriterleri sürüş için iyi ise, devir İngilizce nitelikleri ile çalıştırılabilir kod olarak harita için gerekli birim düzeyinde bir etki alanı sürüş için olanaksız kılar.
  • Testler için yaygın lehçesi eÅŸleme ACI (düzenli ifade üzerine rampa). İş oluÅŸturur her cümlenin nitelikleri ile çalıştırılabilir bir yöntem eÅŸlenmesi gerekir.
  • Ortak lehçesi eÅŸleme yönetme elden gitmemesi için çok sıkı bir ÅŸekilde kontrol edilmelidir. Bir cümle deÄŸiÅŸtirmek istediÄŸiniz zaman, doÄŸrudan bu cümle ile ilgilidir ve bu nedenle normal ifade eÅŸleme düzeltme yöntemi bulmak zorunda.

XSpec artılarını ve Eksilerini (İçerik/Özellikleri)

Artıları

  • SaÄŸlar geliÅŸtirici kapsamında kademeli olarak kurmak için. İçerik testi için ayarlanmış olabilir ve bazı iddialar bu baÄŸlamda karşı yapılabilir. O zaman daha fazla içerik (zaten var olan baÄŸlam üzerine inÅŸa) belirtin ve daha fazla test belirtin.
  • Hayır daraltıcı dil. GeliÅŸtiriciler bir sistem belli bir bölümü nasıl davranacağını hakkında daha fazla etkileyici olabilir.
  • Hiçbir eÅŸleme İngilizce ve ortak bir lehçesi arasında bir tane bile yok çünkü) gerekli.

İnş

  • Gibi cana yakın iÅŸletme tarafından. Haydi, iÅŸ ne istediklerini belirsizliÄŸi ortadan kaldırmak için sevmiyorum yüz. EÄŸer onları baÄŸlam merkezli bir yaklaşım BDD verdik eÄŸer cümle sadece okur "yeter ki yapın".
  • Her ÅŸey kod. BaÄŸlam belgeleri kodu (İngilizce kod eÅŸleme hakkında endiÅŸelenmenize gerek yok bu yüzden) içinde iç içedir
  • Olarak kaydedebilirsiniz daha az kısıtlayıcı bir laf kalabalığı verildi.

Örnekleri

Bowling Kata oldukça iyi bir örnektir.

SpecFlow Örnek

Belirtimi SpecFlow (yine, bu doğrudan iş ile iletişim kurar çünkü bir kabul testi olarak harika): gibi görünür

Özelliği Dosya

Özelliği dosya test için ortak lehçesidir.

Feature: Score Calculation 
  In order to know my performance
  As a player
  I want the system to calculate my total score

Scenario: Gutter game
  Given a new bowling game
  When all of my balls are landing in the gutter
  Then my total score should be 0

Scenario: Single Pin
  Given a new bowling game
  When I've hit exactly 1 pin
  Then my total score should be 1
Adım Tanım Dosyası

Adım tanım dosyası bu dosya SpecFlow için eşlemeleri içerir testi gerçek yürütme


[Binding]
public class BowlingSteps
{
    private Game _game;

    [Given(@"a new bowling game")]
    public void GivenANewBowlingGame()
    {
        _game = new Game();
    }

    [When(@"all of my balls are landing in the gutter")]
    public void WhenAllOfMyBallsAreLandingInTheGutter()
    {
        _game.Frames = "00000000000000000000";
    }

    [When(@"I've hit exactly 1 pin")]
    public void When1PinIsHit()
    {
        _game.Frames = "10000000000000000000";
    }

    [Then(@"my total score should be (\d )")]
    public void ThenMyTotalScoreShouldBe(int score)
    {
        Assert.AreEqual(score, _game.Score);
    }
}

MSpec Örnek, xSpec, İçerik/Özellikleri


public class describe_BowlingKata
{
    public static Game game;

    public class when_all_balls_land_in_the_gutter : describe_BowlingKata
    {
        Establish ctx = () => game = new Game();

        Because of = () => game.Frames = "00000000000000000000";

        It should_have_a_score_of_0 = () => game.Score.ShouldBe(0);
    }

    public class when_a_single_pin_is_hit : describe_BowlingKata
    {
        Establish ctx = () => game = new Game();

        Because of = () => game.Frames = "10000000000000000000";

        It should_have_a_score_of_1 = () => game.Score.ShouldBe(1);
    }
}

NSpec Örnek, xSpec, İçerik/Özellikleri

Burada, aynı bowling kata NSpec bir örnek:


class describe_BowlingGame : nspec
{
    Game game;

    void before_each()
    {
        game = new Game();
    }

    void when_all_my_balls_land_in_the_gutter()
    {
        before = () => game.Frames = "00000000000000000000";

        it["should have a score of 0"] = () => game.Score.should_be(0);
    }

    void when_a_single_pin_is_it()
    { 
        before = () => game.Frames = "10000000000000000000";

        it["should have a score of 1"] = () => game.Score.should_be(1);
    }
}

Daha BDD gibi, BDD de xBehave ve xSpec tatlar gerekli olduğunu göreceksiniz. xBehave Kabul Testleri için daha uygundur, xSpec daha fazla birim testleri ve etki alanı odaklı tasarım için uygundur.

Vs NSpec MSpec

Yaş ve kararlılık gibi objektif Ölçümler bir faktör olması, ve herkesin bunu dikkate almasını tavsiye ederim. Ama lütfen deyeni çerçeveler daha kısa ve öz bir apı sağlamak, dil yapıları daha iyi kullanımı ve dersleri geçmiş çerçeveleri için öğrendiklerini üzerine inşa olabileceği de dikkate al. MSpec sağlar yapıları Verilen, Çünkü, ve Temizleme..ama gel de maliyet: statik başlatma için tüm üyeleri, sınıf patlama ve sözdizimsel sert çünkü onun eşsiz kullanım delegeler. En basit MSpec testleri NSpec daha basit olduğunu göreceksiniz. Burada daha karmaşık bir test paketi MSpec ve NSpec hem de yazılı.

XUnit, MSpec ve NSpec bir Karşılaştırma: https://gist.github.com/amirrajan/6701522

İlgili Bağlantılar

rspec vs cucumber (rspec stories)

BDD with Cucumber and rspec - when is this redundant?

Bunu PaylaÅŸ:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Electro Posé

    Electro PosÃ

    21 ÅžUBAT 2013
  • gamingbits

    gamingbits

    2 Mayıs 2006
  • sknbp

    sknbp

    16 Kasım 2006