2014-11-04 2 views
4

우리는 각 단계마다 스크린 샷을 찍으려고합니다.Specflow에서 현재 실행 단계 정보를 얻는 방법

모두 정상적으로 작동합니다. 그러나 스크린 샷을 생성 한 단계에 스크린 샷을 연결할 수는 없습니다.

우리가 원하는 것은 FeatureContext.FeatureInfoScenarioContext.ScenarioInfo입니다. 그러나 개별 단계 수준. 그에 따라 스크린 샷에 태그를 지정할 수 있습니다.

답변

6

EDIT 노출이 추가되었습니다

클래스 : 당신이 원하는 무엇을 제공해야

ScenarioStepContext.StepInfo.Text

ScenarioStepContext.StepInfo.StepDefinitionType.

원래 대답 난 그냥 (어제)이 있지만이 현재 가능하지 않다가이 기능을 추가하는 pull request를 제출했다. specflow를 직접 작성하면 my fork of the specflow repo을 복제하고 ScenarioStepContext 브랜치로 전환 한 다음 TechTalk.Specflow_VS2013.sln을 열고 직접 프로젝트를 빌드하십시오.

먼저 specflow에 nuget 패키지의 새 버전 번호를 제공해야합니다. SpecFlow.nuspec 파일을 열고 버전을 내가 현재 버전 (1.9.3.4를 사용)보다 높은 버전으로 편집 한 다음 솔루션을 빌드하십시오 (VS2013 SDK를 설치해야하며 해당 버전을 빌드하려면 다른 VS SDK를 설치해야합니다). 솔루션이 구축되면

, 당신은

\SpecFlow\IdeIntegration\Vs2013Integration\bin\Debug\TechTalk.SpecFlow.Vs2013Integration.vsix

에서 VSIX를 설치 한 다음

\SpecFlow\Installer\NuGetPackages\bin\SpecFlow.1.9.3.4.nupkg에서 nuget 패키지를 추가해야합니다.

이 작업을 완료하면 ScenarioStepContext.StepInfo.TextScenarioStepContext.StepInfo.StepDefinitionType에 액세스하여 원하는 요소에 현재 단계 세부 정보를 태그 할 수 있습니다.

우리는 현재 이것을 사용하고 있지만, 주요 Specflow github 페이지에서 PR에 관한 문제를 제기하십시오. 가능한 경우 문제를 해결해 드리겠습니다. 이는 일을 데

<specFlow> 
    <trace listener="MyNameSpace.LogTraceListener, MyAssemblyName" /> 
    <unitTestProvider name="NUnit" /> 
</specFlow> 

:

public class LogTraceListener : ITraceListener 
{ 
    static public string LastGherkinMessage; 

    public void WriteTestOutput(string message) 
    { 
     LastGherkinMessage = message; 

     Console.WriteLine(message); 
    } 

    public void WriteToolOutput(string message) 
    { 
     Console.WriteLine(message); 
    } 
} 

이의 app.config에 SpecFlow 섹션에 등록해야합니다 : 자신의 LogTraceListener 구현

+0

이것은 정말 도움이되었습니다. 또한 테이블 값을 쉽게 노출하는 방법을 보여주었습니다. – Festivejelly

3

현재 단계 정의를 얻을 수 있습니다 LastGherkinMessage 속성에는 방금 입력 한 단계 정의의 텍스트가 포함됩니다. 단계 정의 내에서 또는 다른 곳에서 액세스 할 수 있습니다.

0

나는 파티에 조금 늦었어요,하지만이 방법은 현재 실행중인 단계의 텍스트가 포함 된 문자열을 반환합니다 게시물 가스파르 나기에서 촬영

private static string GetCurrentPositionText() 
    { 
     int currentPositionText = 0; 
     try 
     { 
      var frames = new StackTrace(true).GetFrames(); 
      if (frames != null) 
      { 
       var featureFileFrame = frames.FirstOrDefault(f => 
                  f.GetFileName() != null && 
                  f.GetFileName().EndsWith(".feature")); 

       if (featureFileFrame != null) 
       { 
        var lines = File.ReadAllLines(featureFileFrame.GetFileName()); 
        const int frameSize = 20; 
        int currentLine = featureFileFrame.GetFileLineNumber() - 1; 
        int minLine = Math.Max(0, currentLine - frameSize); 
        int maxLine = Math.Min(lines.Length - 1, currentLine + frameSize); 

        for (int lineNo = currentLine - 1; lineNo >= minLine; lineNo--) 
        { 
         if (lines[lineNo].TrimStart().StartsWith("Scenario:")) 
         { 
          minLine = lineNo + 1; 
          break; 
         } 
        } 

        for (int lineNo = currentLine + 1; lineNo <= maxLine; lineNo++) 
        { 
         if (lines[lineNo].TrimStart().StartsWith("Scenario:")) 
         { 
          maxLine = lineNo - 1; 
          break; 
         } 
        } 

        for (int lineNo = minLine; lineNo <= maxLine; lineNo++) 
        { 
         if (lineNo == currentLine) 
         { 
          currentPositionText = lineNo - minLine; 
          return String.Format("->" + lines[lineNo]); 
         } 
        } 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      Debug.WriteLine(ex, "GetCurrentPositionText"); 
     } 

     return String.Format("(Unable to detect current step)"); 
    } 

때 비슷한 질문 몇 시간 전에 제작을 현재 단계의 문자열 만 반환하도록 약간 수정되었습니다.