Использование ITestOutputHelper с Selenium, xUnit и C#

#c# #selenium #automated-tests #xunit #specflow

#c# #селен #автоматизированные тесты #xunit #specflow

Вопрос:

Недавно я переключил проект с NUnit на xUnit, чтобы ITestOutputHelper можно было использовать для вывода в журнал.

Проект представляет собой довольно стандартный макет

Файлы компонентов-> Классы шагов-> Классы страниц -> Классы справки. Включить в вспомогательные классы мы имеем hooks.class также. Я использую бегун xUnit.

Итак, в моем классе hooks я создал это

 private readonly ScenarioContext _scenarioContext;
private ITestOutputHelper _testOutputHelper;

public Hooks(ScenarioContext scenarioContext, ITestOutputHelper testOutputHelper)
{
    _scenarioContext = scenarioContext;
    this._testOutputHelper = testOutputHelper;
}

public void WriteOutput(string theMessage)
{
    _testOutputHelper.WriteLine(theMessage);
}
 

Теперь мой вопрос в том, как мне получить доступ к функции WriteOutput из других классов?
Или я поместил его не в тот класс?

Комментарии:

1. Что вы подразумеваете под «другими классами»? Определения шагов? Модели страниц Selenium? Служебные классы?

2. @GregBurghardt, да, извините, следовало бы пояснить. Классы модели страницы и служебные классы

Ответ №1:

Поскольку ваш класс hooks уже принимает объект ITestOutputHelper, ваши другие определения шагов должны делать только то же самое. С этого момента это просто старая добрая инъекция зависимостей.

Если вы инициализируете модели страниц и служебные классы в каждом классе определения шага, поскольку кажется, что ITestOutputHelper уже зарегистрирован в среде внедрения зависимостей SpecFlow, вы можете просто передавать ссылки на помощника из конструктора в конструктор.

Например, добавьте аргумент конструктора и поле в определение шага:

 [Binding]
public class LoginSteps
{
    private ITestOutputHelper testOutputHelper;
    private LoginPage loginPage;
    private SomeUtility utility;

    public LoginSteps(IWebDriver driver, ITestOutputHelper testOutputHelper)
    {
        this.testOutputHelper = testOutputHelper;

        // Pass the test output helper to a page model
        loginPage = new LoginPage(driver, testOutputHelper);

        // Pass the test output helper to a utility class
        utility = new SomeUtility(testOutputHelper);
    }

    [Given(@"the user is logged in as ""(.*)"")")]
    public void GivenTheUserIsLoggedInAs(string username)
    {
        testOutputHelper.WriteLine("...");
        loginPage.LogIn(username);
    }
}
 

Тогда для модели страницы и служебного класса требуются аргументы и поля конструктора:

 public class LoginPage
{
    private IWebDriver driver;
    private ITestOutputHelper testOutputHelper;

    public LoginPage(IWebDriver driver, ITestOutputHelper testOutputHelper)
    {
        this.driver = driver;
        this.testOutputHelper = testOutputHelper;
    }

    // ...
}

public class SomeUtility
{
    private ITestOutputHelper testOutputHelper;

    public SomeUtility(ITestOutputHelper testOutputHelper)
    {
        this.testOutputHelper = testOutputHelper;
    }

    // ...
}
 

Ответ №2:

С помощью другого разработчика получил ответ, см. Ниже

Пошаговый класс TestAppSteps

 using Xunit.Abstractions;

[Binding]
public sealed class TestAppSteps : TestAppPage
{
    public TestAppSteps(ITestOutputHelper output) : base(output)
    {
    }

    code
}           
 

Класс страницы
TestAppPage с использованием Xunit.Абстракции;

 public class TestAppPage : PageAssertions
{

    public TestAppPage(ITestOutputHelper output) : base(output)
    {

    }
    
    code
}
 

Проверка страниц служебного класса с
использованием Xunit.Абстракции;

 public class PageAssertions : SharedClass
{
    public PageAssertions(ITestOutputHelper output) : base(output) { }

    code inc'
    WriteToReport("Pass: URL is correct");
}
 

Общий класс служебного класса с
использованием Xunit.Абстракции;

 public abstract class SharedClass : OutputFunctions
{
    public SharedClass(ITestOutputHelper output) 
        : base(output)
    {
    }
    
    shared code including
    WriteToReport(GetTheCurrentMethod());
}   
 

Функции вывода абстрактного класса

использование Xunit.Абстракции;

 public abstract class OutputFunctions
{
    protected readonly ITestOutputHelper _output;

    public OutputFunctions(ITestOutputHelper output)
    {
        _output = output;
    }

    public void WriteToReport(string theMessage)
    {
        _output.WriteLine(theMessage);
    }
}