C# 如何在其他场景之前运行登录场景

C# 如何在其他场景之前运行登录场景,c#,selenium,specflow,C#,Selenium,Specflow,我有两个特点 登录 登录后访问主页 单击主页上的链接 登录后访问主页 我已经在两个不同的文件以及步骤定义中实现了这两个特性 我想实现这个测试,以便在特性2和3之前调用登录特性 我听说过之前和之后的场景挂钩 using OpenQA.Selenium; using OpenQA.Selenium.Chrome; using System; using TechTalk.SpecFlow; namespace SpecFlowUiAutomation { [Binding] pub

我有两个特点

  • 登录
  • 登录后访问主页
  • 单击主页上的链接
  • 登录后访问主页

    我已经在两个不同的文件以及步骤定义中实现了这两个特性

    我想实现这个测试,以便在特性2和3之前调用登录特性

    我听说过之前和之后的场景挂钩

    using OpenQA.Selenium;
    using OpenQA.Selenium.Chrome;
    using System;
    using TechTalk.SpecFlow;
    
    namespace SpecFlowUiAutomation
    {
        [Binding]
        public class LoginHooks
        {
            [Before (Order =5)]
            public void LoginToTheSite(ScenarioContext context)
            {
                Console.WriteLine("[BeforeScenario] - Login to the site");
            }
    
            [After (Order =5)]
            public void LogoutOfTheSite(ScenarioContext context)
            {
                Console.WriteLine("[After Scenario] - Logout of the site");
            }
        }
    }
    
    如果我要实现这样一个钩子,那么我似乎是在以硬编码的方式复制登录特性


    是否有更好的方法为其他两个功能建立登录功能的依赖关系?

    事实上,登录是许多场景的先决条件。在小黄瓜中,先决条件表示为给定的步骤。从行为的角度来看,登录是一个至关重要的步骤,应该在您的场景中捕获。因此,您需要在场景中为用户登录提供一个

    Scenario: ...
        Given the user is logged in as "..."
        When I do the thing
        Then the result is correct
    
    如果你已经这样做了,那么你是正确的。这个最小的“重复”量被认为是可以接受的,因为这个步骤对于场景来说是多么重要


    每次登录还可以确保用户在服务器上有一个新的会话,这有助于防止由于先前用例中的会话中可能缓存的数据而导致的错误故障或传递。

    使用像@alreadyLoggedIn这样的标记会有同样的效果吗?在这种情况下,我不确定用户详细信息的参数化将如何输入,无论您使用标记还是显式步骤,您的场景都需要知道用户是否登录。你说得对,如果没有专门设置各种形式用户帐户的步骤,用户详细信息很难模拟。我正在使用Nunit。在Nunit中,测试顺序的执行取决于字母顺序。所以我添加了像s1,s2,s3这样的标签。。。在功能文件中的场景之前。这一点与预期相符。不是:这可能不是正确的解决方案