Имеется такой тест, который запускают через NUnit GUI:
Те же самые логи будет выводить и NUnit console
Как видим, спекфлоу пушит логи в NUnit, который выводит логи в консоль.
Вопрос. Как можно выдернуть эти логи спекфлоу?
Имеется такой тест, который запускают через NUnit GUI:
Как видим, спекфлоу пушит логи в NUnit, который выводит логи в консоль.
Вопрос. Как можно выдернуть эти логи спекфлоу?
Что значит выдернуть?
это значит завернуть в какойнить обьект, напрмиер стринг
Так Вы же сами пишете сообщения в лог. Что-то я не могу конечную задачу понять.
пишу не я, а спекфлоу
Давайте лучше конечную цель скажите, пока я не понимаю, что Вам надо.
конечная цель - эти логи должны быть в тестрейле, а не в вижуал студии. обертка для пуша результатов в тестрейл уже есть.
не думаю что поможет. т.к. мне нужно разделять результаты тестов. а если зааписываьт логи в файл - то выдернуть с него лог соответствующего теста не просто
поиграйтесь со свойством this.ScenarioContext, точно не помню, возможно this.ScenarioContext.StepContext.StepInfo.Text
содержит описание текущего степа
описание ок, а результат по нему?
Окончательный вариант:
[BeforeStep]
public void LogStep()
{
log.Debug(StepContext.StepInfo.Text);
}
......................................................................................
[AfterStep]
public void ErrorLog()
{
if (this.ScenarioContext.TestError != null)
{
log.Debug(this.ScenarioContext.TestError.Message);
}
}
В VS можно нажать клавишу F12 и посмотреть доступные свойства и методы у объекта,
например this.ScenarioContext:
public class ScenarioContext : SpecFlowContext
{
private static bool isCurrentDisabled;
private static ScenarioContext current;
private readonly ITestObjectResolver testObjectResolver;
public static ScenarioContext Current
{
get
{
if (ScenarioContext.isCurrentDisabled)
throw new SpecFlowException("The ScenarioContext.Current static accessor cannot be used in multi-threaded execution. Try injecting the scenario context to the binding class. See http://go.specflow.org/doc-multithreaded for details.");
ScenarioContext current = ScenarioContext.current;
return ScenarioContext.current;
}
internal set
{
if (ScenarioContext.isCurrentDisabled)
return;
ScenarioContext.current = value;
}
}
public ScenarioInfo ScenarioInfo { get; }
public ScenarioBlock CurrentScenarioBlock { get; internal set; }
public Exception TestError { get; internal set; }
public IObjectContainer ScenarioContainer { get; }
internal TestStatus TestStatus { get; set; }
internal List<string> PendingSteps { get; }
internal List<StepInstance> MissingSteps { get; }
internal Stopwatch Stopwatch { get; }
public ScenarioStepContext StepContext
{
get
{
return this.ScenarioContainer.Resolve<IContextManager>().StepContext;
}
}
internal ScenarioContext(IObjectContainer scenarioContainer, ScenarioInfo scenarioInfo, ITestObjectResolver testObjectResolver)
{
this.ScenarioContainer = scenarioContainer;
this.testObjectResolver = testObjectResolver;
this.Stopwatch = new Stopwatch();
this.Stopwatch.Start();
this.CurrentScenarioBlock = ScenarioBlock.None;
this.ScenarioInfo = scenarioInfo;
this.TestStatus = TestStatus.OK;
this.PendingSteps = new List<string>();
this.MissingSteps = new List<StepInstance>();
}
internal static void DisableSingletonInstance()
{
ScenarioContext.isCurrentDisabled = true;
Thread.MemoryBarrier();
ScenarioContext.current = (ScenarioContext) null;
}
public void Pending()
{
throw new PendingStepException();
}
public object GetBindingInstance(Type bindingType)
{
return this.testObjectResolver.ResolveBindingInstance(bindingType, this.ScenarioContainer);
}
}
сейчас опробую и отпишу
подход хороший но неясно как выводить TABLE в степах
вот этот тейбл
Я показал направление где искать эти свойства:
ScenarioContext.StepContext.StepInfo.Table
возможно, есть свойство, которое выводит сразу и описание и таблицу(что-то типа toString())
Надо приложить немного усилий и почитать документацию))
дело в том что это свойство представлено как Table обьект, а вывести его в читаемом виде - нужно постараться(
Вот так преобразуется Specflow table to C# объкт
public static class TableHelpers
{
public static Dictionary<string, string> ToDictionaryFromTableWithoutHeader(this Table table)
{
var dictionary = new Dictionary<string, string>();
foreach (var row in table.Rows)
{
dictionary.Add(row[0], row[1]);
}
return dictionary;
}
public static Dictionary<string, string> ToDictionaryFromTableWithHeader(this Table table)
{
var headers = new List<string>(table.Header.ToArray());
var dictionary = new Dictionary<string, string>();
foreach (var row in table.Rows)
{
for (int j = 0; j < row.Count; j++)
{
dictionary.Add(headers[j], row[j]);
}
}
return dictionary;
}
public static List<Dictionary<string, string>> ToListOfDictionaryFromTableWithHeader(this Table table)
{
var headers = new List<string>(table.Header.ToArray());
List<Dictionary<string, string>> result = new List<Dictionary<string, string>>();
foreach (var row in table.Rows)
{
Dictionary<string, string> temp = new Dictionary<string, string>();
for (int j = 0; j < row.Count; j++)
{
temp.Add(headers[j], row[j]);
}
result.Add(temp);
}
return result;
}
public static List<string> SingleColumnToList(this Table table)
{
List<string> result = new List<string>();
foreach (var row in table.Rows)
{
result.Add(row[0]);
}
return result;
}
}
решил сделать немного по другому:
ScenarioContext.Current.StepContext.StepInfo.Table.ToString()
и теперь таблички в красивом виде в тестрейле. всекм спасибо