문제

우리는 사용하고 있습니다 BDD- 행동 중심 개발 (Dan North의 관점에서) 사용자 수락 테스트를 기록하고 몇 가지 프로젝트에서 개발을 주도하는 메커니즘으로서, 적절한 성공을 거두었습니다. 지금까지 우리는 실제로 테스트 자체를 자동화하지 않았습니다.

나는 지금 테스트를 자동화하려고하지만 어떤 동작 프레임 워크가 확실하지 않습니다. 지금까지 Nbehave는 선구자 인 것 같습니다. 그러나 내가보고 있어야 할 다른 사람들이 있습니까? 현재 명확한 '승자'가 있습니까?

도움이 되었습니까?

해결책

빠른 답변

하나 매우 중요 가져올 지점은 거기에 있다는 것입니다 행동 중심의 두 가지 맛. 두 맛이 있습니다 Xbehave 그리고 XSPEC.

Xbehave BDD : Specflow

Specflow (매우 유사합니다 오이 Ruby Stack에서)는 Xbehave BDD 테스트를 수락 기준으로 촉진하는 데 탁월합니다. 그러나 단위 수준에서 행동 테스트를 작성하는 좋은 방법을 제공하지는 않습니다. 몇 가지 다른 Xbehave 테스트 프레임 워크가 있지만 Specflow는 많은 견인력을 얻었습니다.

XSPEC BDD : MSPEC

객관적으로 말하면. 컨텍스트 사양 프레임 워크를 고려할 때 MSPEC는 가장 길었으며 .NET 커뮤니티에서 가장 널리 사용되는 컨텍스트/사양 프레임 워크입니다.

다른 XSPEC BDD 프레임 워크 : NSPEC

나는 개인적으로 추천 할 것입니다 NSPEC (직접 영감을 얻었습니다 RSPEC 루비의 경우). 전체 공개, 저는 NSPEC의 저자 중 하나입니다. 단순히 Nunit 또는 Mstest를 사용하여 BDD를 달성 할 수 있습니다. MSPEC 또한 옵션이며 .NET의 가장 성숙한 컨텍스트/사양 프레임 워크입니다. 하지만, NSPEC에는 더 간단한 것들이 있습니다.

긴 대답

BDD의 두 가지 맛은 주로 그들이 제공하는 직교 이점으로 인해 존재합니다.

Xbehave의 장단점 (GWT 구문)

프로

  • (예 : 주어진 ...., 주어진 ...., 언제 ......, 언제 ......, ...., .... 그리고)
  • 그런 다음 공통 방언은 실행 가능한 코드에 매핑 될 수 있으며, 이는 실제로 당신이 실제로 당신이 끝내겠다고 말한 것을 완료했음을 입증합니다.
  • 방언이 수축되므로 사업은 요구 사항을 명확하게하고 문장에 맞게 만들어야합니다.

단점

  • Xbehave 접근법은 높은 수준의 승인 기준을 구동하는 데 적합하지만 속성을 통해 영어를 실행 가능한 코드에 매핑하는 데 필요한주기는 단위 레벨에서 도메인을 구동하는 데 어려움을 겪을 수 없습니다.
  • 일반적인 방언을 테스트에 매핑하는 것은 고통 스럽습니다 (Regex에서 증가). 비즈니스가 생성하는 각 문장은 속성을 통해 실행 방법에 매핑되어야합니다.
  • 공통 방언은 매핑을 관리하는 것이 손에 닿지 않도록 엄격하게 제어해야합니다. 문장을 변경할 때마다 해당 문장과 직접 관련된 방법을 찾아서 Regex 매칭을 수정해야합니다.

XSPEC의 장단점 (컨텍스트/사양)

프로

  • 개발자가 컨텍스트를 점차적으로 구축 할 수 있습니다. 테스트를 위해 컨텍스트를 설정할 수 있으며 해당 컨텍스트에 대해 일부 주장을 수행 할 수 있습니다. 그런 다음 더 많은 컨텍스트를 지정할 수 있습니다 (이미 존재하는 컨텍스트를 구축). 그런 다음 더 많은 테스트를 지정할 수 있습니다.
  • 수축 언어가 없습니다. 개발자는 시스템의 특정 부분이 어떻게 행동하는지에 대해 더 표현할 수 있습니다.
  • 영어와 공통 방언 사이에 매핑이 필요하지 않습니다 (없기 때문에).

단점

  • 사업에 접근 할 수 없습니다. 사업은 그들이 원하는 것을 명확하게하는 것을 좋아하지 않습니다. 우리가 그들에게 BDD에 대한 맥락 기반 접근법을 주었다면, 문장은 단지 "그냥 작동하게"읽을 것입니다.
  • 모든 것이 코드에 있습니다. 컨텍스트 문서는 코드 내에 얽혀 있습니다 (따라서 코드에 영어를 매핑하는 것에 대해 걱정할 필요가 없습니다)
  • 덜 제한적인 언어가 주어지면 읽을 수 없습니다.

샘플

그만큼 볼링 카타 꽤 좋은 예입니다.

사양 샘플

SpecFlow에서 사양이 어떻게 보이는지는 다음과 같습니다 (다시 말하면 비즈니스와 직접 통신하기 때문에 수락 테스트로는 다음과 같습니다).

기능 파일

기능 파일은 테스트의 공통 방언입니다.

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
단계 정의 파일

단계 정의 파일은 테스트의 실제 실행입니다.이 파일에는 Specflow 용 매핑이 포함됩니다.


[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 샘플, XSPEC, 컨텍스트/사양


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 샘플, XSPEC, 컨텍스트/사양

여기에 있습니다 NSPEC 동일한 볼링 카타의 예 :


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

점점 더 많은 BDD를 수행 할 때 BDD의 XBehave 및 XSPEC 풍미가 모두 필요하다는 것을 알 수 있습니다. Xbehave는 승인 테스트에 더 적합하며 XSPEC는 단위 테스트 및 도메인 구동 설계에 더 적합합니다.

MSPEC 대 NSPEC

나이와 안정성과 같은 객관적인 지표는 요인이어야하며, 모든 사람들이 그것을 고려하도록 권장합니다. 하지만 제발 새로운 프레임 워크가 더 간결한 API, 언어 구성을 더 잘 사용하고 과거 프레임 워크에 대해 배운 교훈을 구축 할 수 있음을 고려하십시오.. MSPEC는 주어진 구성을 제공하지만, IT 및 청소는 비용이 많이 듭니다. 그러나 모든 회원의 정적 초기화, 클래스 폭발 및 대의원의 고유 한 사용으로 인해 구문 적으로 강력합니다. NSPEC에서 가장 간단한 MSPEC 테스트가 더 간단하다는 것을 알 수 있습니다. 다음은 MSPEC와 NSPEC에 쓰여진보다 복잡한 테스트 스위트입니다.

Xunit, MSPEC 및 NSPEC의 비교 : https://gist.github.com/amirrajan/6701522

관련 링크

RSPEC 대 오이 (RSPEC 스토리)

오이와 RSPEC를 사용한 BDD-이 중복은 언제입니까?

다른 팁

체크 아웃 사양.

오늘날 .NET 프로젝트를위한 수락 테스트 중심의 개발 및 행동 중심 개발에 실용적이고 마찰이없는 접근 방식을 제공하는 것을 목표로하는 오이에서 영감을 얻은 도구입니다.

VisualStudio 통합은 특히 유망한 것 같습니다.

스토리 Q 유창한 인터페이스를 사용하여 nbehave에 대한 좋은 대안처럼 보입니다. 나는 확실히 그것을 확인할 것이다.

나는 실제로 '승자'가 있다고 생각하지 않습니다. 다른 프레임 워크에는 포함됩니다 specunit.net 프로젝트 및 MSPEC 또한 a의 시작과 함께 약속을 보여주고 있습니다 갈리오 어댑터. 기술적으로 Ironruby가 수평선에 있기 때문에 RSPEC 5월 피가 나갈 준비가되어있는 사람들에게 옵션이 되십시오. Nbehave + NSPEC는 최고의 자동화가있는 가장 나이 많은 프레임 워크 일 수 있지만 지나치게 장황한 구문과 싸우는 것을 발견했습니다.

나는 그것들을 모두 확인하고 프로젝트 스타일에 가장 적합한 프레임 워크를 선택합니다. 그들은 모두 OSS이므로 잃기 어렵고 진정한 이점은 단순히 BDD로 이동하는 것입니다.

나는 개인적으로 추천 할 것입니다 BDDfy 내 의견으로는 어느 것이 좋습니다! 오픈 소스, 컨벤션 및 유창한 기반 시나리오 설명을 지원하며 수락 및 단위 테스트를 모두 다룹니다. 당신은 그것을 찾을 수 있습니다 github.

로봇 프레임 워크 함께 사용할 수 있습니다 Ironpython .NET에서 ATDD 또는 BDD를 수행합니다. 로봇 프레임 워크의 표현 기능이 예를 들어보다 낫다고 생각합니다. 사양S 또는 NSPEC'에스. 특정 구문을 사용하도록 강요하지 않고 키워드 중심 접근 방식을 사용합니다. 웹 응용 프로그램을 테스트하는 경우 셀레늄 2Library 셀레늄 웹 드라이버에 바인딩을 제공합니다.

또한 있습니다 유령, Boo의 DSL을 정의하여 더 자연스럽게 만듭니다.

나는 일반적으로 mbunit 및 필요한 Di/Mocking 프레임 워크와 결합 된 Nbehave에 찬성합니다. Jim Burger의 Nbehave가 매우 장점이라는 것은 공정한 의견이며, 때때로 Cut-and-Paste를 사용하고 있습니다. 그래도 잘 작동합니다. Gallio의 Resharper 플러그인을 사용하고 있으므로 추가 창이 표시됩니다. 그래도 CCNET에서는 아직 시도하지 않았습니다.

이 블로그 게시물과 영감을주는 아이디어에 대한 의견을 확인하십시오. http://haacked.com/archive/2008/08/23/introducing-subspec.aspx/

concordion.net BDD뿐만 아니라 ATDD도 지원합니다. http://assertselenium.com/2012/11/05/difference-between-tdd-bdd-atdd/ 사양은 일반 영어로 작성됩니다 HTML 사용. IMHO 이것은 concordion.net의 이점 중 하나입니다. HTML 문서는 항해 가능한 구조로 구성하여 구축 할 수 있습니다. 살아있는 문서 시스템. 그리고 테스트는 시스템에 대해 실행되므로 문서가 항상 최신 상태라고 확신 할 수 있습니다.

나는 팀과의 작은 응용 프로그램으로 BDD에서 첫 번째 외출을 시작했습니다. 우리가 일을하기로 선택한 도구는 다음과 같습니다. 셀레늄 웹 드라이버 Xbehave 스토리와 mspec의 경우 machine.fakes.moq XSPEC 단위 테스트 용 오토킹 컨테이너 용. Specflow 및 MSPEC가 지원하는 통합으로 인해 스토리 러너 및 사양 러너가되게되면 Resharper가 있습니다. R#을 사용하여 Visual Studio에 기본 통합을하는 것이 우리에게 핵심 기능입니다.

우리의 디자인은 모두 MVC3이므로 우리는 또한 MVC 컨트롤러에 대한 오케스트레이터 분리 패턴. 이를 통해 오케스트레이터에 대해 직접 사양을 쓸 수 있습니다. 그런 다음 응용 프로그램 사용에 대해 직접 스토리를 작성할 수 있습니다.

안전 치명적인 응용 프로그램을위한 시스템 테스트를 위해 BDD를 다루고 있기 때문에 "코드"대신 "자연어로 작성된 테스트"의 힘을 과소 평가해서는 안된 경험 만 공유 할 수 있습니다.

우리는 항상 기능 언어를 제공하는 데 중점을 두었습니다. 누구나 프로그래밍에 대한 기술적 배경이나 경험없이 이해할 수있는 사람이라면 (위의 사양 예제 참조) 그렇게 잘했습니다. 내가 누구에게 구문을 설명하지 않았다는 사실 외에도, 모두는 즉시 시험, 개발자, 관리자 및 테스터의 의미를 즉시 이해했습니다.

위의 MSPEC 예제와 같은 프로그래밍 언어로 작성된 테스트를 피할 수 있습니다. 내가 관리자의 사무실에서 이와 같은 테스트에 나타나면 그는 나를 쫓아 낼 것입니다. 그러나 그는 Gherkin-Syntax 기반 테스트를 읽는 데 관심이 있습니다. 더 많은 사람들이 시험을 읽고 수정할수록 더 좋습니다.

마지막으로 이러한 테스트는 다른 프로그래밍 언어, 다른 plattform, 변경없이 다른 테스트 자동화 도구에 휴대 할 수 있습니다.

다시, 대답은 한 번 더 있습니다.

도구와 기능 자체에 신경 쓰지 말고 정보를 잃지 않고 언제든지 다른 도구로 쉽게 전환 할 수있는 도구를 선택하십시오. 도구가오고 이동하면 테스트가 더 오래 지속되어야합니다. :-)

Specflow를 사용하는 것이 좋습니다. 완전한 .NET 라이브러리 및 모든 기능에 대한 전체 액세스 권한이 있으며 테스트는 휴대용 상태를 유지합니다. 이를 통해 휴대 성을 신경 쓰지 않으면 로봇 프레임 워크와 같은 완전히 휴대용 솔루션보다 유리할 수 있습니다. 그러나 개발 및 테스트를 위해 다양한 도구를 사용하여 시스템의 안정성과 휴대 성을 항상 향상시킬 수 있습니다. 따라서 파이썬 기반 BDD 접근 방식으로 .NET 소프트웨어를 테스트하는 것은 경우에 따라 좋은 아이디어 일 수 있습니다.

그러나 Specflow는 중간 규모의 프로젝트에서 야간 빌드 테스트 등을 포함하여 매일 테스트에서 안정적이고 방탄이 나타났습니다. 또한 Microsoft 장치 테스트 환경에 잘 통합됩니다.

또한 UAT에 특정한 Ubaddas를 확인하십시오.

https://github.com/kernowcode/ubaddas

여기에 설명과 함께

http://kernowcode.wordpress.com/ (2014 년 6 월)

이와 같은 테스트를 쓸 수 있습니다

[Test]
public void IWantToRegisterANewUser()
{
  var user = new User();
  ICustomer customer = new Customer();

  SoThat(MyBusinessValue.IncreaseCustomerBase)
    .As(user)
    .Given(customer.Register)
    .When(customer.Confirm_Registration)
    .Then(customer.Login);
}

이것을 생성합니다

I want to register a new user
  so that Increase customer base
       as user
    given Register customer
     when Confirm customer registration
     then Login customer
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top