step argument transformations specflow tables
단계 인수 변환 및 Specflow 테이블 자습서 :
이전 Specflow 튜토리얼은 공유 및 범위 바인딩, 후크 및 단계 재사용 상세히. 이 자습서에서는 Specflow의 단계 인수 변환에 대해 자세히 알아 봅니다.
우리를 통해 읽으십시오 초보자를위한 완벽한 Specflow 교육 가이드 개념에 대한 명확한 이해를 위해 Specflow의 단계 인수 변환 기능을 사용하면 사용자가 단계에 제공된 매개 변수에 대한 사용자 정의 변환을 제공 할 수 있습니다.
사용자 정의 로직을 추가하여 입력 매개 변수를 특정 매개 변수로 변환 할 수 있습니다. 예를 들어, 매개 변수에서 직접 클래스 객체를 생성하고 변형 함수에서 생성 된 객체를 반환 할 수 있습니다.
우리가 살펴볼 Specflow의 또 다른 기능은 Specflow Tables로, 입력 데이터를 단일 단계로 테이블 형식으로 전달할 수 있으며 테이블 도우미는 원하는대로 Object 인스턴스에 직접 매핑 할 수 있습니다.
비디오보기 :
다음은 단계 인수 변환 및 Specflow 테이블에 대한 비디오 자습서입니다.
학습 내용 :
단계 인수 변환
더 나은 방법으로 인수 변환을 이해하기 위해 먼저 Specflow가 매개 변수와 정확히 일치하는 방식을 파악해 보겠습니다. 이전 기사에서 살펴본 것처럼 YouTube 검색 예에서는 시나리오를 실행할 매개 변수로 검색어를 전달했습니다.
매개 변수 일치는 일반적으로 정규식을 통해 발생하며 일치하는 정규식은 메소드 매개 변수를 단계에서 제공된 검색어로 설정합니다.
먼저 Specflow에서 기본적으로 지원되는 변환이 무엇이며 언제 인수 변환이 도움이 될 수 있는지 이해해 보겠습니다.
지원되는 변환
Specflow는 정규식 일치 후 데이터 유형 자체를 살펴봄으로써 즉시 많은 변환을 지원합니다. 문자열, 정수, GUID, 열거 형 등과 같은 변환을 자동으로 처리 할 수 있습니다.
다음 중 일부에 대한 예를 살펴 보겠습니다.
Scenario: Get Transactions in my account Given I have entered customer name as Test Customer And I have entered customer account id as 0f8fad5b-d9cb-469f-a165-70867728950e And I select sorting order as DESCENDING And I select number of transactions to be displayed as 25 Then I should see my account transactions
위의 코드 샘플에서는 단계에서 전달하는 여러 입력 유형을 강조 표시했으며 단계 구현에서는 이러한 입력 유형이 각각의 데이터 유형으로 변환됩니다.
아래에서 이들에 대한 단계 구현을 살펴 보겠습니다 (단순화를 위해 제공된 인수가 자동으로 예상 유형으로 변환됨을 설명하기 위해 각 단계에 대한 콘솔을 수행했습니다).
(Given(@'I have entered customer name as (.*)')) public void GivenIHaveEnteredCustomerNameAsTestCustomer(String customerName) { Console.Out.WriteLine(customerName); } (Given(@'I have entered customer account id as (.*)')) public void GivenIHaveEnteredCustomerAccountIdAs(Guid accountId) { Console.Out.WriteLine(accountId.ToString()); } (Given(@'I select sorting order as (.*)')) public void GivenISelectSortingOrderAsAscending(SortOrder sortOrder) { Console.Out.WriteLine(sortOrder.ToString()); } (Then(@'I should see my account transactions')) public void ThenIShouldSeeMyAccountTransactions() { Console.Out.WriteLine('success!'); } (Given(@'I select number of transactions to be displayed as (.*)')) public void GivenISelectNumberOfTransactionsToBeDisplayedAs(int p0) { Console.Out.WriteLine(p0.ToString());
위의 시나리오를 실행할 때 출력은 인수를 예상 데이터 유형으로 자동 변환했음을 표시하여 모든 값을 성공적으로 인쇄합니다.
출력은 다음과 같습니다.
Given I have entered customer name as Test Customer Test Customer -> done: SupportedSpecflowConversions.GivenIHaveEnteredCustomerNameAsTestCustomer('Test Customer') (0.0s) And I have entered customer account id as 0f8fad5b-d9cb-469f-a165-70867728950e 0f8fad5b-d9cb-469f-a165-70867728950e -> done: SupportedSpecflowConversions.GivenIHaveEnteredCustomerAccountIdAs(0f8fad5b-d9cb-469...) (0.0s) And I select sorting order as DESCENDING DESCENDING -> done: SupportedSpecflowConversions.GivenISelectSortingOrderAsAscending(DESCENDING) (0.0s) And I select number of transactions to be displayed as 25 25 -> done: SupportedSpecflowConversions.GivenISelectNumberOfTransactionsToBeDisplayedAs(25) (0.0s) Then I should see my account transactions success! -> done: SupportedSpecflowConversions.ThenIShouldSeeMyAccountTransactions() (0.0s)
인수 변환
이를 이해하기 위해 실제 사례를 살펴 보겠습니다. 지원, 주어진 시간을 변환하여 분으로 변환하는 응용 프로그램이 있습니다. 예: 사용자 입력이 1 일인 경우 출력은-1440이고 사용자 입력이 1 일 2 시간 2 분이면 출력은 1562 여야합니다.
이제 다른 유형의 입력을 지원하려면 입력 유형에 따라 다른 바인딩 구현을 작성해야한다는 것을 알 수 있습니다. 예를 들면 : 일 부분 만있는 입력의 경우 별도의 단계 구현이 있고, 일, 월 부분이있는 입력의 경우 별도의 단계 구현 등이 있습니다.
단계 인수 변환을 통해 단일 단계 구현을 통해 이것이 어떻게 구현 될 수 있는지 살펴 보겠습니다. 제공된 입력이 단순히 타임 스탬프 객체로 변환되고 단계 변환이라는 원래 단계로 반환됩니다.
부분적으로 변환 된 값을 호출 단계로 반환하는 입력에 대한 첫 번째 수준의 정규식 스캔으로 생각하십시오.
완전한 timespan 객체로 변환하고 다시 돌아 오는 단일 변환으로 3 개의 서로 다른 입력 변형이있는 기능 파일을 확인합니다.
Scenario: Convert timestamp to minutes - variant 1 Given I have entered 50 days into the timestamp to minute converter When I press calculate Then the result should be 72000.00 on the screen Scenario: Convert timestamp to minutes - variant 2 Given I have entered 1 day, 2 hours, 3 minutes into the timestamp to minute converter When I press calculate Then the result should be 1563.00 on the screen Scenario: Convert timestamp to minutes - variant 3 Given I have entered 1 day, 1 hour, 1 minute, 30 seconds into the timestamp to minute converter When I press calculate Then the result should be 1501.50 on the screen
위의 코드 예제에서 강조 표시된 값을보십시오. 이들 모두는 정확히 동일한 변환을 처리하고 최종 결과는 호출 Specflow 단계로 다시 전송되는 변환 된 TimeSpan 입력 값이됩니다.
아래에서 Transformation의 구현을 살펴 보겠습니다.
(StepArgumentTransformation(@'(?:(d*) day(?:s)?(?:, )?)?(?:(d*) hour(?:s)?(?:, )?)?(?:(d*) minute(?:s)?(?:, )?)?(?:(d*) second(?:s)?(?:, )?)?')) public TimeSpan convertToTimeSpan(String days, String hours, String minutes, String seconds) { int daysValue; int hoursValue; int minutesValue; int secondsValue; int.TryParse(days, out daysValue); int.TryParse(hours, out hoursValue); int.TryParse(minutes, out minutesValue); int.TryParse(seconds, out secondsValue); return new TimeSpan(daysValue, hoursValue, minutesValue, secondsValue); }
프레임 워크가 이것이 변환 바인딩임을 알기 위해서는 StepArgumentTransformation Attribute를 Argument 변환을 구현하는 메소드에 추가해야합니다.
인수 변환과 관련하여 주목해야 할 다른 중요한 사항은 다음과 같습니다.
#1) 단계 인수 변환은 각 일치하는 단계에 대해 실행됩니다. 즉, 단계의 유형에 관계없이 즉 주어진, 언제 또는 그런 다음 각 일치하는 정규식에 대해 변환이 발생합니다.
#두) 변환 된 출력의 반환 유형에 따라 실제 호출 단계에 입력 매개 변수에 대해 일치하는 반환 유형이 없으면 변환이 수행되지 않습니다.
이것이 의미하는 바는 호출 단계에 변환 된 입력이 필요하지만 변환 된 메서드의 반환 유형과 일치하지 않는 것으로 언급 된 입력 타임 스탬프가 있다고 가정하면 정규식 일치가 재정의되고 변환이 발생하지 않습니다.
'Given'단계를 호출하는 구현을 살펴 보겠습니다.
private TimeSpan ts; (Given(@'I have entered (.*) into the timestamp to minute converter')) public void GivenIHaveEnteredDaysIntoTheTimestampToMinuteConverter(TimeSpan tsTransformed) { ts = tsTransformed; }
여기에서 입력 매개 변수의 유형, 즉 다른 유형으로 변경된 경우 변환 단계에서 반환 된 유형과 일치하는 TimeSpan을 확인합니다. 예를 들어 String의 경우 인수 변환이 발생하지 않으며 정규식 일치는 원래 Step 구현에 의해 재정의됩니다.
프로 팁 : 여기서 주목해야 할 중요한 점은 변환해야하는 전체 텍스트가 단계 인수 변환을 통해 공급 / 일치되어야한다는 것입니다. 따라서 주어진 단계는 이제 가능한 모든 입력 형식을 단일 문자열로 래핑하고 변환 정규식은이를 TimeSpan 개체로 변환하고 다시 반환합니다.Specflow 테이블
Specflow 테이블은 값 목록을 단계 구현 기능에 전달하는 방법입니다. 이전 기사에서는 시나리오 개요 및 예제를 사용하여 데이터 기반 테스트를 구현하는 방법을 살펴 보았습니다. 그러나 그것은 주로 다른 입력으로 시나리오를 실행하는 것이 었습니다.
여기에서 테이블에서는 모든 데이터를 테이블 형식으로 데이터를 제공하는 단계 구현에 한 번에 전달하는 것입니다.
예를 들어, 학생 관리 시스템을 테스트하고 새 학생 개체를 생성하기 위해 이름, 성, 나이, 생년월일 등과 같은 많은 세부 정보를 입력해야하는 경우를 생각해보십시오.
한 가지 방법은 기본적으로 많은 상용구 코드가 될 별도의 단계로이 정보를 각각 전달하는 것입니다. 각 단계에서 테스트해야하는 동일한 개체를 업데이트하게됩니다. 또 다른 방법은 복잡한 정규식을 빌드하고 동일한 단계에서 모든 데이터를 전달하려고 시도하는 것입니다.하지만 오류가 발생하기 쉽고 불안정합니다.
테이블이 여기에서 우리를 구출합니다. 모든 학생 관련 입력 데이터는 specflow의 테이블 기능을 통해 멋진 표 형식으로 동일한 단계 구현으로 보낼 수 있습니다.
기능 및 단계 구현에 대한 아래 코드 샘플을 보겠습니다.
Scenario: Pass data through Specflow tables for StudentInfo object Given I have entered following info for Student | FirstName | LastName | Age | YearOfBirth | | test | student | 20 | 1995 | When I press add Then i student should get added to database and entered info should be displayed on the screen
테이블 데이터는 위의 시나리오 단계에서 강조 표시됩니다.
아이폰 5를위한 최고의 스파이 소프트웨어
Specflow는 많은 TableHelper를 제공하므로 각 필드를 직접 구문 분석하는 대신 사용자가 제공 한 입력 데이터에서 개체 인스턴스를 만드는 것과 같은 유용한 기능을 직접 사용할 수 있습니다.
아래에서 단계 구현을 살펴 보겠습니다.
private StudentInfo studInfo; (Given(@'I have entered following info for Student')) public void GivenIHaveEnteredFollowingInfoForStudent(Table table) { // converting supplied input data directly to instance of StudentInfo object studInfo = table.CreateInstance(); }
위의 강조 표시된 부분을보십시오. 다음은 코드 한 줄, 전체 StudentInfo 개체 (학생 데이터 필드 (예 : 이름, 성, 나이, 생년월일 등)를 포함하는 POCO)입니다.
Specflow 테이블과 관련된 기타 기능 / 개념은 다음과 같습니다.
#1) 테이블은 수평 또는 수직 일 수 있습니다. 수직 테이블은 키-값 쌍과 더 비슷하고 위의 시나리오에서는 이름-값 매핑과 더 비슷하지만 수평 테이블은 단일 행에있는 개체의 모든 데이터를 포함합니다 (이 예에서 본 것처럼).
#두) 세로 테이블은 단일 .NET 개체에만 매핑 할 수있는 반면 가로 테이블은 개체 집합 또는 컬렉션에 매핑 할 수도 있습니다.
#삼) 테이블의 각 필드 값은 구문 분석 된 개체의 단일 해당 필드에 매핑되므로 원자 적이어야합니다.
여기서 주목해야 할 중요한 점은 자동 생성 테이블 형식 데이터와 단계 바인딩을 수행하면 Specflow 바인딩 생성기가 자동으로 이러한 입력 유형을 설명하고 유효한 테이블 형식 데이터로 인식합니다.
결론
이 기사에서는 Specflow의 중요하고 편리한 2 가지 개념을 설명하려고했습니다.
첫 번째 단계는 단계 인수 변환 Specflow 인수에 대한 사용자 정의 유형 변환을 허용하여 상용구 코드를 방지하고 테스트 스크립트가 더 모듈화되고 논리적으로 보이도록합니다. 두 번째 기능은 다음과 같습니다. Specflow 테이블 사용자 친화적 인 표 형식으로 한 번에 많은 필드 / 데이터를 전달해야 할 때 유용합니다.
다가오는 자습서에서는 프로젝트의 모든 이해 관계자가 쉽게 참조 할 수있는 Pickles와 같은 오픈 소스 도구를 사용하여 Specflow를 사용하여 다양한 형식으로 아름다운 문서를 자동 생성하는 방법에 대해 자세히 알아볼 것입니다.
이전 튜토리얼 | NEXT 튜토리얼
추천 도서
- MongoDB의 배포 : 단계별 자습서
- Appium Studio의 단계별 설치 및 설정
- Specflow 및 Selenium Webdriver 종단 간 예제
- QTP를 ALM / QC와 통합하기위한 단계별 가이드
- 인기있는 Specflow 인터뷰 질문 15 가지
- 고급 Specflow 공유 및 범위 바인딩, 후크 및 단계 재사용
- Windows에 MongoDB 설치 : 단계별 가이드
- JIRA를 qTest와 통합하는 방법 : 단계별 가이드