specflow selenium webdriver end end example
Specflow 및 Selenium Webdriver 사용의 종단 간 예 :
이것에 무료 Specflow 교육 시리즈 , ~ Specflow에 대한 간략한 소개 이전 튜토리얼에서 제공되었습니다.
이 기사에서는 Specflow 기반 BDD 사양을 사용하는 엔드 투 엔드 예제를 살펴보고 테스트는 Selenium Webdriver를 통해 실행됩니다.
테스트는 애플리케이션의 로그인 기능을 테스트하는 것처럼 간단 할 수 있습니다. 단지 Specflow를 사용하여 이러한 테스트를 설명하고 Step 구현은 Selenium 드라이버와 명령, NUnit을 어설 션 프레임 워크로 사용합니다.
우리는 또한 NUnit 기반 Specflow 러너를 사용할 것입니다 (오픈 소스가 아니고 무료 버전에서 무작위 지연을 도입하는 Specrun과 반대).
학습 내용 :
비디오 자습서 : Specflow 및 Selenium
Specflow 및 Selenium에 대한 비디오 튜토리얼보기 :
웹 애플리케이션 침투 테스트 인터뷰 질문
시작하자.
시작하려면 Visual Studio에서 단위 테스트 프로젝트를 만들고 다음 필수 구성 요소를 설치하겠습니다.
# 1) 단위 테스트 프로젝트 만들기
Nunit 및 Specflow 용 Nuget 패키지를 설치합니다.
Install-Package Specflow.NUnit
# 2) 크롬 브라우저 용 Selenium의 Webdriver를 설치합니다.
아래 명령을 통해서도 Nuget Package Manager 콘솔을 통해 설치할 수 있습니다.
Install-Package Selenium.WebDriver.ChromeDriver
# 3) ExpectedCondition 대기를 추가하기 위해 Selenium Webdriver 라이브러리 및 Selenium 대기 도우미를 설치합니다.
Install-Package Selenium.WebDriver Install-Package DotNetSeleniumExtras.WaitHelpers
# 4) 이제 자동 생성 된 프로젝트에서 test.cs 파일을 제거합니다.
Specflow에 기능 파일과 단계 정의 파일을 사용할 것이므로 혼동을 피하기 위해이 단계를 수행하고 있습니다.
# 5) 기능 및 단계 정의 구현 파일을 저장할 기능 및 단계 정의에 대한 폴더를 만듭니다.
이는 필수 단계는 아니지만 별도의 폴더에 기능 및 단계 구현을 구성하는 데 유용합니다.
# 6) 위의 단계가 끝나면 솔루션 구조와 packages.config가 아래와 같이 보일 것입니다.
기능 및 단계 구현
이제 기능 파일과 실제 단계 구현을 시작하겠습니다.
기능 정보 – 샘플 기능은 Youtube 웹 사이트의 검색 기능을 테스트 / 검증하는 것입니다. 키워드를 검색하고 사용자가 검색 결과 페이지로 리디렉션되었음을 확인합니다.
새 기능 파일을 추가하고 이름을 YoutubeSearchFeature.feature
아래와 같이 검색 기능 시나리오 및 기능 설명을 추가합니다.
Feature: YoutubeSearchFeature In order to test search functionality on youtube As a developer I want to ensure functionality is working end to end @mytag Scenario: Youtube should search for the given keyword and should navigate to search results page Given I have navigated to youtube website And I have entered India as search keyword When I press the search button Then I should be navigate to search results page
위의 시나리오에서는 테스트가 다음을 수행 할 것으로 예상합니다.
- Youtube 웹 사이트로 이동 : 이를 위해서는 웹 드라이버를 사용하여 브라우저에서 웹 페이지로 이동하는 Selenium과 같은 웹 자동화 프레임 워크가 필요합니다.
- 키워드 검색 : 이 단계는 각각 키워드를 입력하고 검색을 실행하기 위해 적절한 입력 요소와 버튼을 찾는 것을 포함합니다.
- 검색 결과가 표시되고 사용자가 결과 페이지에 있는지 확인합니다. 이 단계에는 사용자가 올바른 페이지를 방문했는지 확인하는 것과 관련된 주장이 포함됩니다.
이제 각 단계의 단계 구현을 살펴 보겠습니다.
그 전에 기존 Specflow 정의에 Selenium 로직 / 코드를 통합하는 방법을 이해하겠습니다.
셀렌 또는 다른 도구 (또는 단위 테스트 스텁 / 모의 / 드라이버 등)는 기본적으로 단계 실행의 중간 부분이지만 이해해야 할 핵심은 두 프레임 워크를 통합하는 방법입니다.
Specflow를 사용하면 사용자가 테스트 사양을 작성할 수 있습니다. 사용해야하는 도구를 지정하지는 않습니다. 따라서 테스트 개발자는 해결중인 사용 사례에 따라 원하는만큼 테스트 도구를 자유롭게 선택할 수 있습니다.
이 시나리오에서 Selenium을 사용하려면 다음이 필요합니다.
- WebDriver의 인스턴스 (단순함을 위해 ChromeDriver를 사용함)는 사용자가 드라이버 구현에 따라 브라우저를 사용하여 실제로 웹 페이지로 이동할 수 있도록합니다.
- 사용자와 상호 작용하고 입력을 전달하고 작업을 수행하는 데 필요한 WebElement 선언이 거의 없습니다 (단계 구현의 일부로 만 수행 될 수 있음).
- 드라이버 인스턴스에서 실행할 수있는 창 제목, URL 등에 대한 몇 가지 주장.
Step Implementations 파일에 ChromeWebdriver 인스턴스를 생성합니다.
따라서 단계 정의 파일을 만들어 보겠습니다. 지난 기사에서 보았 듯이 Specflow는 단계 정의를 자동 생성하는 메커니즘을 제공합니다 (나중에 필요에 따라 사용자 정의 / 수정할 수 있음).
- 기능 파일로 이동하여 마우스 오른쪽 단추를 클릭하고 '단계 정의 생성'을 선택하십시오.
- 이전에 만든 것처럼 StepDefinitions 폴더에 새 파일을 만들고 파일 이름을 YoutubeSearchFeatureSteps.cs로 지정합니다.
- 시나리오의 모든 단계가 단계 정의에 적절하게 바인드되었는지 확인하십시오.
정보 – 자동 생성 된 단계 정의 수정 :
이제 신중하게 살펴보면 검색 키워드 단계에 대해 생성 된 단계 정의 즉, 자동 생성 된 코드 인 '검색 키워드로 인도를 입력했습니다.'는 검색 키워드를 식별 / 분리하지 않으므로 매개 변수화하지 않습니다.
(Given(@&'I have entered India as search keyword')) public void GivenIHaveEnteredIndiaAsSearchKeyword() { ScenarioContext.Current.Pending(); }
그러나 이것은 우리가 원하는 것이 아닙니다. 검색 키워드를 매개 변수화해야합니다. 그렇지 않으면 모든 키워드 검색에 대해 사용자 정의 단계 정의를 만들어야합니다.
이제이 단계 정의를보다 일반적인 것으로 수정하여 검색 키워드를 매개 변수화하는 방법을 살펴 보겠습니다. 이것은 간단한 정규식 매처를 통해 수행 할 수 있습니다.
아래 코드 샘플을 참조하십시오. 정규식 매처를 통해 검색 키워드를 교체했습니다. (. *) ”이렇게하면 시나리오에서 전달할 키워드 값을 대체하고 아래 코드 샘플에서 'searchString'이라는 입력 매개 변수에 검색 키워드 값을 설정합니다.
(Given(@'I have entered (.*) as search keyword')) public void GivenIHaveEnteredIndiaAsSearchKeyword(String searchString) { ScenarioContext.Current.Pending() }
이러한 방식으로 코드를 모듈화하고 각 단계 구현에 대해 반복되는 상용구 코드를 방지합니다.
셀레늄 통합 및 단계 정의 로직
이제 Selenium과 Specflow의 실제 통합을 살펴 보겠습니다. 단계 정의가 생성되면 실제 테스트 시나리오를 실행하기 위해 여기에 코드를 추가합니다.
시나리오 실행 전체에서 사용할 수 있도록 Selenium 웹 드라이버 인스턴스를 배치하고 초기화 할 수있는 위치를 살펴 보겠습니다. 생성 된 Binding 클래스의 private 필드로 Driver를 배치 할 것입니다. 드라이버는 생성자 클래스의 일부로 초기화됩니다.
이러한 방식으로 모든 단계에 대해 하나의 Binding 파일 만 있고 테스트 실행이 시작되기 전에 초기화되므로 드라이버는 테스트 기간 동안 전체 과정 동안 초기화 된 상태로 유지됩니다.
또한 우리는 IDisposable 더 이상 필요하지 않은 드라이버 인스턴스를 폐기합니다. Dispose () 메서드에 배치하면 클래스의 Object가 삭제되면 드라이버 인스턴스도 삭제 될 수 있습니다.
WebDriver 인스턴스의 선언 및 초기화 코드는 다음과 같습니다.
(Binding) public class YoutubeSearchFeatureSteps : IDisposable { private String searchKeyword; private ChromeDriver chromeDriver; public YoutubeSearchFeatureSteps() => chromeDriver = new ChromeDriver(); //... other Step defintion implementations public void Dispose() { if(chromeDriver != null) { chromeDriver.Dispose(); chromeDriver = null; } } }
위와 같이 드라이버 인스턴스는 시나리오 실행의 일부인 모든 단계 구현의 일부로 사용할 수 있습니다.
이제 각 개별 시나리오의 단계 구현을 살펴 보겠습니다.
# 1) 단계 정렬 :
Given I have navigated to youtube website And I have entered India as search keyword
이 두 단계 모두 드라이버 인스턴스와의 상호 작용을 포함합니다. 첫 번째 단계는 브라우저 창이 열리고 YouTube 웹 사이트로 이동합니다.
두 번째 단계에서는 검색 입력 버튼을 찾고 검색 키워드로 'India'를 입력합니다.
다음은이 두 단계에 대한 구현입니다.
((Given(@'I have navigated to youtube website')) public void GivenIHaveNavigatedToYoutubeWebsite() { chromeDriver.Navigate().GoToUrl('https://www.youtube.com'); Assert.IsTrue(chromeDriver.Title.ToLower().Contains('youtube')); } 7. (Given(@'I have entered (.*) as search keyword')) public void GivenIHaveEnteredIndiaAsSearchKeyword(String searchString) { this.searchKeyword = searchString.ToLower(); var searchInputBox = chromeDriver.FindElementById('search'); var wait = new WebDriverWait(chromeDriver, TimeSpan.FromSeconds(2)); wait.Until(ExpectedConditions.ElementIsVisible(By.Id('search'))); searchInputBox.SendKeys(searchKeyword); }
첫 번째 단계에서는 창 제목을 확인하여 YouTube 탐색이 성공했는지 확인하는 Assertion을 확인합니다.
노트 : 다양한 웹 요소 또는 드라이버 속성에 Assertion을 배치하는 다양한 방법이있을 수 있지만이 자습서의 최종 목표는 가장 단순한 방법으로 설명하는 것입니다.
두 번째 단계에서는 다음을 사용하여 동적 대기를 추가했습니다. 예상 조건 그러면 코드가 검색 키워드를 입력하기 전에 검색 상자가 표시됩니다.
또한 searchString을 비공개 필드 searchKeyword. 이것은 searchKeyword가 다른 단계 구현에서도 사용될 수 있도록 수행됩니다.
팁 – 단계를 통해 데이터 전달
이 접근 방식 (즉, 클래스 변수를 통해)에 의한 데이터 전달 / 저장은 단계 바인딩에서 데이터를 공유 할 수있는 수단 중 하나입니다.
Specflow 자체가 ScenarioContext라는 동적 사전 객체를 제공하는 것과 마찬가지로이를 수행하는 다른 방법이 있습니다. 이에 대한 자세한 내용은 다음 기사에서 확인할 수 있습니다.
# 2) 행동 단계
When I press the search button
이제 검색 버튼을 클릭하는 실제 동작을 살펴 보겠습니다. 단계 구현 파일은 시나리오 단계를 실행하기 위해 검색 버튼을 검색하고 클릭합니다.
이 단계의 코드는 다음과 같습니다.
(When(@'I press the search button')) public void WhenIPressTheSearchButton() { var searchButton = chromeDriver.FindElementByCssSelector('button#search-icon-legacy'); searchButton.Click(); }
# 3) 마지막으로 Assert 단계 :
Then I should navigate to search results page
이 단계에서는 URL과 페이지 제목에 검색 키워드가 포함되어 있는지 여부를 드라이버 속성에서 확인합니다.
이 단계의 코드는 다음과 같습니다.
(Then(@'I should be navigate to search results page')) public void ThenIShouldBeNavigateToSearchResultsPage() { // After search is complete the keyword should be present in url as well as page title` Assert.IsTrue(chromeDriver.Url.ToLower().Contains(searchKeyword)); Assert.IsTrue(chromeDriver.Title.ToLower().Contains(searchKeyword)); }
실행
이제 시나리오를 실행하고 결과를 확인하겠습니다. 시나리오가 실행되면 모든 시나리오 단계가 순차적으로 실행됩니다. 테스트는 브라우저를 열고 웹 사이트로 이동 한 다음 몇 가지 작업을 수행합니다.
테스트 결과는 각 개별 단계의 성공 / 실패를 보여주는 테스트 요약에서 '출력'버튼을 클릭하여 볼 수 있습니다.
팁
중간 실패 단계
중간 단계가 실패한 시나리오의 경우 해당 시나리오에서 Specflow는 해당 시나리오의 나머지 단계를 실행하지 않고 테스트 결과를 실패로 표시합니다.
C ++ 인터뷰 질문 및 답변
NUnit 어댑터로 테스트 실행
이 예제에서는 Nuget Package Manager를 통해 설치 한 Specflow.NUnit 테스트 실행기를 사용하여 테스트를 실행했습니다.
이것은 이전 기사에서 사용한 Specrun 러너와 아래에 표시된 몇 가지면에서 다릅니다.
- Specflow.NUnit 러너는 오픈 소스입니다.
- 테스트를 실행하는 동안 지연이 발생하지 않습니다.
결론
이 기사에서는 Youtube 애플리케이션에서 비디오 검색의 간단한 테스트 시나리오를 통해 Selenium을 Specflow 프레임 워크와 통합하는 종단 간 예제를 보았습니다.
Selenium을 통합하는 동안 개인 클래스 필드를 통해 서로 다른 바인딩에서 데이터를 공유하는 방법도 살펴 보았습니다. 또한 NUnit 러너와 Specrun 러너에서 테스트를 실행하고 자세히 비교했습니다.
코드 파일
YoutubeSearchFeature.feature
Feature: YoutubeSearchFeature In order to test search functionality on youtube As a developer I want to ensure functionality is working end to end @mytag Scenario: Youtube should search for the given keyword and should navigate to search results page Given I have navigated to youtube website And I have entered India as search keyword When I press the search button Then I should be navigate to search results page
YoutubeSearchFeatureSteps.cs
using NUnit.Framework; using OpenQA.Selenium; using OpenQA.Selenium.Chrome; using OpenQA.Selenium.Support.UI; using SeleniumExtras.WaitHelpers; using System; using System.Collections.Generic; using System.Linq; using TechTalk.SpecFlow; namespace SepcflowSelenium.StepDefinitions { (Binding) public class YoutubeSearchFeatureSteps : IDisposable { private String searchKeyword; private ChromeDriver chromeDriver; public YoutubeSearchFeatureSteps() => chromeDriver = new ChromeDriver(); (Given(@'I have navigated to youtube website')) public void GivenIHaveNavigatedToYoutubeWebsite() { chromeDriver.Navigate().GoToUrl('https://www.youtube.com'); Assert.IsTrue(chromeDriver.Title.ToLower().Contains('youtube')); } (Given(@'I have entered (.*) as search keyword')) public void GivenIHaveEnteredIndiaAsSearchKeyword(String searchString) { this.searchKeyword = searchString.ToLower(); var searchInputBox = chromeDriver.FindElementById('search'); var wait = new WebDriverWait(chromeDriver, TimeSpan.FromSeconds(2)); wait.Until(ExpectedConditions.ElementIsVisible(By.Id('search'))); searchInputBox.SendKeys(searchKeyword); } (When(@'I press the search button')) public void WhenIPressTheSearchButton() { var searchButton = chromeDriver.FindElementByCssSelector('button#search-icon-legacy'); searchButton.Click(); } (Then(@'I should be navigate to search results page')) public void ThenIShouldBeNavigateToSearchResultsPage() { System.Threading.Thread.Sleep(2000); // After search is complete the keyword should be present in url as well as page title` Assert.IsTrue(chromeDriver.Url.ToLower().Contains(searchKeyword)); Assert.IsTrue(chromeDriver.Title.ToLower().Contains(searchKeyword)); } public void Dispose() { if(chromeDriver != null) { chromeDriver.Dispose(); chromeDriver = null; } } } }
Specflow의 공유 및 범위 바인딩, 후크 및 단계 재사용에 대해 자세히 알아 보려면 다가오는 자습서를 시청하십시오!
이전 튜토리얼 | NEXT 튜토리얼
추천 도서
- Cucumber Selenium 튜토리얼 : Cucumber Java Selenium WebDriver 통합
- Selenium WebDriver 소개 – Selenium Tutorial # 8
- Jenkins와 Selenium WebDriver의 통합 : 단계별 자습서
- 첫 번째 WebDriver 스크립트 구현 – Selenium WebDriver Tutorial # 10
- Selenium WebDriver에서 경고 / 팝업을 처리하는 방법-Selenium Tutorial # 16
- Eclipse로 WebDriver 전체 설정 및 설치 – Selenium Tutorial # 9
- 다양한 유형의 WebDriver 명령을 사용하여 웹 요소의 가시성 확인 – Selenium Tutorial # 14
- GeckoDriver Selenium 튜토리얼 : Selenium 프로젝트에서 GeckoDriver를 사용하는 방법