Serenity 및 시나리오 모드를 사용한 자동 검수 테스트 작성

Serenity는 자동 사용자 승인 테스트를 작성하는 강력한 라이브러리입니다.그것은 테스트 결과를 사용하여 세계적인 테스트 보고서를 만들고 응용 프로그램의 기능과 작업 방식을 기록하고 설명한다.

Serenity BDD 구축


Serenity를 보다 잘 이해하기 위해 RUBICON 홈 페이지에 대한 샘플 테스트를 작성합니다.
이 자습서에서는 JUnit을 사용합니다.Serenity는 Jbehave 또는 Cucumber 등 BDD 도구와 함께 사용할 수도 있습니다.이 강좌의 전체 소스 코드를 찾을 수 있고, Serenity jUnit startup 프로젝트를 다운로드할 수 있습니다.
이 자습서에서는 브라우저 Firefox를 사용합니다.먼저 프로젝트를 IntelliJ로 가져옵니다.
다음 단계를 따르겠습니다.
  • IntelliJ에서 Import Project를 선택하고 다운로드한 항목을 찾아 생성된 폴더를 포함합니다.그래디언트 파일을 클릭한 다음 열기를 클릭합니다.
  • 외부 모델에서 항목 가져오기를 선택한 다음 그래디언트를 선택하고 다음을 클릭합니다.
  • 다음 창에서 [기본 그라데이션 패키지만 사용]을 선택하고 [완료]를 클릭합니다.
  • Gradle은 현재 프로젝트의 완성을 기다려야 합니다.모든 것이 정상인지 확인하기 위해서TestStory 파일을 찾아서TestExample 테스트를 실행할 수 있습니다.테스트는 구글의 홈페이지를 표시해야 한다.
    주: 시나리오 모드에서 테스트는 사용자의 각도에서 진행된다.웹 응용 프로그램과 상호작용하는 사용자를 참여자라고 부른다.모든 것이 작가 모드의 배우를 둘러싸고 전개된다.배우는 웹 페이지를 열 수 있는 특수한 능력을 가지고 있다.그들은 또한 임무를 수행하고 웹 응용 프로그램 상태에 대한 질문을 할 수 있다.
    이제 다음 단계로 넘어갑시다.
    우리가 써야 할 테스트 요강은 다음과 같다.
    Nermin을 감안하면 루비콘 홈페이지를 볼 수 있습니다.
    Nermin이 개발 링크를 열 때
    그러면 네임이 아마 개발 페이지를 보실 거예요.
    보시다시피, 우리는 작은 오이를 사용하여 테스트 용례를 설명합니다.테스트 장면에서 주어진 when-then 구조를 사용하는 것은 전제조건(주어진 것), 집행된 조작(언제)과 예상된 후조건(당시)을 명확하게 구분하기 때문에 도움이 된다.
    이제 패키지에서 Navigation이라는 새로운 테스트 클래스를 만들고 다음 코드를 추가합니다.
    포장 특징;
    import net.serenitybdd.junit.runners.SerenityRunner;
    import org.junit.runner.RunWith;
    
    @RunWith(SerenityRunner.class)
    public class Navigation {
    }
    

    웹 페이지 열기


    웹 페이지를 열려면 웹 브라우저를 사용해야 합니다.웹 브라우저라는 웹 드라이버 필드를 설명함으로써 이를 실현할 수 있습니다.@Managed 설명은 Serenity에서 웹 드라이버를 관리합니다.
    @Managed
    WebDriver webBrowser;
    
    우리가 어떤 일을 조용히 하기 전에, 우리는 배우가 필요하다.배우의 이름을 네임으로 지정하고 네임에게 웹 브라우저를 사용할 수 있는 능력을 부여할 것입니다.
    private Actor nermin;
    
    @Before
    public void userCanBrowseTheWeb() {
        this.nermin = Actor.named(“Nermin”);
        nermin.can(BrowseTheWeb.with(webBrowser));
    }
    
    JUnit에서는 @Before와 @After 주석을 사용하여 각각 setup 방법과 dream-down 방법으로 표시합니다.
    테스트를 작성하기 위해서 우리가 해야 할 첫 번째 일은 루비콘의 홈페이지를 여는 것이다.우리 배우 나민은 루비콘의 홈페이지를 열기 위해 임무를 수행해야만 할 것이다.
    주의: 시나리오 모드에서 작업은 사용자가 목표를 실현하기 위해 수행해야 하는 고급 절차를 대표합니다.
    OpenTheRubiconHomePage 작업을 작성하기 위해tasks라는 새 패키지를 만들 것입니다.tasks에서 OpenThe Rubicon HomePage라는 다른 파일을 만들 것입니다.자바.이 클래스를 Serenity 작업으로 만들기 위해서는 작업 인터페이스를 실현해야 합니다. 이 인터페이스에performas 방법이 있습니다.
    public class OpenTheRubiconHomePage implements Task {
        @Override
        @Step("{0} opens the rubicon home page")        
        public <T extends Actor> void performAs(T actor) {
            actor.attemptsTo(Open.url("https://www.rubicon-world.com"));
        }
    }
    
    웹 페이지를 열려면 Serenity에서 제공하는 오픈 액션 클래스를 사용합니다.
    참가자들이 Open 작업을 호출하기 위해서는attemptto 방법을 사용해야 합니다.
    @Step 메모의 문자열은 Serenity 보고서를 수정하는 데 사용됩니다.{0} 이 작업에 호출된 참여자의 이름을 바꿉니다.
    참고: 작업은 작업과 유사하지만 요소를 클릭하거나 마우스 커서를 이동하는 등 웹 페이지에서 낮은 수준의 상호 작용을 수행하는 동작과 다릅니다.

    이것이 Serenity 보고서의 작업입니다.
    참고: Serenity에서 생성한 보고서는 프로젝트 폴더의 target/site/Serenity 폴더에서 찾을 수 있습니다.
    이제 탐색 클래스에서 다음 행으로 선언합니다.
    @Steps
    OpenTheRubiconHomePage openTheRubiconHomePage;
    
    @Steps 주석을 추가하면 Serenity에서 OpenTheRubiconHomePage 작업을 초기화할 수 있습니다.이것은 파라미터가 없는 간단한 작업에만 적용된다.잠시 후 블로그에서 매개 변수를 받는 작업을 만드는 방법을 알아보겠습니다.
    현재 RUBICON 웹 페이지를 여는 작업이 있으므로 테스트에서 이를 호출합니다.
    @Test
    public void shouldBeAbleToOpenTheDevelopmentService() {
        givenThat(nermin).wasAbleTo(openTheRubiconHomePage);
    }
    
    실제로 Giventhe 메서드 없이 이 작업을 호출하는 것은 가능합니다.
    nermin.wasAbleTo(openTheRubiconHomePage);
    
    그러나 만약 우리가 이런 정적 방법을 사용한다면 코드의 가독성을 높일 수 있다.GivenWhenThen 클래스의 기타 몇 가지 방법은 다음과 같습니다.
    andThat()
    when()
    then()
    and()
    

    웹 페이지와 상호작용


    다음 작업은 '서비스' 하단 목록을 열고 '개발 서비스' 링크를 누르는 작업을 만드는 것입니다.
    이를 위해서는 서비스 메뉴와 링크의 웹 요소를 찾아야 합니다.
    이제 targets라는 새 패키지를 만들고 다음 코드를 추가할 수 있는 RubiconHomePage라는 새 클래스를 만들 수 있습니다.
    public class RubiconPage {
        public static Target SERVICES = Target.the("services dropdown")
            .locatedBy(".nav-services");
        public static Target SERVICE_ITEM = Target.the("service item")
            .locatedBy("//li[contains(@class,'dropdown-item')]//a[contains(text(),'{0}')]");
    }
    
    대상 클래스는 CSS 선택기와 XPath를 Serenity 보고서에 사용된 의미 있는 태그와 연결하는 데 사용됩니다.자신의 파일에서 웹 요소를 분리함으로써, 우리는 하드코딩 문자열 사용으로 인한 중복을 줄일 것입니다.
    개발 서비스를 열려면, 우선 서비스 밑에 있는 목록에 마우스를 걸고 개발 서비스를 눌러야 합니다.이 작업은 매개 변수로 전송된 서비스의 이름을 필요로 합니다.이 작업은 이름 지정 방법을 호출하여 생성됩니다.
    OpenServicePage의 전체 코드는 다음과 같습니다.
    public class OpenServicePage implements Task {
    
        private final String service;
    
        public OpenServicePage(String service) {
            this.service = service;
        }
    
        public static OpenServicePage named(String service) {
            return Instrumented.instanceOf(OpenServicePage.class).withProperties(service);
        }
    
        @Override
        @Step("{0} opens the service named #service") 
        public <T extends Actor> void performAs(T actor) {
            actor.attemptsTo(
                MoveMouse.to(SERVICES),
                Click.on(SERVICE_ITEM.of(service))
            );
        }
    }
    
    보시다시피 AttemptTo 방법에서 두 가지 동작을 호출했습니다. 이 동작들은 한 개 이상의 작업을 수행할 수 있습니다.첫 번째는 MoveMouse 작업입니다. 마우스 커서를 '서비스' 밑에 있는 목록으로 이동하고, 동작을 누르면 이름이 들어오는 서비스를 클릭합니다.서비스 항목에서 "of"방법을 사용하여 매개 변수 서비스를 대상에 전달합니다. 이 매개 변수는 XPath 문자열의 {0}로 대체됩니다.
    입력 필드에 값을 입력하려면 Enter action 클래스를 사용합니다.
    actor.attemptsTo(Enter.theValue("Hello World").into(TARGET));
    
    키를 하나만 입력하려면 Hit 클래스를 사용할 수 있습니다.
    actor.attemptsTo(Hit.the(Keys.ENTER).into(TARGET));
    
    표시된 텍스트, 색인 또는 드롭다운 목록에서 값을 선택하려면 SelectFromOptions 작업을 사용합니다.
    actor.attemptsTo(SelectFromOptions.byVisibleText("Hello World").from(DROPDOWN));
    
    이제 새로운 임무가 생겼습니다. 테스트에서 그것을 호출해야 합니다.
    @Test
    public void shouldBeAbleToOpenTheDevelopmentService() {
        givenThat(nermin).wasAbleTo(openTheRubiconHomePage);
    
    when(nermin).attemptsTo(OpenServicePage.named("Development"));
    }
    

    웹 페이지의 상태를 묻다


    본 테스트의 마지막 부분에 대해 우리는 테스트의 후 조건을 적을 것이다.
    시나리오 모드에서 배우는 웹 페이지 상태에 대해 물어볼 수 있다.이 질문들의 목적은 참여자의 관점에서 웹 응용 프로그램 상태에 대한 정확한 질문에 대답하는 것이다.
    우리가 정확한 웹 페이지에 있는지 확인하기 위해서, 우리는 현재 웹 페이지의 제목을 되돌려 주는 문제를 쓸 것이다.
    문제는 다음과 같습니다.
    public class CurrentPage implements Question<String> {
        public static Question<String> heading() {
            return new CurrentPage();
        }
    
        @Override
        public String answeredBy(Actor actor) {
            return Text.of(HEADING).viewedBy(actor).asString();
        }
    }
    
    문제는 문제의 인터페이스를 실현해야 하는데, 그 중에서 T는 문제의 반환 유형이다.이 인터페이스에는 answeredBy라는 방법이 필요합니다.
    HEADING은 RubiconHomePage 클래스에 추가된 새로운 목표일 뿐입니다.
    public static Target HEADING = Target.the("Heading").located(By.tagName("h1"));
    
    Text 클래스는 텍스트 값을 보다 원활하게 읽는 데 사용됩니다.또 다른 텍스트 읽기 방법은 웹 요소를 가져오기 위해 대상의 ResolveFor 방법을 호출하는 것입니다.이 유형은 getText () 라는 방법으로 텍스트를 되돌려줍니다.
    public String answeredBy(Actor actor) {
        return HEADING.resolveFor(actor).getText();
    }
    
    《평온》 극본의 단언은 다음과 같다.
    then(nermin).should(seeThat(CurrentPage.heading(), equalTo("Software engineering.")));
    
    우리는 actor의 should 방법을 호출해서 단언하기 시작할 수 있다.그리고 우리는 한 문제를 한클레스터 매칭기와 전달할 수 있다.
    이제 우리는 문제가 생겼다. 우리는 마침내 테스트를 완성할 수 있다.
    @Test
    public void shouldBeAbleToOpenTheDevelopmentService() {
        givenThat(nermin).wasAbleTo(openTheRubiconHomePage);
    
        when(nermin).attemptsTo(OpenServicePage.named("Development"));
    
        then(nermin).should(seeThat(CurrentPage.heading(), equalTo("Software engineering.")));
    }
    
    웹 페이지가 로드될 때까지 기다려야 하는 경우가 종종 있습니다. 이 경우 정적 방법을 사용하여 결론을 다시 시도할 수 있습니다.
    then(nermin).should(eventually(seeThat(CurrentPage.heading(), 
            equalTo("Software engineering."))));
    
    테스트를 실행하면 Serenity에서 다음과 같은 보고서를 생성합니다.

    마지막 말


    보시다시피 Serenity의 테스트는 사용자나 참여자의 관점에서 작성되었습니다.이런 방식으로 인코딩된 테스트는 더욱 읽을 수 있고 양호한 공정 원리, 예를 들어 단일 책임 원칙을 따른다.테스트를 임무, 문제, 능력과 조작으로 나누는 것을 통해 우리는 중복을 피하고 중용 가능한 부분을 만들어 테스트의 개발 과정을 가속화시켰다.
    그러나 다른 프레임워크에 비해 Serenity를 사용하는 것이 가장 큰 장점은 아니다.평온의 힘은 훌륭한 보도에 있다.Serenity는 테스트 보고서를 만드는 라이브러리가 아니라 제품의 실시간 문서를 만드는 것이 진정한 목표입니다.이것은 행위 구동 개발 분야에서 나온 개념이다.왜 활성 문서인지는 누구나 이해할 수 있는 방식으로 응용 프로그램의 작업 방식과 업무 규칙을 기록하기 때문이다. 활성 문서는 자동화 테스트 세트에서 만들어진 것이고 항상 최신이기 때문이다.여기까지 말하고 Serenity BDD를 시도해 보라고 격려합니다.
    Serenity에 대한 자세한 내용은 공식 홈페이지Serenity website를 참조하십시오.
    원시 블로그: Writing Automated Acceptance Tests Using Serenity and the Screenplay Pattern

    좋은 웹페이지 즐겨찾기