我正在建立一个SpecFlow项目来测试门户。到目前为止,我还没有编写一些“ hello world”功能和步骤的问题。我的问题是,随着测试项目的发展,使功能在一组浏览器上运行的最佳方法是什么?

以下是我已经提出或看到的一些解决方案示例:在线:


可以将每个浏览器作为示例传递给Scenerio(源),但这似乎会使Scenerio膨胀。
我研究了Tag和BeforeScenerio挂钩,但这不允许对多个浏览器进行测试,因为不会针对每个标签执行这些步骤。
在静态帮助器中设置驱动程序集并根据您要运行的代码来对代码进行注释/未注释(来源)。我可能不会在代码中将其注释掉,而是将其抽象到一些Setting / Factory类中。虽然仍然是代码更改。
在上面的选项之后,可以在构建变量(#if IETESTING等)上选择驱动程序,但是我想我曾经遇到过一些声明,声称这些声明可以被视为反-patterns。

我的最终想法是,在大多数情况下,不应更改功能/ Gerkin文件以测试不同的浏览器,因为大多数功能都不需要浏览器要求(例外可能是较新的HTML5 API及其后备)。我相信,如果它们受编译后可以应用的某些配置的控制会更好,但是我不清楚如何最好地完成此操作。

Hello World

#1 楼

看来NUnit http://www.nunit.org/index.php?p=testFixture&r=2.5现在支持参数化测试装置。这可能使您可以创建可以满足您需要的测试。这个SO答案对于NUnit硒测试也有类似的问题。

https://stackoverflow.com/questions/5028926/run-selenium-tests-in-multiple-browsers-one-after-another- from-c-sharp-nunit

您可能会看到是否修改了SpecFlowFeature1Steps.cs并运行它以查看会发生什么。

[TestFixture(typeof(FirefoxDriver))]
[TestFixture(typeof(InternetExplorerDriver))]
public class TestWithMultipleBrowsers<TWebDriver> where TWebDriver : IWebDriver, new()
{
    private IWebDriver driver;

    [SetUp]
    public void CreateDriver () {
        this.driver = new TWebDriver();
    }


我一定会问自己,Specflow是否适合进行多浏览器测试。

评论


这是我在Specflow之前的解决方案,但是由于实际的NUnit TestFixture是由Specflow生成的,所以我还没有找到将其集成到解决方案中的方法。

–Paul DelRe
13年2月26日在13:39

对于您对多浏览器测试的正确位置的最终评论,我会感兴趣。

–Paul DelRe
13年2月26日在13:39

我对人们为什么会对此表示质疑很感兴趣,因为它似乎并没有真正解决问题(如书面所言)-SpecFlow生成了TestFixtures,并且在给定场景下如何从此处转到多个浏览器尚不清楚。有没有办法找到我看不到的解决方案?

–本
14-10-13在10:08



猜我在过去的20个月,因为这是一个很好的答案(经过深思熟虑并撰写了研究报告),但不是解决方案(没有这样标记)。

–Paul DelRe
2014年10月14日14:21

#2 楼

解决此问题的一种方法是在每个功能的开头都执行一个给定步骤

Given I am using <browser>
And I am on the Homepage 
And I click on the Logon Link
Then I am taken to the Logon Page 



Examples:
|browser|
|Chrome|
|Firefox|
|etc|


然后我有一个“之前和之后”方案,用于配置每个浏览器并完成清理

[BeforeScenario]
        public void ConfigureChrome()
        {
            var chromeDriver = new ChromeDriver();

            // Configure here
            //ConfigureDriver(chromeDriver);
            chromeDriver.Manage().Window.Position = new System.Drawing.Point(2192, -963);
            chromeDriver.Manage().Window.Maximize();

            var chromeDriverWait = new WebDriverWait(chromeDriver, TimeSpan.FromSeconds(20));

            ScenarioContext.Current[WebDriverType.Chrome.ToString()] = chromeDriver;
            ScenarioContext.Current[$"{WebDriverType.Chrome.ToString()}-Wait"] = chromeDriverWait;
        }

        [AfterScenario]
        public void CleanUpChrome()
        {
            var driver = (IWebDriver) ScenarioContext.Current[WebDriverType.Chrome.ToString()];


            driver.Quit();
        }

        [BeforeScenario]
        public void ConfigureFirefox()
        {
            var firefoxDriver = new FirefoxDriver();

            // Configure here
            //ConfigureDriver(firefoxDriver);


            ScenarioContext.Current[WebDriverType.Firefox.ToString()] = firefoxDriver;
        }

        [AfterScenario]
        public void CleanUpFirefox()
        {
            var driver = (IWebDriver)ScenarioContext.Current[WebDriverType.Firefox.ToString()];


            driver.Quit();
        }


然后定义了我的给定步骤

[Given(@"I am using (.*)")]
        public void GivenIAmUsingBrowser(
      string browser)
        {
            WebDriverType driverType;

            if (!Enum.TryParse(browser, out driverType)) throw new InvalidOperationException("Invalid driver");

            ScenarioContext.Current.Add("driver", ScenarioContext.Current[browser.ToString()]);
            ScenarioContext.Current.Add("driverWait", ScenarioContext.Current[$"{browser.ToString()}-Wait"]);
        }


虽然这并不理想我正在研究是否有解决此问题的替代方法,这是我们设法开始工作的一种解决方法。

#3 楼

我为此苦苦挣扎,最终我要做的是为不同的浏览器生成不同的测试,以至于我希望可重复性在当前框架和浏览器功能范围内并不可行。您将在跨浏览器支持中发现的最大问题是必须处理按钮,单击和键。在IE,Chrome或Firefox中,输入不能始终如一地工作。查找页面元素也将有所不同,因为CSS在浏览器中的处理方式也有所不同。

我偶尔会寻找您注意到的选项,但我个人发现我需要为功能设置例外以及浏览器类型会使我的测试代码过于膨胀,因此我使用SpecFlow来限制我的步骤,并在必要时根据浏览器的特定处理分为不同的部分。对于管理重复的我来说,我仍然需要进行有效的测试。