【问题标题】:Using ITestOutputHelper with Selenium, xUnit and C#将 ITestOutputHelper 与 Selenium、xUnit 和 C# 一起使用
【发布时间】:2021-03-16 16:59:25
【问题描述】:

我最近将一个项目从 NUnit 切换到 xUnit,以便可以使用 ITestOutputHelper 输出到日志。

该项目是一个相当标准的布局

功能文件->步骤类->页面类->帮助类。包括在帮助类中,我们也有 hooks.class。我正在使用 xUnit 跑步者。

所以在我的钩子类中我创建了这个

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 函数? 还是我把它放在了错误的班级?

【问题讨论】:

  • “其他类”是什么意思?步骤定义? Selenium 页面模型?实用程序类?
  • @GregBurghardt,是的,对不起,应该说得更清楚。页面模型类和实用程序类

标签: c# selenium automated-tests xunit specflow


【解决方案1】:

由于你的钩子类已经接受了一个 ITestOutputHelper 对象,你的其他步骤定义只需要做同样的事情。从那时起,它就是老式的依赖注入。

如果您在每个步骤定义类中初始化页面模型和实用程序类,因为 ITestOutputHelper 似乎已在 SpecFlow 的dependency injection framework 中注册,您可以将对帮助器的引用从构造函数传递到构造函数。

例如,将构造函数 arg 和字段添加到步骤定义中:

[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】:

    在另一个开发者的帮助下得到了答案,见下文

    Step 类 TestAppSteps

    using Xunit.Abstractions;
    
    [Binding]
    public sealed class TestAppSteps : TestAppPage
    {
        public TestAppSteps(ITestOutputHelper output) : base(output)
        {
        }
    
        code
    }           
    

    页面类 TestAppPage
    使用 Xunit.Abstractions;

    public class TestAppPage : PageAssertions
    {
    
        public TestAppPage(ITestOutputHelper output) : base(output)
        {
    
        }
        
        code
    }
    

    实用程序类 PageAssertions 使用 Xunit.Abstractions;

    public class PageAssertions : SharedClass
    {
        public PageAssertions(ITestOutputHelper output) : base(output) { }
    
        code inc'
        WriteToReport("Pass: URL is correct");
    }
    

    实用程序类 SharedClass 使用 Xunit.Abstractions;

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

    抽象类输出函数

    使用 Xunit.Abstractions;

    public abstract class OutputFunctions
    {
        protected readonly ITestOutputHelper _output;
    
        public OutputFunctions(ITestOutputHelper output)
        {
            _output = output;
        }
    
        public void WriteToReport(string theMessage)
        {
            _output.WriteLine(theMessage);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-03-17
      • 1970-01-01
      • 2021-02-04
      • 2016-07-21
      • 2016-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-18
      相关资源
      最近更新 更多