【发布时间】:2017-06-28 14:25:26
【问题描述】:
最初我为我的 SpecFlow-C# 自动化测试使用单步定义,但当它变得太长(约 2K 行)时,我尝试将其分解为更小的部分。
我使用了一个基础来处理我的钩子(BeforeTestRun、BeforeScenario、AfterScenario、AfterTestRun),初始化驱动程序和日志记录。 在 BeforeTestRun 中,我解析了一个配置文件以检查我想在哪个浏览器上运行我的测试,并在 BeforeScenario 中基于它来初始化驱动程序。所以是这样的:
[Binding]
public class TestBase
{
protected TestBase()
{}
protected IWebDriver mDriver;
private static log4net.ILog mLogger;
private static string mCurrentBrowser;
[BeforeTestRun]
protected static void BeforeTestRun()
{
//Set up the logging and parse config file, give mCurrentBrowser a value
}
[BeforeScenario]
protected void InitTest()
{
if ( mCurrentBrowser == "chrome" )
{
mDriver = new ChromeDriver();
}
}
//And so on
}
我还有一个 CoreObjects 类,其中包含我的所有/大部分步骤定义文件使用的辅助方法。它继承自 TestBase。有趣的是:
public class CoreObjects : TestBase
{
protected CoreObjects( IWebDriver aDriver )
{
mDriver = aDriver;
}
// The rest of the class is helper methods
// and private member variables used by a couple of helper methods
// or protected member variables used by the step definitions
}
并且有8-10个步骤定义文件。这些看起来像以下示例:
[Binding]
public class SampleStepDefClass : CoreObjects
{
protected SampleStepDefClass ( IWebDriver aDriver )
: base( aDriver )
{ }
[When( @"I do something" )]
private void DoSomething( string aUrl )
{
mDriver.Url = aUrl;
Thread.Sleep( 800 );
string lCurrentUrl = mDriver.Url;
Assert.IsTrue( lCurrentUrl.Contains( aUrl ) );
}
}
还有一个静态类可以启动另一个静态驱动程序并执行一些前置条件操作,但这应该不是问题,这是一个完全独立的过程。 当我尝试通过 Visual Studio 2015 运行 SpecFlow 场景时,前置条件类中的前置条件静态 other-driver 可以很好地执行其方法(它在 BeforeTestRun 挂钩中调用)。但是当具体测试应该运行时,它只是打开和关闭浏览器(我的 mDriver)。
当我作为 Debug SpecFlow 场景运行时,前置条件运行良好,但随后(我使用 F11 逐步运行它以进入代码行)调试器跳转到我的第二个场景的第一步并抛出异常:
An exception of type 'BoDi.ObjectContainerException' occurred
in TechTalk.SpecFlow.dll but was not handled in user code
Additional information: Interface cannot be resolved:
OpenQA.Selenium.IWebDriver (resolution path: MyNamespace.MyFirstStepDefClass)
当我使用完全相同的方法和变量,但只在 TestBase 上使用绑定和(只有一个)StepDefinition 文件时,我的所有测试都工作得很好。 我有一种感觉,要么是继承,要么是构造函数把它搞砸了,但我对 C# 和 SpecFlow 还是很陌生,所以卡住了:-/ 除了我可能需要创建 ObjectContainer 的实例,并在其上调用 RegisterInstanceAs 函数并将驱动程序作为参数传递之外,真的找不到任何东西。但要么我做错了,要么这不是解决方案。
谢谢!
【问题讨论】:
标签: c# exception selenium-webdriver nunit specflow