我们正在尝试为每个步骤截取屏幕截图。
一切正常。但我们无法将屏幕截图与创建它们的步骤相关联。
我们想要的是FeatureContext.FeatureInfo
和ScenarioContext.ScenarioInfo
。但是在个人的一级。这样我们就可以相应地标记屏幕截图。
答案 0 :(得分:7)
修改强>
添加了类,公开了:
ScenarioStepContext.StepInfo.Text
和ScenarioStepContext.StepInfo.StepDefinitionType
哪个可以给你你想要的东西。
原始回答
目前这是不可能的,虽然我刚刚(昨天)提交了pull request,它增加了这项功能。如果您对自己构建规范流程感到满意,那么您可以克隆my fork of the specflow repo并切换到ScenarioStepContext
分支,然后打开TechTalk.Specflow_VS2013.sln
并自行构建项目。
首先,您需要为specget包提供一个新的版本号。打开SpecFlow.nuspec
文件并将版本编辑为高于当前版本的版本(我使用1.9.3.4),然后构建解决方案(如果要构建,则需要安装VS2013 SDK和其他VS SDK那些版本)。
构建解决方案后,您需要从
安装vsix \SpecFlow\IdeIntegration\Vs2013Integration\bin\Debug\TechTalk.SpecFlow.Vs2013Integration.vsix
然后从
添加nuget包 \SpecFlow\Installer\NuGetPackages\bin\SpecFlow.1.9.3.4.nupkg
。
完成此操作后,您将能够访问ScenarioStepContext.StepInfo.Text
和ScenarioStepContext.StepInfo.StepDefinitionType
,以便能够使用当前步骤详细信息标记所需的元素。
我们目前正在使用此功能,但请在主要的Specflow github页面上提出有关PR的任何问题,如果可以,我会修复它们。
答案 1 :(得分:3)
实现自己的LogTraceListener可以获得当前的步骤定义:
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部分注册:
<specFlow>
<trace listener="MyNameSpace.LogTraceListener, MyAssemblyName" />
<unitTestProvider name="NUnit" />
</specFlow>
完成此操作后,LastGherkinMessage
属性将包含刚刚输入的步骤定义的文本。您可以从步骤定义中或从其他任何地方访问它。
答案 2 :(得分: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)");
}
取自Gaspar Nagy之前的一篇帖子,当时提出了类似的问题,并略微修改,只返回当前步骤的字符串。